13 марта 2023 года наша система зафиксировала, что пул кредитования Euler Finance подвергся атаке с использованием мгновенного займа (flash loan), в результате которой были потеряны 197 миллионов долларов. Сначала мы оповестили сообщество, а затем предоставили анализ, чтобы помочь определить первопричину.
1/ @eulerfinance атакован. Первопричина заключается в отсутствии проверки ликвидности в функции donateToReserves()https://t.co/stWtPWK900
— BlockSec (@BlockSecTeam) 13 марта 2023 г.
Подробные шаги атаки смотрите ниже. https://t.co/bm10OJHiXu pic.twitter.com/TDbYuzVWHe
Первопричиной этого инцидента стало отсутствие проверки неплатежеспособности в функции donateToReserves(). В частности, уязвимый контракт содержит функционал, позволяющий пользователям передавать свое обеспечение протоколу в качестве пожертвования без проверки того, является ли позиция пользователя платежеспособной. Хуже того, чтобы избавиться от этой «плохой» позиции, протокол предлагал ликвидаторам большую скидку, позволяя им гасить долг для ликвидации этой позиции с меньшими затратами. Злоумышленник создал крупную позицию и сделал её неплатежеспособной, воспользовавшись этой функциональностью. Затем он смог выкупить свое обеспечение со скидкой для получения прибыли.
Справочная информация
Обзор Euler Finance
Euler Finance — это протокол кредитования в сети Ethereum, который позволяет пользователям одалживать и занимать определенные токены. Когда кредиторы вносят средства в пул ликвидности Euler, им начисляется соответствующее количество EToken (процентных токенов стандарта ERC20). Эти EToken можно обменять на внесенные базовые активы.
С другой стороны, заемщики, которые получают ликвидность, получают DToken. Эти DToken соответствуют стандарту ERC20 и не позволяют владельцам самостоятельно «сжигать» их. В частности, вместо того чтобы позволить отправлять токены кому угодно, их может забрать любой, но для их принятия требуется подтверждение. Что касается базового актива, заемщики несут ответственность за выплату процентов по своим кредитам, и часть этих процентов используется для покрытия безнадежных долгов протокола.
Механизмы заемного кредитования (так называемый «самозаем») и мягкой ликвидации (soft liquidation) Euler Finance — это две ключевые концепции, которые помогают лучше понять причину этой атаки.
Заемное кредитование (Leverage Borrow)
Euler Finance предоставляет функцию заемного кредитования, которая позволяет пользователям моделировать стратегию рекурсивного заимствования. Проще говоря, пользователи могут внести обеспечение и выпустить EToken, которые затем можно использовать в качестве залога для получения большего количества EToken. Контракт также выпустит соответствующее количество dToken в качестве долговых токенов. Состояние позиции пользователя рассчитывается на основе стоимости EToken и dToken. Согласно документации Euler Finance, пользователи могут использовать кредитное плечо до 19x. Функция заемного кредитования сыграла решающую роль в этом инциденте. Без её использования злоумышленник не смог бы получить прибыль. Благодаря заемному кредитованию атакующий увеличил размер своей позиции почти в 11 раз по сравнению с первоначальными средствами, полученными через мгновенный заем.
Мягкая ликвидация (Soft Liquidation)
Как указано в whitepaper Euler Finance, механизм мягкой ликвидации позволяет ликвидаторам помогать ликвидируемой стороне гибко погашать свой долг, вместо того чтобы ограничиваться фиксированным коэффициентом ликвидации, как это принято в таких протоколах, как Compound и Aave. Мягкая ликвидация означает, что чем ниже состояние позиции, тем большая часть обеспечения подлежит ликвидации — до 75% в случае безнадежного долга, согласно данным этого инцидента. Таким образом, ликвидация обеспечения со значительной скидкой позволила злоумышленнику погасить мгновенный заем и получить прибыль.
Анализ уязвимости
Основная уязвимость, а именно отсутствие проверки неплатежеспособности, существует в функции donateToReserves(), которая используется пользователями для передачи EToken со своих позиций в резерв протокола в качестве пожертвований. У обычных пользователей, как правило, нет стимула или мотивации совершать такое действие. Фактически уязвимость заключается в том, что функция donateToReserves() не выполняет проверку состояния (health check) при выводе EToken с позиций пользователей. Это позволяет злоумышленникам напрямую жертвовать EToken из большой позиции, созданной с помощью заемного кредитования, в результате чего состояние позиции падает ниже 100%, что приводит к появлению безнадежного долга.

