История выглядит как очередной взлом Aave, но проблема оказалась в другом месте. Злоумышленник использовал ошибку в стороннем модуле FlashLoopAdapter и вывел из двух Safe-кошельков около 114,09 ETH — примерно $305 000. Основные смарт-контракты Aave v3 при этом не были затронуты.
FlashLoopAdapter использовался для автоматизации заёмных позиций Aave v3 через Safe. Такие модули получают широкие права внутри кошелька, чтобы открывать и закрывать позиции без отдельной подписи владельцев для каждого внутреннего действия.
Именно в проверке этих полномочий и оказалась ошибка. По данным SlowMist, функции open() и close() проверяли, включён ли FlashLoopAdapter как модуль в вызывающем Safe, через isModuleEnabled().
Проблема в том, что ответ на этот вопрос фактически давал сам вызывающий контракт. Атакующий создал поддельный Safe, который всегда отвечал «да», и таким образом прошёл проверку доступа.
Одной этой ошибки для кражи было недостаточно. Дальше сыграла роль внутренняя функция обмена FlashLoopAdapter: вызывающая сторона могла передать собственные адрес router и calldata для внешнего вызова.
Злоумышленник указал в качестве router уже настоящий Safe жертвы, а в calldata передал вызов execTransactionFromModule(). Для кошелька запрос приходил от FlashLoopAdapter, который действительно был заранее разрешённым модулем. В результате Safe выполнил транзакцию.
Получилась неприятная цепочка: фальшивый Safe обманул FlashLoopAdapter, а уже доверенный FlashLoopAdapter использовал свои реальные права внутри кошелька жертвы.
Во время атаки суммы двигались гораздо крупнее итогового ущерба. Злоумышленник использовал flash loan в WETH, погасил около 1335 WETH долга одной из позиций Aave и благодаря этому разблокировал примерно 1306,48 weETH залога. Из второго Safe было выведено ещё около 6,4 weETH.
Но это не означает кражу 1300 ETH. Значительная часть средств ушла на погашение долга и возврат flash loan. После завершения всей операции атакующий сохранил около 114,1 ETH — именно эту сумму исследователи считают прямым ущербом.
Основатель Aave Стани Кулечов отдельно подчеркнул, что уязвимый контракт не относится к ядру Aave v3. Сам lending-протокол использовался в процессе атаки для погашения долга и вывода обеспечения, но его контракты не были взломаны.
То же относится и к Safe. Опубликованный разбор указывает не на обход системы multisig-подписей Safe, а на ошибку в стороннем модуле, которому владельцы кошельков уже предоставили право выполнять операции.
Это различие особенно важно для DeFi. Хорошо проверенный базовый протокол может оставаться полностью рабочим, пока уязвимость появляется в адаптере, мосте, модуле автоматизации или другом слое поверх него. FORKB уже разбирал, как дополнительные уровни инфраструктуры становятся отдельными точками атаки в DeFi.
Пока известно о двух пострадавших Safe-кошельках. Исследователи ещё должны определить, сколько других адресов использовали тот же FlashLoopAdapter и сохранились ли где-то активные разрешения на работу уязвимого модуля.
Также пока нет подтверждённой информации о возврате средств, компенсации пострадавшим или полном исправлении всех развёрнутых экземпляров FlashLoopAdapter.
Поэтому инцидент интересен не столько суммой в $305 000, сколько самой архитектурой атаки. В DeFi безопасность уже давно не заканчивается аудитом основного протокола: сторонний модуль с широкими правами способен стать слабым местом, даже если Aave и Safe работают ровно так, как были задуманы.