Захват управления и поддельные сообщения: два инцидента на $9,42 млн

Расследование «КоинКит» анализирует, как именно сработали обе атаки и куда ушли средства.
Введение
Межсетевой мост — это сервис, который позволяет переводить криптовалюту из одного блокчейна в другой. Обычно он работает по принципу блокировки: токены замораживаются в одной сети, и только тогда выпускаются в другой.
Система управления (governance) — это механизм, при котором держатели специальных токенов голосуют за изменения в протоколе. Например, за то, куда направить средства или как обновить код.
The Sandbox — фальшивые сообщения через межсетевой мост
Ход инцидента
1. Злоумышленник воспользовался функцией approveAndCall в контракте токена SAND. Эта функция обычно нужна, чтобы одобрить трату токенов и сразу вызвать другой сервис. Атакующий указал в качестве сервиса адрес LayerZero Endpoint — это технология, которая передаёт сообщения между блокчейнами.
2. Проблема в том, что при таком вызове внешний сервис видел отправителем не самого злоумышленника, а контракт токена SAND. Поэтому вызов setDelegate — функции, которая назначает управляющего мостом — прошёл от имени самого токена. Система посчитала, что токен сам назначил нового управляющего.
3. Получив роль delegate (управляющего), злоумышленник изменил настройки проверки входящих сообщений. После этого любое поддельное сообщение из другой сети проходило проверку и передавалось контракту.
4. Контракт, получив ложное сообщение, считал, что в другой сети реальные токены SAND заблокированы, и выпускал новые токены в сети Base и BNB Smart Chain. Было зафиксировано более 400 транзакций и номинальный выпуск на ~$49 млрд. Но реальной ликвидности для продажи такого объёма не существовало.
5. Параллельно атакующий вывел реальные токены из адаптера SAND на Ethereum. Продав их через несколько децентрализованных бирж (DEX), он получил WETH — это «обёрнутый» эфириум, токен-версия ETH, которую удобно использовать в смарт-контрактах.
6. Команда The Sandbox подтвердила выпуск необеспеченных токенов, отключила мосты в обеих сетях и изолировала находившиеся там активы. Пользовательские кошельки, по заявлению проекта, не пострадали.
Почему это стало возможным
Ошибка находилась в реализации токена SAND для работы в нескольких сетей (стандарт OFT), а не в базовых контрактах LayerZero. Функция
approveAndCall позволяла вызвать внешний контракт от имени самого токена. Это дало возможность выполнить привилегированную команду setDelegate, которая обычно доступна только самому контракту.Детали расследования: движение средств
Атакующий продал похищенные и выпущенные SAND через несколько DEX за WETH. Все средства были собраны на Ethereum-адресе:
Term Finance — захват голосов и отключение защиты
Ход инцидента
1. Злоумышленник приобрёл специальные «обёрнутые» доли tmvETH в хранилище ETH Meta Vault. Эти доли дают право голоса в системе управления. Поскольку таких участников было очень мало, небольшая покупка обеспечила атакующему 90,66% всех голосов.
2. Через связанный контракт он создал предложение №5 и самостоятельно проголосовал за него.
3. Параллельно другой контракт внёс по 5 USDC в пять отдельных USDC-хранилищ и получил 100% голосов в каждом из них. Это стало возможно, потому что в этих хранилищах никто другой не оборачивал свои депозиты в управляющие токены.
3. 23 августа предложения обнулили timelock — это защитная пауза, которая обычно даёт пользователям время отреагировать на подозрительные изменения. Задержка была установлена на ноль.
4. В ETH-ветке средства вернули из четырёх обычных инвестиционных стратегий, направили в промежуточный контракт и перевели на адрес злоумышленника — всего 2 841,74 WETH.
5. В USDC-ветке контракты, которые проверяли стоимость залоговых токенов, были заменены на поддельные. После этого пять хранилищ заплатили за фиктивный токен 1 679 639 USDC.
Почему это стало возможным
Голосовать могли только владельцы обёрнутых LP-долей, а таких участников почти не было. Кворум рассчитывался не от всех депозитов, а только от эмиссии этих специальных токенов. Поэтому минимальные вложения позволили получить абсолютное большинство голосов.
Детали расследования: движение средств
Для финансирования атаки обе ветки получили по 1 ETH из Tornado Cash — сервиса, который скрывает источник средств. Всего было использовано 2 ETH.
После вывода WETH был развёрнут обратно в обычный ETH, а USDC обменян примерно на 1,68 млн DAI — другой стейблкоин, привязанный к доллару. Все средства были собраны на адресе:
Заключение
Инциденты в The Sandbox и Term Finance показали две разные, но одинаково опасные слабости: доверие к внешним сообщениям без проверки реального баланса и концентрация управления в руках нескольких участников.
В The Sandbox комбинация двух штатных функций —
approveAndCall и авторизация по адресу отправителя — позволила захватить контроль над мостом. В Term Finance отсутствие минимального порога для создания предложений и зависимость timelock от захваченного модуля управления сделали защиту бесполезной.

