Back to Blog

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

Code Auditing
May 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
Мост Harmony Cross-Shard ONE Mint + потеря ключей на ~$47М | BlockSec
Security Insights

Мост Harmony Cross-Shard ONE Mint + потеря ключей на ~$47М | BlockSec

10-16 авг 2026: 5 инцидентов, ~$47М убытков. Анализ — уязвимость Harmony: replay чеков между шардами создал 3.01Т ONE (не учтено в убытках). $47М — кражи ключей (Whale ~$25М, Kite ~$14М, Coinsbuy ~$7.9М) и ошибка Fox (~$117K).

~$1.6M потеряно: эксплойты токена Moke и LpdFi | BlockSec Weekly
Security Insights

~$1.6M потеряно: эксплойты токена Moke и LpdFi | BlockSec Weekly

За неделю 3-9 августа 2026 года в BNB Chain произошло 2 инцидента с общими потерями ~$1,6 млн из-за манипуляций с ценами. LpdFi (~$697K): атакующий использовал резервы PancakeSwap для завышения позиции. Moke Token (~$906K): манипуляция ценой и дублирование дивидендов LP.

Инцидент с COLDCARD: когда «случайная» сид-фраза кошелька оказалась не случайной
Security Insights

Инцидент с COLDCARD: когда «случайная» сид-фраза кошелька оказалась не случайной

Ошибка в прошивке COLDCARD направляла генерацию seed на слабый программный ГСЧ, делая кошельки восстановимыми офлайн. Обновление не устраняет проблему. К 7 августа 2026 г. подтверждённые потери — 1 405 BTC (~$91 млн), оценки до 2 055 BTC.

Best Security Auditor for Web3

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

BlockSec Audit