GMX подвергся атаке Хакера, что привело к убыткам более 40 миллионов долларов. Нападающие использовали уязвимость повторного входа и создали позиции в шорт, когда контракт активировал функцию кредитного плеча для осуществления атаки.
Суть проблемы заключается в неправильном использовании функции executeDecreaseOrder. Первым параметром этой функции должен быть внешний аккаунт (EOA), однако злоумышленник передал адрес смарт-контракта. Это позволило злоумышленнику повторно войти в систему в процессе выкупа, манипулируя внутренним состоянием, в результате чего выкупаемые активы значительно превышали фактическую стоимость GLP, которой он владел.
В GMX GLP – это токен поставщиков ликвидности, представляющий долю в активах казначейства (таких как USDC, ETH, WBTC). Обычно, когда пользователь выкупает GLP, система рассчитывает количество активов, которое должно быть возвращено, на основе доли GLP, принадлежащей пользователю, и текущей общей суммы управляемых активов (AUM). Расчет AUM включает общую стоимость всех пулов токенов, глобальные позиции в шорт с нереализованной прибылью и убытками, зарезервированные суммы и предустановленные вычеты.
Однако, после включения функции плеча в системе возникла уязвимость. Хакер открыл большие позиции в шорт по WBTC перед выкупом GLP. Поскольку позиция в шорт увеличила глобальный объем шортов сразу после открытия, при отсутствии изменения цены система по умолчанию считала эту позицию убыточной. Эта часть нереализованного убытка ошибочно была учтена в "активах" казны, что привело к искусственному росту AUM. Хотя казна на самом деле не получила дополнительную ценность, расчет выкупа основывался на этом завышенном AUM, что позволило хакеру получить значительно больше активов, чем он должен был.
Эта атака выявила серьезные недостатки GMX в механизме кредитного плеча и дизайне защиты от повторных атак. Основная проблема заключается в чрезмерной доверчивости логики выкупа активов к AUM, которая не проводит достаточных проверок безопасности в отношении его компонентов (таких как нереализованные убытки). В то же время ключевые функции также не имеют обязательной проверки идентичности вызывающего (EOA против контракта).
Это событие вновь напоминает разработчикам, что при выполнении операций, связанных с финансами, необходимо обеспечить невозможность манипуляции состоянием системы. Особенно при введении сложной финансовой логики (такой как кредитное плечо, производные инструменты) необходимо строго предотвращать системные риски, связанные с повторными входами и загрязнением состояния. Команда разработчиков должна пересмотреть свой дизайн контрактов, усилить меры безопасности и рассмотреть возможность введения более строгой аутентификации и проверки состояния, чтобы предотвратить повторение подобных атак.
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
GMX была взломана, и уязвимость повторного входа обошлась в 40 миллионов долларов
GMX подвергся атаке Хакера, что привело к убыткам более 40 миллионов долларов. Нападающие использовали уязвимость повторного входа и создали позиции в шорт, когда контракт активировал функцию кредитного плеча для осуществления атаки.
Суть проблемы заключается в неправильном использовании функции executeDecreaseOrder. Первым параметром этой функции должен быть внешний аккаунт (EOA), однако злоумышленник передал адрес смарт-контракта. Это позволило злоумышленнику повторно войти в систему в процессе выкупа, манипулируя внутренним состоянием, в результате чего выкупаемые активы значительно превышали фактическую стоимость GLP, которой он владел.
В GMX GLP – это токен поставщиков ликвидности, представляющий долю в активах казначейства (таких как USDC, ETH, WBTC). Обычно, когда пользователь выкупает GLP, система рассчитывает количество активов, которое должно быть возвращено, на основе доли GLP, принадлежащей пользователю, и текущей общей суммы управляемых активов (AUM). Расчет AUM включает общую стоимость всех пулов токенов, глобальные позиции в шорт с нереализованной прибылью и убытками, зарезервированные суммы и предустановленные вычеты.
Однако, после включения функции плеча в системе возникла уязвимость. Хакер открыл большие позиции в шорт по WBTC перед выкупом GLP. Поскольку позиция в шорт увеличила глобальный объем шортов сразу после открытия, при отсутствии изменения цены система по умолчанию считала эту позицию убыточной. Эта часть нереализованного убытка ошибочно была учтена в "активах" казны, что привело к искусственному росту AUM. Хотя казна на самом деле не получила дополнительную ценность, расчет выкупа основывался на этом завышенном AUM, что позволило хакеру получить значительно больше активов, чем он должен был.
Эта атака выявила серьезные недостатки GMX в механизме кредитного плеча и дизайне защиты от повторных атак. Основная проблема заключается в чрезмерной доверчивости логики выкупа активов к AUM, которая не проводит достаточных проверок безопасности в отношении его компонентов (таких как нереализованные убытки). В то же время ключевые функции также не имеют обязательной проверки идентичности вызывающего (EOA против контракта).
Это событие вновь напоминает разработчикам, что при выполнении операций, связанных с финансами, необходимо обеспечить невозможность манипуляции состоянием системы. Особенно при введении сложной финансовой логики (такой как кредитное плечо, производные инструменты) необходимо строго предотвращать системные риски, связанные с повторными входами и загрязнением состояния. Команда разработчиков должна пересмотреть свой дизайн контрактов, усилить меры безопасности и рассмотреть возможность введения более строгой аутентификации и проверки состояния, чтобы предотвратить повторение подобных атак.