Skip to content
Yieldo

Badger DAO

$120.0M
Украдено средств
Возвращено средств
02 Dec 2021
Дата инцидента
Техника
CDN Compromise
Классификация
Frontend & Infrastructure
Тип цели
DeFi Protocol
Затронутые сети
Ethereum
Источник
Нет публичной ссылки на источник

2 декабря 2021 года около 00:00 UTC злоумышленник начал выводить средства из кошельков пользователей BadgerDAO — агрегатора доходности на Ethereum, ориентированного на биткоин-активы. За два часа двадцать минут, пока команда не поставила на паузу все вызовы смарт-контрактов, пострадало более 500 адресов: были выведены wBTC и другие ERC-20-токены. Сам протокол в собственном постмортеме оценил валовый ущерб примерно в $130 млн, из которых около $9 млн так и не покинули хранилища Badger (CoinDesk). Атака не затронула ни строчки кода смарт-контрактов Badger — был скомпрометирован сайт, через который к ним обращались пользователи.

Как устроена атака

Точкой входа стал аккаунт BadgerDAO в Cloudflare — сервисе, через который работал app.badger.com. Согласно собственному постмортему Badger, атакующий получил «скомпрометированный API-ключ, созданный без ведома и авторизации инженеров Badger», и с его помощью внедрил вредоносный JavaScript-фрагмент прямо в рабочий фронтенд. По данным Rekt.news, этот код провисел на сайте почти две недели, прежде чем сработал против большинства жертв.

Скрипт не показывал пользователям явно подозрительную транзакцию. Вместо этого он незаметно подмешивался к обычным операциям — депозиту или клейму наград, которые люди и так собирались подписать, — добавляя к ним вызов функции токена increaseAllowance(). Подписывая с виду рутинную транзакцию Badger, пользователь заодно выдавал адресу атакующего неограниченное разрешение распоряжаться своими wBTC и другими токенами (Vice). Поскольку код отдавался с настоящего, корректно подписанного домена Badger, привычные проверки — замочек в браузере и адресная строка — для большинства ничего необычного не показывали; заметить подвох можно было только вчитавшись, какое именно разрешение запрашивается — неограниченный approve, а не обычный перевод с суммой.

Когда достаточное число кошельков обзавелось отравленным разрешением, атакующий один за другим вызывал transferFrom(), выводя токены, пока команда не заметила паттерн опустошаемых счетов и не заморозила все вызовы контрактов — это произошло примерно через два часа двадцать минут после начала атаки.

Что было дальше

Badger отозвал скомпрометированный API-ключ, сменил учётные данные Cloudflare и привлёк к расследованию компанию по реагированию на инциденты Mandiant вместе с аналитической компанией Chainalysis — трассировать средства и восстановить картину атаки. О произошедшем были уведомлены правоохранительные органы США и Канады, которые подключились к работе по возврату средств. Из заявленных ~$130 млн, списанных по выданным разрешениям, около $9 млн фактически не были выведены из хранилищ Badger и остались под контролем протокола — остальное ушло на адреса атакующего. Ни в одном из изученных источников не встречается упоминания об установлении личности атакующего, аресте, переговорах о возврате средств или выплате баунти: судя по публичным материалам, дело осталось нераскрытым. Доступные материалы не фиксируют, возобновил ли протокол работу в прежнем виде и на каких условиях.

Что из этого следует

  • Любой DeFi-продукт с веб-интерфейсом зависит от безопасности обычной веб-инфраструктуры — CDN, DNS, хостинг-аккаунтов, — а не только от аудита своих контрактов. Чистый аудит Solidity ничего не говорит о том, можно ли доверять сайту, который отдаёт интерфейс к этому контракту.
  • Именно этот приём — скрытый вызов, прицепленный к легитимной транзакции, — обходит проверку домена, на которую пользователей обычно учат полагаться: вредоносный код отдавался с настоящего, корректного сайта. Единственная надёжная защита — читать, что именно кошелёк просит авторизовать перед подписью, а не только сверять URL.
  • Инструментом атаки стали именно неограниченные разрешения на токены: одна подпись — и неограниченный доступ на будущее. Периодический отзыв старых approve или использование интерфейсов, запрашивающих разрешение с потолком по сумме вместо безлимитного, ограничивает то, сколько способен вывести скомпрометированный фронтенд за раз.
  • Инцидент перевёл гигиену аккаунта CDN/edge-провайдера — скоуп API-ключей, двухфакторную аутентификацию, ротацию ключей — в ту же категорию риска, что и аудит смарт-контрактов, для команд, эксплуатирующих пользовательские DeFi-интерфейсы.

On-chain DeFi несёт риск смарт-контрактов. Держите основные средства на регулируемой бирже.