Согласно дизайну, Euler Finance использует динамический коэффициент закрытия для «мягкой ликвидации» позиций. Короче говоря, чем менее «здорова» позиция, тем большая доля обеспечения в этой позиции может быть ликвидирована. В случае безнадежного долга процент ликвидации может доходить до 75% от обеспечения в позиции (как было рассчитано на основе фактической транзакции атаки). В результате значительный объем ликвидированного обеспечения со скидкой позволяет злоумышленнику погасить мгновенный заем и получить прибыль.
Анализ атаки
Существует несколько транзакций атаки, нацеленных на разные пулы:
- 0xc310a0affe2169d1f6feec1c63dbc7f7c62a887fa48795d327d4d2da2d6b111d (DAI)
- 0x71a908be0bef6174bccc3d493becdfd28395d8898e355d451cb52f7bac38617 (WBTC)
- 0x62bd3d31a7b75c098ccf28bc4d4af8c4a191b4b9e451fab4232258079e8b18c4 (wstETH)
- 0x465a6780145f1efe3ab52f94c006065575712d2003d83d85481f3d110ed13d9 (USDC)
- 0x3097830e9921e4063d334acb82f6a79374f76f0b1a8f857e89b89bc58df1f311 (stETH)
- 0x47ac3527d02e6b9631c77fad1cdee7bfa77a8a7bfd4880dccbda5146ace4088f (WETH)
Шаги атаки следующие (на примере первой транзакции атаки):
- Злоумышленник берет взаймы 30 млн DAI в AAVE через мгновенный заем.
- Злоумышленник вносит 20 млн DAI и получает обратно 20 млн eDAI.
- Поскольку Euler Finance предоставляет возможность заемного кредитования, злоумышленник может выпустить 195 млн eDAI и 200 млн dDAI. Теперь у него 215 млн eDAI и 200 млн dDAI.
- Процесс продолжен: 10 млн долга было погашено, чтобы злоумышленник мог выпустить больше eDAI. Теперь у него 410 млн eDAI и 390 млн dDAI.
- Шаг 3 был повторен. Теперь у атакующего 410 млн eDAI и 390 млн dDAI.
- Злоумышленник вызвал функцию donateToReserve, чтобы пожертвовать 100 млн eDAI. Однако в процессе этого фактор состояния (health factor) атакующего не проверялся. В этом случае позицию теперь можно ликвидировать (310 млн eDAI против 390 млн dDAI), что дает шанс получить прибыль.
- Злоумышленник ликвидировал позицию, используя другой адрес контракта в качестве ликвидатора (0xa0b3...). Ликвидатор (0xa0b3...) получил 310 млн eDAI и 259 млн dDAI.
- Злоумышленник сжег 38,9 млн eDAI, чтобы вывести 38,9 млн DAI (больше вывести нельзя из-за проверок неплатежеспособности) на позиции ликвидатора (0xa0b3...).
- Злоумышленник погасил мгновенный заем.
Ключевые шаги атаки 2–7 отмечены на трассировке транзакции.

Резюме
Это был крупнейший взлом в 2023 году с рекордной суммой украденных средств — 197 миллионов долларов. Его совершил 20-летний аргентинец Федерико Хайме, который представил СМИ «запутанную, местами сбивчивую и даже противоречивую историю». Тем не менее, «все возвратные средства» были позже возвращены на адрес казначейства Euler Finance. Однако небольшая часть (около 200 тысяч долларов) была «невольно» отправлена группе Lazarus — предполагаемому северокорейскому преступному синдикату, поддерживаемому государством и находящемуся под санкциями Министерства финансов США. Вы можете обратиться к этим ссылкам: link2 и link2 для ознакомления с подробной и интересной историей.
Первопричиной этого инцидента стало отсутствие проверок неплатежеспособности, что служит важным уроком. Фактически, для протокола кредитования крайне важно оценивать, следует ли выполнять проверки состояния позиций для любых процедур, которые могут повлиять на позиции пользователей. Кроме того, проектным командам следует активно отслеживать свой протокол кредитования на предмет крупных ликвидаций и создавать эффективные системы оповещения для быстрого обнаружения и реагирования на такие события.
Читайте другие статьи этой серии:
- Вступление: Десять «самых впечатляющих» инцидентов безопасности в 2023 году
- #1: Сбор MEV-ботов путем использования уязвимостей в Flashbots Relay
- #3: Инцидент KyberSwap: мастерское использование ошибок округления с невероятно тонкими вычислениями
- #4: Инцидент Curve: ошибка компилятора создает дефектный байт-код из безобидного исходного кода
- #5: Platypus Finance: выживание после трех атак благодаря удаче
- #6: Инцидент Hundred Finance: катализатор волны эксплойтов, связанных с точностью вычислений в уязвимых протоколах-форках
- #7: Инцидент ParaSpace: гонка со временем, чтобы предотвратить самую критическую атаку в отрасли
- #8: Инцидент SushiSwap: неуклюжая попытка спасения, приведшая к серии подражательных атак
- #9: MEV-бот 0xd61492: от хищника к добыче в гениальном эксплойте
- #10: Инцидент ThirdWeb: несовместимость между доверенными модулями обнажает уязвимость



