Взлом Cross Curve Bridge на 1.4кк$
Пост основан на разборе атаки от QuillAudits (
https://www.quillaudits.com/blog/hack-analysis/cross-curve-exploit), статье о взломе (
https://x.com/MixBytes/status/2018304206763892766) от MixBytes и гитхабе Axelar GMP SDK (
https://github.com/axelarnetwork/axelar-gmp-sdk-solidity/tree/main)
Еще пару недель назад мне казалось, что атаки на мосты ушли в прошлое, но реальность говорит о другом.
Атака была направлена на контракт ReceiverAxelar, интегрированный с Axelar. Сам контракт я не нашел, но он наследуется от AxelarValuedExpressExecutable (
https://github.com/axelarnetwork/axelar-gmp-sdk-solidity/blob/main/contracts/express/AxelarValuedExpressExecutable.sol), в нем есть функция expressExecute(), являющаяся публичной и не имеющая ограничений по доступу
Атакующий сгенерировал commandId, подделал sourceChain и sourceAddress, чтобы вызов выглядел легитимным.
Зловредный payload нёс в себе информацию о целевом контракте, количестве токенов (почти миллиард $EYWA) и инструкции по трансферу на свой адресс,
Единственная проверка, которую осуществляет expressExecute() это проверка на то, исполнялся ли такой commandId, а проверки внутри _execute() проверяли только соответствуют ли sourceChain и sourceAddress друг другу. Такая проверка не давала какого-либо эффекта, поскольку эти данные предоставляет инициатор транзакции.
Кроме того, сonfirmation threshold был установлен на значении 1, что означает очень быструю конфирмацию, ведь требуется одобрение только одного валидатора. Обычно транзакции должны пройти validation process от Axelar Gateway, но для экспресс функции эта часть пропускалась.
Подводя итог, атака была релизована через General Message Passing - GMP технологию, которая является основополагающей при бридже, подробнее про то как это устроено можно почитать здесь (
https://docs.axelar.dev/dev/general-message-passing/overview). Ошибка содержалась в имплементации.
https://t.me/web3securityresearch