Сеть 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.

Заключение
Исходя из восстановленных значений, мы обнаружили следующее:
- Злоумышленник предоставил действительное подписанное сообщение функции verifyHeaderAndExecuteTx.
- Модификатор
onlyManagerContractв смарт-контракте LockProxy НЕ был обойден.
Основываясь на этих двух наблюдениях, мы предполагаем, что:
- Злоумышленник мог обладать законными ключами для подписания сообщений, что указывает на возможную утечку ключей подписи.
Или
- В процессе подписи PolyNetwork существует ошибка, которой воспользовались для подписания сфабрикованного сообщения.
Однако у нас нет дополнительных данных вне блокчейна, чтобы подтвердить наши выводы. Мы надеемся, что наш анализ будет полезен для дальнейшего расследования.
Авторы: Юфэн Ху, Сивэй У, Лэй У, Яцзинь Чжоу @BlockSec
Twitter: https://twitter.com/BlockSecTeam



