Back to Blog

Как был взломан Mirror Protocol

Code Auditing
31 мая 2022 г.
4 min read

Как сообщил @FatMan, протокол Mirror подвергся эксплойту. В блоге The Block есть подробный отчет об этом. В этой короткой статье мы разберем транзакцию атаки, чтобы показать, как именно это произошло.

Отказ от ответственности: Данная статья основана на публичных транзакциях и нашем понимании протокола Mirror и экосистемы Terra. Пожалуйста, сообщите нам, если в статье есть неточности. Будем рады любым комментариям к этому материалу.

1 Атака

1.1 Подготовка

Эта транзакция использовалась для подготовки атак.

ШАГ 1: В этой транзакции злоумышленник сначала отправил 100 000 USTC в контракт блокировки (lock contract). Это не является необходимым для открытия позиции, но критически важно для самой атаки.

ШАГ 2: После этого злоумышленник открыл позицию, внеся 10 USTC в качестве обеспечения и указав collateral_ratio (коэффициент обеспечения), равный 2.5.

Параметр short_params указан таким образом, чтобы контракт минтинга (mint contract) продал сминтинные mAsset (например, mETH) и добавил полученные USTC к заблокированной сумме позиции.

ШАГ 2.1: Давайте разберем транзакцию пошагово. Сначала будет вызвана функция open_position для открытия короткой позиции с ID 43186.

ШАГ 2.2: Поскольку добавлен необязательный параметр short_params, контракт сначала сминтит 0.001208 mETH (исходя из текущей цены ETH), а затем продаст их, совершив своп в паре mETH-UST.

ШАГ 2.3: Эти 0.001208 mETH будут обменяны на 4.06582 USTC, и после вычета соответствующих комиссий (например, налога) полученные USTC будут отправлены в контракт блокировки. Это связано с тем, что открытая позиция может быть разблокирована только по истечении определенного периода времени.

ШАГ 2.4: Затем будет вызвана функция lock_position_funds_hook. В этой функции position_locked_amount (заблокированная сумма позиции) будет рассчитана путем запроса current_balance (текущего баланса) и сравнения его с заблокированными средствами (locked_funds).

Однако, как мы видели на Шаге 1, 100 000 USTC были напрямую переведены в контракт блокировки, поэтому locked_amount составит около 100 004 USTC, а не 4 USTC.

ШАГ 2.5: Наконец, будет вызвана функция increase_short_token для регистрации токенов sLP.

На этом этапе злоумышленник открыл позицию, напрямую отправив 100 000 USTC в контракт блокировки и внеся 10 USTC в качестве обеспечения. Заблокированная сумма позиции составляет около 100 004 USTC и может быть разблокирована через определенный период времени. Злоумышленник открыл множество таких позиций, отправляя от 1 000 до 100 000 USTC.

1.2. Атака

Протокол Mirror не проверяет дубликаты ID позиций. В данном случае злоумышленник мог передать множество дубликатов ID позиций, чтобы разблокировать заблокированную сумму в одной позиции снова и снова.

Эта транзакция является транзакцией атаки. Например, для позиции с ID 43186 злоумышленник продублировал ID 437 раз.

Поскольку исходный код контракта не проверяет дубликаты, было разблокировано около 43.7 млн (437 * 0.1 млн) USTC (за один вызов функции).

Стоит отметить, что другие позиции были разблокированы с использованием того же механизма.

2. Исправление ошибки

Уязвимость была исправлена в этом коммите.

В частности, unlockable_positions — это вектор, содержащий ID позиций, подлежащих разблокировке. В исходном коде отсутствовала проверка на наличие дублирующихся ID в векторе unlockable_positions. Исправленный код добавляет проверку на наличие дубликатов ID позиций.

3. Заключение

Как отмечали @FatMan и другие члены сообщества, эта ошибка существовала несколько месяцев и активно использовалась злоумышленниками. Мы считаем, что «тихое» исправление уязвимости, которая уже была использована в реальных условиях, не является хорошей практикой безопасности. Кроме того, мы считаем, что крупные DeFi-проекты должны внедрять инструменты мониторинга для активного контроля состояния своих приложений и получать оповещения при возникновении любых нестандартных ситуаций.

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