Эксперты Certik рассказали подробности атаки на платформу GMX и кражи $42 млн

Чуть более недели назад протокол GMX подвергся сложной атаке. Белая шляпа (этичный хакер) воспользовался уязвимостью в смарт-контракте и вывел около $42 млн. Злоумышленник применил технику повторного входа (reentrancy), чтобы обойти систему учета коротких позиций. Через 2 дня он связался с командой и вернул большую часть средств. В качестве благодарности GMX выплатил ему 10% от суммы в виде награды.
Атака затронула старую версию хранилища протокола GMX V1. Хакер сначала создал и застейкал токены GLP, а затем открыл шорт-позицию, напрямую взаимодействуя с контрактом. Это позволило обойти механизм ShortsTracker, который обновляет среднюю цену шортов. В результате расчет активов под управлением (AUM) был искусственно завышен. Это дало возможность обналичить токены GLP по завышенной стоимости.
Разработчики GMX ранее исправили крупную уязвимость, разделив обновление данных между 2-мя контрактами. Однако новое решение оставило лазейку. Из-за разных уровней исполнения, хакер смог инициировать операции в правильной последовательности, чтобы обойти обновление средней цены. Он создал шорт-позицию в момент повторного входа, а затем повторил процедуру несколько раз, добившись масштабного искажения показателей.
Кульминацией атаки стал момент, когда хакер взял флеш-займ на $7,5 млн, использовал $6 млн для создания GLP, а остальное — для новой шорт-позиции. Из-за манипуляций со средней ценой показатель AUM вырос в 20 раз. Это позволило обменять GLP на цифровые активы по завышенной цене. Позже злоумышленник сжег GLP и изъял токены из пула, выведя сумму, в 19 раз превышающую внесенную.
Средства были распределены по 5 кошелькам и конвертированы в ETH. Всего хакер вернул GMX 10 000 эфиров и оставил себе около 1700 монет как награду за обнаружение уязвимости. Это стандартная практика в рамках ответственного раскрытия ошибок безопасности. Команда GMX заявила, что усиливает проверку кода и будет вводить дополнительные меры защиты. Пользователи не пострадали, и ликвидность была восстановлена.