Uniswap Router дал сбой? Разбор кражи $42,6 тыс. в Ethereum
04.03.2026 | CoinKyt Company

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 и выведены в протокол приватности.

 


Команда КоинКит продолжает мониторинг связанных адресов и анализ возможных аналогичных реализаций в смарт-контрактах.