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
Потери около 5,57 млн USD: атаки на X100 Freezer и NEM | Еженедельный обзор BlockSec
Security Insights

Потери около 5,57 млн USD: атаки на X100 Freezer и NEM | Еженедельный обзор BlockSec

Этот еженедельный отчёт охватывает два инцидента безопасности в сетях Ethereum и BNB Chain за период 19.10.2026–25.10.2026. В нём рассматриваются захват управления X100 Freezer, профинансированный с помощью флеш-кредита, и ошибка при расчёте налога, затронувшая пул ликвидности токена NEM в сети BNB Chain. Оценочные потери в рамках отчёта составляют в общей сложности около 5,57 млн USD: ~4,75 млн USD по рассматриваемой транзакции X100 и ~820 тыс. USD в результате инцидента с пулом NEM. В эту сумму не входят отдельно опубликованные данные о последующих выводах средств из X100.

Потери на сумму около 3,87 млн USD: взломы Autheo Network и UNCX | Еженедельный обзор BlockSec
Security Insights

Потери на сумму около 3,87 млн USD: взломы Autheo Network и UNCX | Еженедельный обзор BlockSec

В этом еженедельном отчёте рассматриваются 3 инцидента безопасности за период 12.10.2026–18.10.2026. Общий оценочный ущерб составил около 3,87 млн USD. Ущерб Autheo Network от компрометации закрытого ключа составил примерно 1,76 млн USD, Qubic Wallet потерял примерно 1,30 млн USD из-за ненадёжной генерации seed, а ошибка учёта в контрактах Smart Token Vesting V2 сети UNCX Network на Ethereum, BNB Chain, Base и Robinhood Chain привела к ущербу примерно в 807 тыс. USD. В подробном анализе инцидента UNCX объясняется, как некорректный расчёт совокупного количества долей смешивал транши вестинга, созданные при разных соотношениях токенов и долей, и позволял выводить из общих пулов больше положенного.

Потеряно около $542 тыс.: эксплуатация уязвимости MakerDaoBot | Еженедельный обзор BlockSec
Security Insights

Потеряно около $542 тыс.: эксплуатация уязвимости MakerDaoBot | Еженедельный обзор BlockSec

В Ethereum за 05–11.10.2026 произошёл 1 инцидент; ущерб — около $542 тыс. Атакующий передал вредоносный адаптер функции MakerDaoBot без контроля доступа. Получив права на балансы MakerDAO, адаптер закрыл 4 аукциона ETH-A, конвертировал 200 ETH-A в WETH; атакующий вывел 200 ETH.

Best Security Auditor for Web3

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

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