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
За пределами смарт-контракта: операционная безопасность доменов и DNS в Web3
Security Insights

За пределами смарт-контракта: операционная безопасность доменов и DNS в Web3

Аудит контрактов не проверяет сам контракт. Мы провели 800 SEAL-проверок DNS и регистраторов для 100 доменов из TVL Top 100 DefiLlama — лишь один домен прошёл все. Каких четырёх мер защиты не хватает большинству и почему это критично для пользователя.

Поверхности атаки Web3: обзор тестирования на проникновение

Поверхности атаки Web3: обзор тестирования на проникновение

Крипто-организации сохраняют все традиционные уязвимости и добавляют цепочку работы с деньгами. Статья описывает систему через четыре компонента: приложение, авторизацию и подпись, взаимодействие с блокчейном, инфраструктуру — с их зонами атак, а также пять специфичных для web3 областей: от эксплуатации и подписания до вывода средств и контрактов.

Потеряно ~23 млн $: эксплойты Cosmos EVM и Moonwell | BlockSec Weekly
Security Insights

Потеряно ~23 млн $: эксплойты Cosmos EVM и Moonwell | BlockSec Weekly

За период (22.08.2026–30.08.2026): 5 инцидентов, ~$22,7 млн убытков; Tectonic — $74–119,5 млн, откачены на Cronos. Взлом Cosmos EVM (~$5,7 млн) на TAC Chain, Moonwell, Ajna, Rain Card Exploit (Ed25519) на Solana.

Best Security Auditor for Web3

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

BlockSec Audit