GMX подвергся хакерской атаке, в результате которой были потеряны более 40 миллионов долларов. Злоумышленники использовали уязвимость повторного входа и открыли короткие позиции при включенной функции кредитного плеча, чтобы осуществить атаку.
Корень проблемы заключается в неправильном использовании функции executeDecreaseOrder. Первым параметром этой функции должен быть внешний аккаунт (EOA), но злоумышленник передал адрес смарт-контракта. Это позволило злоумышленнику повторно войти в систему во время процесса выкупа, манипулировать внутренним состоянием и в конечном итоге выкупить активы, которые значительно превышают фактическую стоимость GLP, которую он держал.
Нормальный механизм выкупа GLP
В GMX GLP является токеном поставщиков ликвидности, представляющим долю в активах казны (таких как USDC, ETH, WBTC). Когда пользователь вызывает unstakeAndRedeemGlp, система использует следующую формулу для расчета количества активов, подлежащих возврату:
Расчет AUM (общая сумма управляемых активов) осуществляется следующим образом:
AUM = общая стоимость всех пулов токенов + нераспределенные убытки по глобальным шортам - нераспределенная прибыль по глобальным шортам - зарезервированные средства - предустановленное вычитание (aumDeduction)
Этот механизм гарантирует, что владельцы GLP пропорционально получают долю реальных активов казны.
Проблемы после включения рычага
Когда enableLeverage включен, пользователи могут открывать позиции с использованием заемных средств (лонг или шорт). Перед тем как забрать GLP, злоумышленник открыл крупную шорт-позицию по WBTC.
Поскольку открытие короткой позиции увеличивает общий объем коротких позиций, а цена еще не изменилась, система по умолчанию считает эту короткую позицию убыточной, и эта часть нереализованного убытка будет учитываться как «активы» казначейства, что приводит к искусственному увеличению AUM. Несмотря на то, что казначейство фактически не получило дополнительной ценности, расчет выкупа будет основан на этом завышенном AUM, что позволит злоумышленнику получить активы, значительно превышающие причитающиеся.
Процесс атаки
Атакующая сделка
Написано в конце
Атака выявила серьезные недостатки GMX в механизме кредитного плеча и дизайне защиты от повторного входа. Основная проблема заключается в том, что логика выкупа активов слишком доверяет AUM, не проводя достаточную проверку безопасности его составных частей (например, не реализованные убытки). В то же время предположение о личности вызывающего ключевой функции (EOA против контракта) также не имеет обязательной проверки. Этот инцидент вновь напоминает разработчикам, что при выполнении операций, связанных с финансами, необходимо обеспечивать невозможность манипуляции состоянием системы, особенно при введении сложной финансовой логики (такой как кредитное плечо, производные инструменты), необходимо строго предотвращать системные риски от повторного входа и загрязнения состояния.
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
BlockSec: Анализ принципов атаки GMX
Автор: BlockSec
GMX подвергся хакерской атаке, в результате которой были потеряны более 40 миллионов долларов. Злоумышленники использовали уязвимость повторного входа и открыли короткие позиции при включенной функции кредитного плеча, чтобы осуществить атаку.
Корень проблемы заключается в неправильном использовании функции executeDecreaseOrder. Первым параметром этой функции должен быть внешний аккаунт (EOA), но злоумышленник передал адрес смарт-контракта. Это позволило злоумышленнику повторно войти в систему во время процесса выкупа, манипулировать внутренним состоянием и в конечном итоге выкупить активы, которые значительно превышают фактическую стоимость GLP, которую он держал.
Нормальный механизм выкупа GLP
В GMX GLP является токеном поставщиков ликвидности, представляющим долю в активах казны (таких как USDC, ETH, WBTC). Когда пользователь вызывает unstakeAndRedeemGlp, система использует следующую формулу для расчета количества активов, подлежащих возврату:
redeem_amount = (user_GLP / всего_GLP_supply) * AUM
Расчет AUM (общая сумма управляемых активов) осуществляется следующим образом:
AUM = общая стоимость всех пулов токенов + нераспределенные убытки по глобальным шортам - нераспределенная прибыль по глобальным шортам - зарезервированные средства - предустановленное вычитание (aumDeduction)
Этот механизм гарантирует, что владельцы GLP пропорционально получают долю реальных активов казны.
Проблемы после включения рычага
Когда enableLeverage включен, пользователи могут открывать позиции с использованием заемных средств (лонг или шорт). Перед тем как забрать GLP, злоумышленник открыл крупную шорт-позицию по WBTC.
Поскольку открытие короткой позиции увеличивает общий объем коротких позиций, а цена еще не изменилась, система по умолчанию считает эту короткую позицию убыточной, и эта часть нереализованного убытка будет учитываться как «активы» казначейства, что приводит к искусственному увеличению AUM. Несмотря на то, что казначейство фактически не получило дополнительной ценности, расчет выкупа будет основан на этом завышенном AUM, что позволит злоумышленнику получить активы, значительно превышающие причитающиеся.
Процесс атаки
Атакующая сделка
Написано в конце
Атака выявила серьезные недостатки GMX в механизме кредитного плеча и дизайне защиты от повторного входа. Основная проблема заключается в том, что логика выкупа активов слишком доверяет AUM, не проводя достаточную проверку безопасности его составных частей (например, не реализованные убытки). В то же время предположение о личности вызывающего ключевой функции (EOA против контракта) также не имеет обязательной проверки. Этот инцидент вновь напоминает разработчикам, что при выполнении операций, связанных с финансами, необходимо обеспечивать невозможность манипуляции состоянием системы, особенно при введении сложной финансовой логики (такой как кредитное плечо, производные инструменты), необходимо строго предотвращать системные риски от повторного входа и загрязнения состояния.