GMX는 해킹 공격을 받아 4천만 달러 이상의 손실을 입었습니다. 공격자는 재진입 취약점을 악용하여 계약의 레버리지 기능이 활성화된 상태에서 공매도 포지션을 개시했습니다.
문제의 근본 원인은 executeDecreaseOrder 함수의 잘못된 사용에 있습니다. 함수의 첫 번째 매개변수는 외부 계정(EOA)이어야 했지만, 공격자는 스마트 계약 주소를 전달했습니다. 이로 인해 공격자는 환매 프로세스 중에 시스템에 다시 진입하여 내부 상태를 조작하고, 궁극적으로 보유한 GLP의 실제 가치를 훨씬 초과하는 자산을 환매할 수 있었습니다.
GLP 정상 구속 메커니즘
GMX에서 GLP는 USDC, ETH, WBTC 등 재무부 자산의 일부를 나타내는 유동성 공급자 토큰입니다. 사용자가 unstakeAndRedeemGlp를 호출하면 시스템은 다음 공식을 사용하여 반환해야 할 자산의 양을 계산합니다.
환매 금액 = (사용자 GLP / 총 GLP 공급량) * AUM
AUM(운용총자산) 계산방법은 다음과 같습니다.
AUM = 모든 토큰 풀의 총 가치 + 글로벌 단기 미실현 손실 - 글로벌 단기 미실현 이익 - 예약 금액 - 기본 공제(aumDeduction)
이 메커니즘은 GLP 보유자가 재무부의 실제 자산에 대해 비례적으로 몫을 받도록 보장합니다.
레버리지 활성화 후 문제 발생
enableLeverage가 활성화되면 사용자는 레버리지 포지션(롱 또는 숏)을 오픈할 수 있습니다. 공격자는 GLP를 환매하기 전에 대규모 WBTC 숏 포지션을 오픈했습니다.
숏 포지션은 오픈되는 순간 글로벌 숏 사이즈를 증가시키므로, 시스템은 가격 변동이 없을 때 숏 포지션이 손실을 보고 있다고 가정합니다. 이 미실현 손실은 금고의 "자산"으로 간주되어 AUM(자산 관리 규모)이 인위적으로 증가합니다. 금고의 실제 가치는 증가하지 않지만, 환매 계산은 이렇게 부풀려진 AUM을 기반으로 이루어지며, 공격자는 자신이 받을 만한 가치를 훨씬 초과하는 자산을 획득할 수 있습니다.
공격 프로세스
거래 공격
https://app.blocksec.com/explorer/tx/arbitrum/0x03182d3f0956a91c4e4c8f225bbc7975f9434fab042228c7acdc5ec9a32626ef?line=93


끝에 쓰여있다
이 공격은 GMX의 레버리지 메커니즘과 재진입 보호 설계의 심각한 결함을 드러냈습니다. 핵심 문제는 자산 환매 로직이 AUM에 지나치게 의존하고, 그 구성 요소(예: 미실현 손실)에 대한 충분한 보안 검사를 수행하지 않는다는 것입니다. 동시에, 주요 기능에는 호출자의 신원 가정(EOA vs. 계약)에 대한 의무적인 검증이 부족합니다. 이 사고는 개발자에게 자금과 관련된 민감한 작업, 특히 레버리지, 파생상품과 같은 복잡한 금융 로직을 도입할 때 시스템 상태 조작을 방지해야 하며, 재진입 및 상태 오염으로 인한 시스템 위험을 엄격하게 방지해야 한다는 점을 다시 한번 일깨워줍니다.
