Euler V1
- Техника
- Donation Attack
- Классификация
- Token & Share Accounting
- Тип цели
- DeFi Protocol
- Затронутые сети
- Ethereum
- Источник
- Нет публичной ссылки на источник
13 марта 2023 года атакующий вывел из Euler Finance, безразрешительного кредитного протокола на Ethereum, около $197 млн — в производных стейкинг-ETH, WBTC, USDC и DAI. Атака не задействовала ни мост, ни оракул, ни чужой код: уязвимость лежала в собственной логике протокола, в функции доната в резервы, что делает этот случай одним из крупнейших чисто «протокольных» инцидентов того периода (Chainalysis).
Как устроена атака
Euler позволял заёмщикам держать позиции с плечом и избыточным залогом, а отдельно — любому желающему «донатить» свои токены депозита (eTokens) в резервы протокола. Функция задумывалась как жест доброй воли без очевидной пользы для атакующего — кроме одной детали: она сжигала eTokens, не трогая привязанные к ним долговые токены (dTokens), и не проходила через проверку платёжеспособности («health check»), обязательную для займа, вывода и перевода.
Атакующий взял флэш-займ примерно на $30 млн в DAI на Aave, чтобы профинансировать два связанных контракта (Chainalysis). Один набрал крупный баланс eTokens через заём с плечом; затем атакующий вызвал функцию доната, стерев баланс eTokens и оставив нетронутым соответствующий долг, — позиция на бумаге мгновенно стала неплатёжеспособной: залога нет, долг остался (Rekt). Поскольку функция доната ни разу не вызывала проверку платёжеспособности, транзакция не откатывалась.
Второй, подконтрольный атакующему контракт ликвидировал эту уже «неплатёжеспособную» позицию. Механизм ликвидации в Euler платит ликвидатору скидку на изъятый залог — в норме это защита протокола от недостачи резервов, здесь — дыра: внутренний учёт по-прежнему видел залог как доступный к изъятию, хотя его только что «пожертвовали». Повторив это по пулам WBTC, стейкинг-ETH, USDC и DAI, атакующий забрал реальные депозиты других пользователей, а не только заёмный капитал. Это и есть механика, которую в нашей базе обозначили как «Flashloan Donate Function Logic Exploit»; в публикациях того времени чаще встречались формулировки «donation attack» или «флэш-займ-атака на функцию доната в резервы» — тот же эксплойт, разные названия одной пропущенной проверки.
Что было дальше
TVL Euler за несколько часов упал примерно с $264 млн до $10 млн (Rekt). 16 марта команда объявила награду в $1 млн за информацию, ведущую к идентификации атакующего (DailyCoin); часть похищенного к тому моменту уже прошла через Tornado Cash, а часть — через адреса, ранее связанные с группой Lazarus, что на время подняло, а затем сняло подозрения о причастности связанной с государством группы (Chainalysis). Sherlock, страховщик Euler на блокчейне, выплатил пострадавшим $4,5 млн промежуточных компенсаций (Rekt).
Вместо того чтобы скрыться, атакующий начал возвращать средства траншами с 18 марта, а 28 марта отправил извинение через ончейн-сообщение, подписавшись «Jacob» (DailyCoin) — перед тем как 3–4 апреля 2023 года пришёл финальный перевод. Euler Labs заявила, что «все возвращаемые средства» получены обратно (Silicon Republic). Точная итоговая цифра в источниках расходится (см. примечание о расхождении к этому инциденту): часть изданий прослеживает переводы в казну Euler на сумму около $177 млн — за вычетом баунти, которое команда предлагала оставить атакующему, — тогда как сама Euler описывает исход как полное восстановление $197 млн (The Block). Ни ареста, ни уголовного преследования по этому делу в проверенных источниках не подтверждено. Сам протокол не прекратил существование: разработка продолжилась, и позже Euler выпустил переработанную архитектуру.
Что из этого следует
- Любая функция, меняющая баланс залога или долга пользователя, входит в периметр проверки платёжеспособности — не только займ, вывод и ликвидация. «Донат в резервы» выглядит безобидно, пока не используется для рассинхронизации учёта залога и долга.
- Флэш-займ здесь был усилителем капитала, а не самой уязвимостью. Называть это «флэш-займ-атакой» — упускать суть: заём лишь довёл уже существующий логический разрыв до масштаба, который стало выгодно эксплуатировать.
- Функции, добавленные после исходного аудита протокола, по умолчанию не наследуют его покрытие. Именно в параметрах и точках входа, пристроенных позже, в DeFi-инцидентах регулярно обнаруживается недотестированная логика.
- Почти полный возврат средств в этом случае — исключение, а не норма для DeFi-взломов: он зависел от того, что средства атакующего остались отслеживаемыми, и от дорогих, не гарантированных переговоров. Закладывать в оценку риска протокола сценарий «взлом развернут обратно» не стоит.
On-chain DeFi несёт риск смарт-контрактов. Держите основные средства на регулируемой бирже.