
BlockSec: GMX 공격 원리 분석
작성: BlockSec
GMX가 해킹을 당해 4000만 달러 이상의 손실이 발생했습니다. 공격자는 재진입 취약점을 이용하여 레버리지 기능이 활성화된 상태에서 숏 포지션을 개설함으로써 공격을 수행했습니다.
문제의 근본 원인은 executeDecreaseOrder 함수의 오용에 있습니다. 이 함수의 첫 번째 인수는 외부 계정(EAO)이어야 하지만, 공격자는 스마트 계약 주소를 전달했습니다. 이를 통해 공격자는 환매 과정 중 시스템에 다시 진입할 수 있었고, 내부 상태를 조작함으로써 실제 보유한 GLP 가치보다 훨씬 많은 자산을 환매할 수 있었습니다.
GLP 정상 환매 메커니즘
GMX에서 GLP는 유동성 제공자 토큰으로, 금고 자산(예: USDC, ETH, WBTC)에 대한 지분을 나타냅니다. 사용자가 unstakeAndRedeemGlp를 호출하면 다음 공식에 따라 반환될 자산 수량이 계산됩니다:
redeem_amount = (user_GLP / total_GLP_supply) * AUM
여기서 AUM(운용 자산 총액)은 다음과 같이 계산됩니다:
AUM = 모든 토큰 풀의 총 가치 + 전체 숏 포지션 미실현 손실 - 전체 숏 포지션 미실현 이익 - 예약된 금액 - 사전 설정 감액(aumDeduction)
이 메커니즘은 GLP 보유자가 금고의 실제 자산 지분을 비례적으로 받을 수 있도록 보장합니다.
레버리지 활성화 후의 문제점
enableLeverage가 활성화되면 사용자는 레버리지 포지션(롱 또는 숏)을 개설할 수 있습니다. 공격자는 GLP 환매 전에 대규모 WBTC 숏 포지션을 개설했습니다.
숏 포지션이 개설되자마자 전체 숏 포지션 규모가 증가하게 되며, 가격 변동이 없는 상황에서 시스템은 해당 숏 포지션이 손실 상태라고 간주합니다. 이 미실현 손실은 금고의 "자산"으로 계산되어 AUM을 인위적으로 증가시킵니다. 실제로 금고가 추가 가치를 얻은 것은 아니지만, 환매 계산은 이 과대평가된 AUM을 기반으로 하므로 공격자는 본래 받아야 할 것보다 훨씬 많은 자산을 취득하게 됩니다.
공격 절차
공격 트랜잭션
https://app.blocksec.com/explorer/tx/arbitrum/0x03182d3f0956a91c4e4c8f225bbc7975f9434fab042228c7acdc5ec9a32626ef?line=93


마무리하며
이번 공격은 GMX의 레버리지 메커니즘과 재진입 방어 설계상 심각한 결함을 노출시켰습니다. 핵심 문제는 자산 환매 로직이 AUM에 과도하게 의존하면서 그 구성 요소(예: 미실현 손실)에 대해 충분히 신중한 보안 검사를 수행하지 않았다는 점입니다. 또한 중요한 함수들이 호출자의 신원(EAO vs 계약)에 대한 가정을 강제적으로 검증하지 않은 것도 문제였습니다. 이 사건은 개발자들에게 자금 관련 민감 작업에서는 시스템 상태가 조작되지 않도록 반드시 보장해야 하며, 특히 레버리지, 파생상품 등 복잡한 금융 로직을 도입할 때 재진입과 상태 오염이 초래하는 시스템적 위험을 더욱 엄격히 방어해야 함을 다시 한번 일깨워줍니다.
TechFlow 공식 커뮤니티에 오신 것을 환영합니다
Telegram 구독 그룹:https://t.me/TechFlowDaily
트위터 공식 계정:https://x.com/TechFlowPost
트위터 영어 계정:https://x.com/BlockFlow_News














