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



