Back to Blog

Переосмысление атак типа «червоточина»

Code Auditing
March 22, 2022
5 min read

1. Общие сведения

Червоточина (Wormhole), также известная как мост Эйнштейна-Розена — это гипотетическая структура, соединяющая разрозненные точки в пространстве-времени. В мире блокчейна Wormhole используется в качестве моста между различными цепями (например, Solana и Ethereum). Пользователи могут передавать токенизированные активы между блокчейнами с помощью Wormhole.

2 февраля 2022 года протокол Wormhole подвергся взлому, в результате которого злоумышленник смог выпустить 120 000 обернутых эфиров (wrapped Ether) на сумму 320 миллионов долларов США. Это вторая по величине потеря в истории DeFi после инцидента с Poly Network.

2. Как работает Wormhole

Wormhole работает путем отслеживания сообщений, отправляемых в каждой цепи. Отслеживаемое сообщение пересылается в целевую цепочку, благодаря чему можно выстроить протокол кроссчейн-коммуникации.

Естественно возникает вопрос о том, как гарантировать достоверность такого сообщения. Для решения этой проблемы Wormhole использует 19 дополнительных узлов, называемых «хранителями» (guardians). Текущий список хранителей можно проверить в Wormhole Explorer. Каждый хранитель может независимо проверять отслеживаемое сообщение и подписывать его.

В Wormhole сообщение организовано в формате VAA. VAA состоит из двух частей. Первая — заголовок, который собирает подписи хранителей. Вторая — тело, содержащее информацию для целевой цепочки, полезную нагрузку сообщения и т. д.

Как только подписи хранителей достигают порога консенсуса, VAA можно опубликовать в цепи.

Таким образом, хранители несут ответственность за целостность передаваемого сообщения.

3. Токен-мост (Token Bridge)

После рассмотрения принципов передачи сообщений между цепями, будет несложно понять, как работает токен-мост — основное приложение в рамках Wormhole.

Для перевода токенов из цепи A в цепь B, Wormhole блокирует токены в цепи A и выпускает их в цепи B. Это общая концепция. На практике процесс можно разделить на три шага. Во-первых, токены в цепи A блокируются. Во-вторых, транслируется сообщение о том, что токены из цепи A должны быть переведены в цепь B. В-третьих, цепь B получает сообщение, и соответствующие токены выпускаются. Всё готово.

4. Инструкции Solana

В Solana транзакция состоит из нескольких инструкций. Каждая инструкция содержит ID программы, аккаунты и данные. ID программы представляет собой программу (смарт-контракт), которая будет обрабатывать инструкцию. Программа интерпретирует данные и выполняет операции с предоставленными аккаунтами.

5. Атака на Wormhole

Если кратко, злоумышленник выпустил 120 000 ETH в сети Solana, не заблокировав при этом никаких активов в Ethereum. Транзакцию можно посмотреть здесь.

Итак, вопрос в том, как злоумышленнику удалось выпустить 120 000 ETH в Solana. Давайте разберем шаги подробнее. Чтобы выпустить (минтить) токен, вызывается инструкция complete_wrapped. Эта инструкция получает несколько адресов, а третий из них является адресом, хранящим подписанное сообщение. Перед выпуском 120 000 ETH, цепь B (т.е. Solana) должна получить подписанное сообщение (т.е. VAA), подтверждающее, что 120 000 ETH были заблокированы в цепи A (т.е. Ethereum).

Для отправки сообщения вызывается функция post_vaa, определенная в post_vaa.rs. В результате создается аккаунт для хранения сообщения. Однако post_vaa не проверяет подписи хранителей. Вместо этого проверкой занимается функция verify_signatures, определенная в veryify_signatures.rs.

Четвертый аккаунт, переданный в verify_signatures, является системным аккаунтом инструкций. Теперь давайте разберемся, как работает verify_signatures.

В строке 103 вызывается функция load_instruction_at для загрузки предыдущей выполненной инструкции secp_ix. secp_ix вызывает функцию проверки подписи Secp256k1. Таким образом, verify_signatures проверяет подписи путем обращения к ранее выполненной инструкции secp_ix. Теперь вы всё поняли? Функция load_instruction_at не проверяет, откуда загружать инструкции!!! Ожидается, что инструкция будет загружена из Sysvar:Instructions.

Однако четвертым аккаунтом атакующей транзакции является 2tHS1cXX2h1KBEaadprqELJ6sV9wLoaSdX68FqsrrZRd, а не Sysvar:Instructions. В этом случае злоумышленник успешно обошел процесс проверки подписи. Wormhole посчитал, что проверка пройдена, и сообщение было опубликовано, что привело к выпуску 120 тыс. ETH без блокировки каких-либо активов!

Давайте взглянем на легальную инструкцию проверки. Эта транзакция состоит из двух инструкций. Первая вызывает функцию проверки Secp256k1, а вторая — инструкцию verify_signatures. Обратите внимание: четвертый аккаунт здесь — Sysvar:Instructions.

После выпуска 120 тыс. ETH злоумышленник смог вывести их обратно в Ethereum и обменять на другие токены, чтобы получить прибыль.

6. Исправление

Как упоминается в репозитории, начиная с версии 1.8.0, функция load_instruction_at небезопасна, так как адрес аккаунтов Sysvar не проверяется. Вместо нее рекомендуется использовать load_instruction_at_checked.

7. Наши мысли

  • Разработчики должны быть очень хорошо знакомы с внешними функциями, которые они используют.
  • Продолжайте следить за любыми важными изменениями в используемых библиотеках. Если библиотека обновляется, код, использующий её, возможно, придется изменить.
  • Сопровождающие библиотек должны осознавать потенциальные риски для конкретных изменений и своевременно уведомлять сообщество. Простого добавления аннотаций может быть недостаточно.
  • Ваш код контракта должен проходить аудит, если обновляются версии библиотек или сам код.

О компании BlockSec

BlockSec — инновационная компания в сфере блокчейн-безопасности, основанная в 2021 году группой выдающихся экспертов по безопасности мирового уровня. Компания стремится повысить уровень безопасности и удобства использования в развивающемся мире Web3, чтобы способствовать его массовому внедрению. Для этого BlockSec предоставляет услуги по аудиту безопасности смарт-контрактов и EVM-сетей, платформу Phalcon для разработки систем безопасности и проактивной блокировки угроз, платформу MetaSleuth для отслеживания средств и расследований, а также расширение MetaSuites для эффективной навигации разработчиков Web3 в криптомире.

На сегодняшний день компания обслужила более 300 уважаемых клиентов, таких как MetaMask, Uniswap Foundation, Compound, Forta и PancakeSwap, и привлекла десятки миллионов долларов США в двух раундах финансирования от ведущих инвесторов, включая Matrix Partners, Vitalbridge Capital и Fenbushi Capital.

Официальный сайт: https://blocksec.com/

Официальная страница в 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