Back to Blog

Первичный анализ взлома PolyNetwork

Code Auditing
August 11, 2021
3 min read

Сеть PolyNetwork была взломана, похищено более 300 миллионов долларов США. Атакующий совершил нападение сразу на несколько блокчейнов. В этом блоге мы используем транзакцию атаки в сети Ethereum (0xd8c1f7424593ddba11a0e072b61082bf3d931583cb75f7843fc2a8685d20033a ) для анализа возможных причин взлома. Наш первичный анализ показывает, что одной из вероятных причин может быть либо утечка закрытого ключа, используемого для подписи кросс-чейн сообщений, либо наличие ошибки в процессе подписи PolyNetwork, которой злоумышленник воспользовался для подписи сфабрикованного сообщения.

Отказ от ответственности: Этот блог содержит только результаты нашего первичного анализа, основанного на данных в блокчейне Ethereum. Мы не можем подтвердить наши выводы без дополнительной информации от Poly Network.

Обновление от 12.08.2021: Дополнительная информация показывает, что причиной атаки стало изменение «хранителя» (keeper) злоумышленником (а не утечка закрытого ключа). У нас есть дальнейший анализ, отвечающий на вопрос, каким образом транзакция по смене хранителя вообще могла быть выполнена.

Транзакция и трассировка вызовов

Мы используем нашу систему анализа транзакций для восстановления трассировки.

Злоумышленник -> EthCrossChainManager -> EthCrossChainData -> LockProxy -> managerProxyContractforLockProxy

  • 0xc8a65fadf0e0ddaf421f28feab69bf6e2e589963: Злоумышленник
  • 0x838bf9e95cb12dd76a54c9f9d2e3082eaf928270: EthCrossChainManager
  • 0xcf2afe102057ba5c16f899271045a0a37fcb10f2: EthCrossChainData
  • 0x250e76987d838a75310c34bf422ea9f1ac4cc906: LockProxy
  • 0x5a51e2ebf8d136926b9ca7b59b60464e7c44d2eb: managerProxyContract для LockProxy

Сигнатуры функций:

  • d450e04c (verifyHeaderAndExecuteTx)
  • 69d48074 (getCurEpochConPubKeyBytes)
  • 5ac40790 (getCurEpochStartHeight)
  • 0586763c (checkIfFromChainTxExist)
  • e90bfdcf (markFromChainTxExist(uint64,bytes32))

Основной процесс атаки

Основной процесс атаки заключается в том, что злоумышленник передал подписанные данные функции verifyHeaderAndExecuteTx(). Эта функция декодирует данные и проверяет подписи, которые были использованы для подписания данных. Если процесс проверки проходит успешно, выполняется метод (и адрес контракта), указанный в сообщении. Во время этой атаки для перевода Fei злоумышленнику была вызвана функция unlock смарт-контракта 0x250e76987d838a75310c34bf422ea9f1ac4cc906.

Таким образом, атака стала возможной из-за передачи корректных параметров функции verifyHeaderAndExecuteTx. Эти параметры успешно прошли проверку подписи. После этого транзакция, указанная в сообщении, была выполнена (подобно выполнению произвольных команд в сфере программной безопасности).

Чтобы лучше понять этот процесс, мы восстановили критические значения трассировки вызовов.

Функция: verifyHeaderAndExecuteTx:

verifySig

unlock

Переменная managerProxyContract в LockProxy. Она совпадает со значением адреса вызывающего объекта функции unlock.

Заключение

Исходя из восстановленных значений, мы обнаружили следующее:

  1. Злоумышленник предоставил действительное подписанное сообщение функции verifyHeaderAndExecuteTx.
  2. Модификатор onlyManagerContract в смарт-контракте LockProxy НЕ был обойден.

Основываясь на этих двух наблюдениях, мы предполагаем, что:

  1. Злоумышленник мог обладать законными ключами для подписания сообщений, что указывает на возможную утечку ключей подписи.

Или

  1. В процессе подписи PolyNetwork существует ошибка, которой воспользовались для подписания сфабрикованного сообщения.

Однако у нас нет дополнительных данных вне блокчейна, чтобы подтвердить наши выводы. Мы надеемся, что наш анализ будет полезен для дальнейшего расследования.

Авторы: Юфэн Ху, Сивэй У, Лэй У, Яцзинь Чжоу @BlockSec

Twitter: https://twitter.com/BlockSecTeam

Best Security Auditor for Web3

Validate design, code, and business logic before launch. Aligned with the highest industry security standards.

BlockSec Audit