DeFi. Безопасность. Взлом GXM. Разбор двух постмортем
Перевод
Это вольный перевод двух важных отчётов:
Перевод отчёта GMX
9 июля 2025 года в 12:30 по UTC в версии GMX V1 на Arbitrum произошёл эксплойт на сумму около $40 миллионов. Транзакция эксплойта: Arbiscan
Причина
По результатам анализа инцидента, проведённого контрибьюторами, аудиторами и исследователями в сфере безопасности, корень проблемы — атака с использованием пе-реентерабельности (reentrancy attack).
Точка входа: OrderBook.sol, строка 874.
Хотя данная функция защищена модификатором nonReentrant, эта защита работает только в рамках текущего контракта (OrderBook), и не препятствует внешним вызовам.
Злоумышленник использовал пер-реентерабельность, чтобы напрямую вызвать функцию increasePosition в контракте Vault.
В обычной ситуации increasePosition может быть вызвана только из контрактов PositionRouter и PositionManager, поскольку именно они обеспечивают корректный расчёт средней цены по шортам.
Цена GLP зависит от незакрытого PnL, который рассчитывается на основе средней цены шортов.
Используя reentrancy и обходя корректные расчёты средней цены, злоумышленник смог открыть позиции и искусственно занизить среднюю цену по BTC — с $109,505.77 до $1,913.70.
Дальнейшие действия злоумышленника
Благодаря заниженной средней цене по шортам, убытки по шорт-позициям вычислялись как: 15,385,676 * (1913.70 - 108,757.787) / 1913.70 = 859,000,107.173: где 108,757.787 — актуальная цена BTC по оракулу.
В результате цена GLP взлетела выше $27, после чего злоумышленник выкупил ранее созданный GLP по завышенной цене и получил прибыль.
Первые меры
- Сразу после обнаружения атаки сигнал поступил от Hexagate.
- Торговля на Avalanche была приостановлена, чтобы предотвратить аналогичную атаку.
- Были уведомлены: Arbitrum, централизованные биржи, мосты, Circle, Tether и Frax, чтобы помочь с отслеживанием и заморозкой украденных средств.
- Отправлено on-chain сообщение хакеру: Arbiscan.
Прим. Menaskop: сама строка записана так:
0x57652061636b6e6f776c656467652074686520726563656e7420474d58205631206578706c6f69742e200a0a57652077616e7420746f206f666665722061203130252077686974652d68617420626f756e747920666f72207468652072657475726e206f6620746865206578706c6f697465642066756e64732e0a0a4966207468652072656d61696e696e6720393025206f662066756e6473206172652072657475726e65642077697468696e20343820686f7572732c20776520636f6d6d697420746f207075727375696e67206e6f2066757274686572206c6567616c20616374696f6e2e0a0a506c6561736520636f6e74616374207573207365637572656c79202620616e6f6e796d6f75736c793a0a456d61696c3a20736563757269747940676d782e696f0a4f6e2d636861696e2028474d58204465706c6f7965723a20307835463739396633363546613841324236306163303432394334384231353363413561366630436638290a496d6d756e656669202868747470733a2f2f696d6d756e6566692e636f6d2f6275672d626f756e74792f676d782f696e666f726d6174696f6e2f290a0a57652075726765206120737769667420616e64206574686963616c207265736f6c7574696f6e20746f207468697320736974756174696f6e2e.
В переводе на обычный языке читаем:
"We acknowledge the recent GMX V1 exploit. We want to offer a 10% white-hat bounty for the return of the exploited funds. If the remaining 90% of funds are returned within 48 hours, we commit to pursuing no further legal action. Please contact us securely & anonymously: Email: security@gmx.io. On-chain (GMX Deployer: 0x5F799f365Fa8A2B60ac0429C48B153cA5a6f0Cf8). Immunefi (https://immunefi.com/bug-bounty/gmx/information). We urge a swift and ethical resolution to this situation."
«Мы подтверждаем недавний взлом GMX V1. Мы предлагаем 10% вознаграждение за возвращение похищенных средств. Если оставшиеся 90% средств будут возвращены в течение 48 часов, мы обязуемся не предпринимать дальнейших юридических действий. Пожалуйста, свяжитесь с нами безопасно и анонимно: Электронная почта: security@gmx.io. On-chain (GMX Deployer: 0x5F799f365Fa8A2B60ac0429C48B153cA5a6f0Cf8). Immunefi (https://immunefi.com/bug-bounty/gmx/information). Мы призываем к быстрому и этичному разрешению этой ситуации».
Безопасность GMX V2
- GMX V2 был про-аудирован, чтобы проверить наличие аналогичной уязвимости.
- В GMX V2 проблема отсутствует, так как расчёт средней цены шортов выполняется внутри того же контракта, где совершается ордер.
- В GMX V1 расчёты были вынесены в отдельный контракт Vault, который нельзя было обновлять.
- В GMX V2 контракты обновляемы через Timelock.
Меры предосторожности
- Во время атаки были снижены лимиты на выпуск токенов ликвидности GMX V2 (Arbitrum и Avalanche), чтобы ограничить выпуск новых ассетов.
- После устранения причины и проверки V2 — лимиты были возвращены.
Следующие шаги
- В GLP-пуле на Arbitrum остаётся около $3.6 млн (зарезервированы под открытые позиции)
- Также имеется около $500k комиссий, из которых 30% уже направлены держателям GMX. Оставшаяся часть будет переведена в DAO-казну для компенсации.
Дальнейшие действия
- Минтинг и выкуп GLP на Arbitrum будут отключены.
Транзакция для отключения уже отправлена и вступит в силу после 24 часов (по Timelock). - Минтинг GLP на Avalanche будет отключен, но выкуп останется доступным.
- После отключения выкупа на Arbitrum, закрытие позиций станет доступным на обоих сетях.
- Открытие новых V1-позиций останется запрещённым.
- Все существующие V1-ордера на Arbitrum и Avalanche перестанут исполняться — пользователям следует их отменить.
- После закрытия всех V1-позиций, оставшиеся средства в GLP на Arbitrum будут направлены в пул компенсаций пострадавшим.
Затем будет инициировано обсуждение в GMX DAO по поводу дополнительных компенсаций.
GLP, используемый для вестинга esGMX
- Пользователи, участвующие в вестинге esGMX с помощью GLP, могут продолжать это делать.
- На Avalanche выкуп GLP остаётся доступным. Рекомендуется выкупить GLP, если он не используется для вестинга.
Важное замечание для всех форков GMX V1
По результатам анализа, уязвимость может быть предотвращена следующими действиями:
- Отключение плеча:
Через Vault.setIsLeverageEnabled(false)
или Timelock.setShouldToggleIsLeverageEnabled(false) - Ограничение GLP минтинга:
Установить maxUsdgAmounts на "1" через Vault.setTokenConfig или Timelock.setTokenConfig. (Важно: именно "1", а не "0" — ноль означает отсутствие лимита)
Мы настоятельно рекомендуем всем форкам GMX V1 внедрить эти меры, если они ещё не реализованы.
Торговля и минтинг эквивалентов GLP должны быть разрешены только после аудита и устранения уязвимости.
Перевод отчёта от PeckShield
Анализ инцидента с эксплойтом GMX V1 на Arbitrum уже опубликован, и мы хотим поделиться своими мыслями:
- Точка входа для атаки находилась по адресу:
https://github.com/gmx-io/gmx-contracts/blob/master/contracts/core/OrderBook.sol#L874, а не на строке #L764, как считалось ранее. - Хотя в эксплойте действительно использовалась пе-реентерабельность (Прим. Menaskop: реентерабельность (reentrancy) в программировании - свойство функции или метода, которое позволяет безопасно прервать его выполнение и повторно вызвать, прежде чем предыдущий вызов завершится (reentrancy)), суть уязвимости совпадает с природой бага, за обнаружение которого в 2022 году GMX выплатила вознаграждение в размере $1 млн фонду ColliderVC (ссылка на подробности).
- Речь идёт о не атомарном обновлении двух взаимосвязанных состояний: общего объёма шортов (global short size) и средней цены по этим шортам (average global short price).
Остаётся открытым вопрос: не был ли текущий баг вызван патчем, призванным устранить баг за $1 млн в 2022 году?
См. также: collider.vc/post/gmx-granted-million-dollar-bug-bounty-to-collider-the-bug-aftermath.