Back to Blog

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

Code Auditing
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

Sign up for the latest updates
За пределами смарт-контракта: операционная безопасность доменов и DNS в Web3
Security Insights

За пределами смарт-контракта: операционная безопасность доменов и DNS в Web3

Аудит контрактов не проверяет сам контракт. Мы провели 800 SEAL-проверок DNS и регистраторов для 100 доменов из TVL Top 100 DefiLlama — лишь один домен прошёл все. Каких четырёх мер защиты не хватает большинству и почему это критично для пользователя.

Поверхности атаки Web3: обзор тестирования на проникновение

Поверхности атаки Web3: обзор тестирования на проникновение

Крипто-организации сохраняют все традиционные уязвимости и добавляют цепочку работы с деньгами. Статья описывает систему через четыре компонента: приложение, авторизацию и подпись, взаимодействие с блокчейном, инфраструктуру — с их зонами атак, а также пять специфичных для web3 областей: от эксплуатации и подписания до вывода средств и контрактов.

Потеряно ~23 млн $: эксплойты Cosmos EVM и Moonwell | BlockSec Weekly
Security Insights

Потеряно ~23 млн $: эксплойты Cosmos EVM и Moonwell | BlockSec Weekly

За период (22.08.2026–30.08.2026): 5 инцидентов, ~$22,7 млн убытков; Tectonic — $74–119,5 млн, откачены на Cronos. Взлом Cosmos EVM (~$5,7 млн) на TAC Chain, Moonwell, Ajna, Rain Card Exploit (Ed25519) на Solana.

Best Security Auditor for Web3

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

BlockSec Audit