TechFlow Logo
Войти/ Регистрация
Газ ETH
Gwei
Страх
gas
BlockSec: Анализ принципов атаки на GMX

BlockSec: Анализ принципов атаки на GMX

2025.07.10
Поделиться
Данная атака выявила серьезные недостатки в механизме кредитного плеча и дизайне защиты от реентерантности в GMX.

Автор: BlockSec

GMX подвергся хакерской атаке, в результате которой потери превысили 40 млн долларов США. Злоумышленник использовал уязвимость к повторному вызову (reentrancy), открыв короткую позицию через смарт-контракт с активированной функцией кредитного плеча.

Причина проблемы заключается в некорректном использовании функции executeDecreaseOrder. Ее первый параметр должен был принимать внешний аккаунт (EOA), однако атакующий передал адрес смарт-контракта. Это позволило злоумышленнику во время процедуры выкупа повторно обратиться к системе, манипулировать внутренним состоянием и в итоге получить активы, значительно превышающие фактическую стоимость его GLP.

Механизм стандартного выкупа GLP

В GMX GLP представляет собой токен поставщика ликвидности и отражает долю участника в активах фонда (таких как USDC, ETH, WBTC). При вызове пользователем функции unstakeAndRedeemGlp система рассчитывает объем возвращаемых активов по следующей формуле:

redeem_amount = (user_GLP / total_GLP_supply) * AUM

где AUM (стоимость активов под управлением) вычисляется следующим образом:

AUM = общая стоимость всех токенов в пулах + нереализованный убыток по глобальным коротким позициям - нереализованная прибыль по глобальным коротким позициям - зарезервированная сумма - предустановленный вычет (aumDeduction)

Данный механизм гарантирует, что держатели GLP получают реальную долю активов фонда пропорционально своей доли.

Проблемы при включении кредитного плеча

После активации режима enableLeverage пользователи могут открывать позиции с кредитным плечом (длинные или короткие). Перед выкупом GLP атакующий создал крупную короткую позицию по WBTC.

Открытие короткой позиции мгновенно увеличивает объем глобального шорта. До изменения рыночных цен система по умолчанию классифицирует ее как убыточную, и данный нереализованный убыток засчитывается как «актив» фонда, что искусственно раздувает показатель AUM. Хотя фонд физически не получает дополнительной ценности, расчет выкупа опирается на это завышенное AUM, благодаря чему атакующий выводит активы, многократно превышающие причитающуюся ему часть.

Ход атаки

Транзакция атаки

https://app.blocksec.com/explorer/tx/arbitrum/0x03182d3f0956a91c4e4c8f225bbc7975f9434fab042228c7acdc5ec9a32626ef?line=93

Заключение

Данная атака выявила серьезные пробелы в архитектуре механизма кредитного плеча и защите от повторного вызова в GMX. Фундаментальная проблема заключается в избыточном доверии логики выкупа к значению AUM без должной проверки безопасности его компонентов (например, нереализованных убытков). Помимо этого, ключевые функции предполагают тип вызывающего объекта (EOA или контракт), не применяя жесткой верификации. Этот инцидент вновь подчеркивает для разработчиков необходимость обеспечения неприкосновенности состояния системы при операциях с финансами. Особое внимание следует уделять комплексным финансовым логикам (кредитное плечо, деривативы), чтобы предотвратить системные риски, связанные с реентерабельностью и загрязнением состояния.

Присоединяйтесь к официальному сообществу TechFlow

В избранное
Поделиться