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
Взлом Bitget на $387,5 млн вне блокчейна: не только ключи и контракты
Security Insights

Взлом Bitget на $387,5 млн вне блокчейна: не только ключи и контракты

24.09.2026 хакеры взломали сторонний продукт, похитили учётные данные и подделали выводы. Похищено ~$387,5 млн со счетов Bitget (Ethereum, EVM, XRP Ledger, Zcash, TRON); ключи целы. Обзор инцидента, конвертации активов, мер защиты и blockchain-пентеста.

Потеряно ~11,3 млн $: Multicall Router, Nostra | BlockSec Weekly
Security Insights

Потеряно ~11,3 млн $: Multicall Router, Nostra | BlockSec Weekly

Отчёт (14–20.09.2026): 2 инцидента, ~$11.3M потерь на Ethereum и Starknet. Мультиколл-роутер обманул Safe, выведя ~2900 aEthrsETH в пул Uniswap v4. Оракул Nostra оценил NSTR в ~$49.52, дав ~$3.5M займов под завышенный залог.

Потеряно ~320 млн $: взломы Liquid Network и Symbiosis | BlockSec
Security Insights

Потеряно ~320 млн $: взломы Liquid Network и Symbiosis | BlockSec

Отчёт за 2026/09/07–2026/09/13: два инцидента, ~$320М убытков. Эксплойт Liquid Network (кэш rangeproof без разделителей полей) дал 4000 незалогового L-BTC. На Bitcoin-маршруте Symbiosis отрицательная комиссия позволила выпустить триллионы syBTC — убыток ~9.97 BTC (~$770K).

Best Security Auditor for Web3

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

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