21 июня один из самых активных MEV-ботов на сети Ethereum, Jaredfromsubway.eth, стал жертвой тщательно спланированной «атаки с использованием медовой ловушки» (honeypot attack) и потерял более 7,5 миллиона долларов США в криптоактивах. Ниже приводится анализ и отслеживание движения похищенных средств командой безопасности Beosin.
Анализ процесса атаки
Атака на контракт-семейство
- Координаторный контракт (0xb84db016324e8f2bfdd8dd9c260338aee0a8df52): отвечает за запись того, находится ли текущий блок в состоянии armed, и для циклического вызова дочерних контрактов для извлечения средств на финальной стадии. - Триггерный контракт (0x4de8c729a064ff6087cc84a4152969349e4feb98): отвечает за установку фальшивого состояния торговой пары в том же блоке, чтобы сделать арбитражный путь кажущимся исполняемым. - Дочерний контракт / фальшивый токен: маскируется под обычный токен ERC-20 для получения реальной авторизации. - Hub-контракт: отвечает за выплату небольшого реального дохода, чтобы MEV-бот считал его выгодным. - Ring V2 pair: фальшивая торговая пара Uniswap v2. - Фальшивый промежуточный токен: используется для построения многоступенчатых арбитражных путей, например, fCAP, fUSDC.
Ключ к атаке: обманом получить авторизацию
Анализируя цепочечные транзакции, злоумышленник создал несколько групп приманочных транзакций:
- Крупные транзакции USDC: робот заработал около 36,997120 USDC, но оставил 20 USDC в качестве авторизации. - Крупные транзакции USDT: робот заработал около 37,053440 USDT, но оставил 20 USDT в качестве авторизации. - Крупные транзакции WETH: робот заработал около 0,0179 WETH, но оставил 16 WETH в качестве авторизации. - Мелкие сделки проходят нормально: авторизация расходуется в рамках одной и той же сделки для снижения подозрений.
При мелких сделках, после того как робот авторизует реальный токен, подконтракт немедленно переводит реальные токены, авторизация расходуется и выглядит совершенно нормально.
В крупных сделках дочерний контракт не вызывает transferFrom для перевода реальных токенов, а просто создает фальшивые токены путем поддельной транзакции. Робот считает, что завершил обычные предварительные шаги обмена, но авторизация реальных токенов остается сохраненной.
Вот суть всей атаки: мелкие транзакции нормально расходуют авторизацию, а крупные транзакции сохраняют авторизацию.
Процесс атаки
На примере атакующей сделки с USDC:
(1) Злоумышленник вызывает координатора, чтобы установить текущий блок в состояние armed. (2) Злоумышленник вызывает триггер, чтобы обновить состояние нескольких поддельных пар Ring V2. (3) MEV-бот обнаруживает арбитражную возможность и выполняет сделку.
Процесс работы MEV-бота выглядит примерно так:
(1) Контракт MEV Bot предоставил крупный лимит USDC другому подконтракту. (2) MEV Bot вызвал функцию wrapTo/wrap подконтракта. (3) Подконтракт, находящийся в состоянии armed, не расходует реальные USDC, а вместо этого создает фальшивые токены для пары, оставляя авторизацию USDC активной. (4) MEV Bot продолжает вызывать обмен на фальшивой паре. (5) Вторая пара отправляет токены MEV Bot. (6) Хаб-контракт выплачивает MEV Bot небольшую прибыль в реальных USDC.

пример одобрения
хэш транзакции: 0x0121e07a916c06eea3e7daf11893f3f0b95b9e1684124545ae14c32aee6029bb
Результат, полученный MEV-ботом: успешная арбитражная сделка, принесшая реальную прибыль в USDC. Однако авторизация USDC была сохранена дочерним контрактом. Этот процесс повторяется отдельно для USDC, USDT и WETH, в результате чего формируется большое количество авторизаций.
Хеш атаки:
0x2be8704f5a59b69e0b71f64aefdb99eb0e8ae9fb3926147c581910d71bcf3e65
Злоумышленник вызывает цикл drain контракта координатора, в calldata содержатся 66 адресов дочерних контрактов и адрес контракта MEV Bot. Если контракт MEV Bot ранее предоставил дочерним контрактам авторизацию на выделение лимита, дочерние контракты могут напрямую перевести соответствующие реальные токены злоумышленнику.
Итоговый результат:
- Все 20 крупных авторизаций USDC были полностью израсходованы - Все 16 крупных авторизаций WETH были полностью израсходованы - Частичная авторизация USDT все еще существует, но баланс USDT недостаточен
Анализ движения средств
После успешной атаки адрес атакующего (0x3e37f4A10d771Ba9dE44b6d301410b1BEdeA65d0) получил $2,87 млн USDC, $2,04 млн USDT и 1 474 WETH. Затем атакующий обменял стабильные монеты на ETH и перевел их на следующие четыре адреса:
- 0xe3Da36E4bd1a5738fa5D6Ef4F0e4dF40bDeB5f17 (около 1 000 ETH) - 0x74Dc5b93586D248D5Aec64b3586736FF0A0D0e65 (1 001 ETH) - 0xd8C125efCBc99408eC8723E9BBd81d1E8D39D845 (1 001 ETH) - 0x71d4416A7A85e08a5Fe7227Ca3B44Fc639e94e97 (1 423 ETH)
Из них 0xe3Da3 перевел 1 000 ETH в Tornado Cash, другие три адреса не совершили дальнейших переводов ETH. График движения средств выглядит следующим образом:

Заключение
Эта атака демонстрирует высокотехнологичный метод: атакующий не напрямую атакует код контракта, а, основываясь на бизнес-логике MEV-бота, создает соответствующие арбитражные сценарии, чтобы обмануть MEV-бота и заставить его дать кажущиеся безвредными разрешения, после чего переводит его активы. Для арбитражных ботов и MEV-ботов недостаточно полагаться только на моделирование прибыли для оценки безопасности маршрута; особенно когда в арбитражном пути присутствуют незнакомые контракты, поддельные токены или пользовательские обертки, необходимо действовать с осторожностью и рассмотреть возможность обязательной проверки изменений allowance после транзакции.

