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-проекты должны внедрять инструменты мониторинга для активного контроля состояния своих приложений и получать оповещения при возникновении любых нестандартных ситуаций.

Best Security Auditor for Web3

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

BlockSec Audit