
26 апреля 2026 года злоумышленник похитил около $333 тыс. из протокола ZetaChain, воспользовавшись недостаточными ограничениями в механизме cross-chain arbitrary call. Атака затронула четыре сети — Ethereum, Base, Arbitrum и BSC — и прошла в 9 транзакциях. Средства в итоге оказались в миксере Tornado Cash.
Ход инцидента
ZetaChain — протокол, позволяющий выполнять вызовы между разными блокчейнами (так называемые cross-chain вызовы, то есть команды, которые отправляются в одной сети и исполняются в другой). Одним из режимов работы является arbitrary call — режим, при котором отправитель сам указывает, какую функцию и с какими аргументами вызвать на целевом контракте в другой сети.
Атакующий отправил через ZetaChain cross-chain вызов с включённым режимом arbitrary call. В качестве целевого действия в calldata (данных, передаваемых вместе с вызовом) была указана функция transferFrom(...) — стандартная функция ERC-20 токенов, позволяющая списывать токены с чужого адреса при наличии разрешения.
GatewayEVM — контракт ZetaChain на целевых сетях, исполняющий входящие вызовы — выполнил этот низкоуровневый вызов к токен-контрактам. Так как у ряда пользователей существовали старые неотозванные ERC-20 approvals (разрешения на списание токенов) на адрес Gateway, токен-контракты разрешили списание. Средства ушли на адрес атакующего 0x00467f5921f1A343b96B9bF71Ae7e9054aE72eA4.
Почему это стало возможным
Корневая причина — отсутствие достаточных ограничений на то, кто и какие вызовы может инициировать через Gateway в режиме arbitrary call.
GatewayEVM мог выполнить низкоуровневый вызов к произвольному контракту в целевой сети, включая вызов transferFrom к ERC-20 токенам. При этом контракт не ограничивал набор допустимых функций или контрактов, к которым мог обращаться.
Вторым необходимым условием стали старые ERC-20 approvals. ERC-20 approval — это разрешение, которое пользователь выдаёт какому-либо контракту на трату своих токенов. Пользователи, ранее взаимодействовавшие с Gateway, не отозвали эти разрешения. Когда Gateway выполнил transferFrom от имени атакующего, токен-контракты восприняли это как легитимное списание.
Таким образом, уязвимость — это сочетание двух факторов: избыточных полномочий Gateway и неотозванных разрешений пользователей.
Детали расследования: движение средств
1️⃣ В ходе 9 транзакций средства (~$333 тыс.) напрямую поступили на адрес атакующего 0x00467f5921f1A343b96B9bF71Ae7e9054aE72eA4 в четырёх сетях: Ethereum, Base, Arbitrum и BSC.
2️⃣ Через DEX и мосты (мост — это сервис для перевода активов между разными блокчейнами) все средства были консолидированы на том же адресе, но уже в сети Ethereum.
3️⃣ Далее средства через один промежуточный адрес были направлены в миксер Tornado Cash — сервис, затрудняющий отслеживание движения средств путём смешивания транзакций от разных пользователей.
Отправка средств в Tornado Cash сразу после консолидации указывает на заранее подготовленную схему вывода.
Заключение
Атака на ZetaChain демонстрирует риски, которые несёт arbitrary call без надлежащих ограничений: возможность вызова произвольных функций на целевых контрактах превращает Gateway в инструмент для списания чужих средств при наличии активных разрешений.
Пользователям, ранее выдававшим approvals на контракты ZetaChain, следует проверить и отозвать неиспользуемые разрешения. Команде «КоинКит» продолжит отслеживать движение средств после их поступления в Tornado Cash.


