
3 марта 2026 года в сети Ethereum была зафиксирована атака, в результате которой с адреса жертвы было списано 42,606.959179 USDC. Ущерб составил около $42,6 тыс.
Расследование КоинКит анализирует технические аспекты инцидента и механизм обхода авторизации в контракте UniswapV4Router04.
Ход инцидента
Ход инцидента
Злоумышленник заранее развернул вспомогательный контракт и использовал его для взаимодействия с UniswapV4Router04.
Далее он сформировал специальный вызов функции swap(bytes,uint256) таким образом, чтобы обойти внутреннюю проверку авторизации.
В контракте Router04 проверка того, что payer == msg.sender, реализована через чтение конкретного участка calldata по фиксированному смещению. Проверяется не декодированное значение параметра, а байты по заранее заданному offset.
Атакующий воспользовался этим:
- в ту позицию calldata, которую проверяет контракт, он подставил свой адрес;
- в реальных декодируемых параметрах внутри bytes указал payer = адрес жертвы.
В результате:
1. Формальная проверка прошла — контракт «увидел» адрес атакующего.
2. При выполнении swap роутер использовал allowance жертвы.
3. Был вызван transferFrom, и 42,606.959179 USDC были списаны с кошелька жертвы.
После этого средства были направлены в Uniswap v4 PoolManager и в той же транзакции злоумышленник получил 21.197984596759249607 ETH.
Списание средств и получение ETH произошли атомарно, в пределах одного блока.
Жертва не инициировала перевод. Использовано ранее выданное разрешение на списание токенов.
Детали расследования: движение средств
После получения 21.197984596759249607 ETH средства были немедленно переведены в протокол приватности Railgun.
Вывод в приватную инфраструктуру значительно усложняет дальнейшую трассировку активов.
На момент анализа средства находятся вне публичной ликвидности.
Технические аспекты
Инцидент не связан с уязвимостью токена USDC или механикой пула ликвидности.
Проблема возникла из-за способа проверки параметров в Router04. Контракт опирался на фиксированное смещение calldata, а не на декодированное значение переменной payer. Это позволило сформировать валидный ABI-вызов, при котором проверка формально проходила, но фактический источник средств отличался от проверяемого значения.
Использование inline-assembly в критических проверках повышает риск подобных ошибок, особенно при оптимизации газа и ручной работе с calldata.
Заключение
Инцидент с UniswapV4Router04 демонстрирует, что даже корректно работающий протокол может стать уязвимым из-за неточной проверки параметров на уровне роутера.
Обход авторизации был реализован в пределах одной транзакции, после чего средства были конвертированы в ETH и выведены в протокол приватности.
Команда КоинКит продолжает мониторинг связанных адресов и анализ возможных аналогичных реализаций в смарт-контрактах.


