GMX зазнав хакерської атаки, внаслідок якої було втрачено понад 40 мільйонів доларів. Зловмисники скористалися вразливістю повторного входу і здійснили атаку, відкривши короткі позиції за умов активізації функції кредитного плеча в контракті.
Корінь проблеми полягає в неправильному використанні функції executeDecreaseOrder. Першим параметром цієї функції повинен бути зовнішній обліковий запис (EOA), але зловмисник передав адресу смарт-контракту. Це дозволило зловмиснику повторно увійти в систему під час процесу викупу, маніпулюючи внутрішнім станом, в результаті чого викуплені активи значно перевищили фактичну вартість GLP, що ним володіє.
Нормальний механізм викупу GLP
У GMX GLP є токеном постачальника ліквідності, який представляє частку активів сховища (такі як USDC, ETH, WBTC). Коли користувач викликає unstakeAndRedeemGlp, система використовує наступну формулу для розрахунку кількості активів, які підлягають поверненню:
У рахунку AUM (загальний обсяг керованих активів) виконується наступним чином:
AUM = загальна вартість всіх токенів у пулі + глобальні невиконані збитки - глобальні невиконані прибутки - зарезервована сума - попередньо визначене зменшення (aumDeduction)
Цей механізм гарантує, що власники GLP отримують пропорційну частку реальних активів скарбниці.
Проблеми після відкриття важеля
Коли enableLeverage увімкнено, користувач може відкривати позиції з використанням важелів (довгі або короткі). Зловмисник відкрив велику коротку позицію WBTC перед викупом GLP.
Оскільки коротка позиція одразу збільшує загальний обсяг коротких позицій, а ціна ще не змінилася, система за замовчуванням вважає цю коротку позицію збитковою, і ця частина нереалізованого збитку буде зарахована як «актив» кошика, що призводить до штучного зростання 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, система використовує наступну формулу для розрахунку кількості активів, які підлягають поверненню:
викупити_amount = (user_GLP / всього_GLP_supply) * АУМ
У рахунку AUM (загальний обсяг керованих активів) виконується наступним чином:
AUM = загальна вартість всіх токенів у пулі + глобальні невиконані збитки - глобальні невиконані прибутки - зарезервована сума - попередньо визначене зменшення (aumDeduction)
Цей механізм гарантує, що власники GLP отримують пропорційну частку реальних активів скарбниці.
Проблеми після відкриття важеля
Коли enableLeverage увімкнено, користувач може відкривати позиції з використанням важелів (довгі або короткі). Зловмисник відкрив велику коротку позицію WBTC перед викупом GLP.
Оскільки коротка позиція одразу збільшує загальний обсяг коротких позицій, а ціна ще не змінилася, система за замовчуванням вважає цю коротку позицію збитковою, і ця частина нереалізованого збитку буде зарахована як «актив» кошика, що призводить до штучного зростання AUM. Хоча кошик насправді не отримав додаткової вартості, розрахунок викупу базуватиметься на цьому завищеному AUM, що дозволяє зловмиснику отримати активів значно більше, ніж він заслуговує.
Процес атаки
атака на транзакцію
Написано в кінці
Ця атака виявила серйозні недоліки GMX в механізмі кредитного плеча та дизайні захисту від повторних викликів. Основною проблемою є надмірна довіра до логіки викупу активів щодо AUM, яка недостатньо ретельно перевіряє його складові частини (такі як нереалізовані збитки). Одночасно, ключові функції не мають обов'язкової перевірки припущень щодо особи виконавця (EOA проти контракту). Ця подія ще раз нагадує розробникам, що при здійсненні фінансово чутливих операцій необхідно забезпечити, щоб стан системи не міг бути маніпульованим, особливо при впровадженні складної фінансової логіки (такої як кредитне плече, деривативи), необхідно суворо запобігати системним ризикам, пов'язаним з повторними викликами та забрудненням стану.