GM(Good Morning)X가 해커 공격을 당해 4,000만 달러 이상의 손실을 입었습니다. 공격자는 재진입 취약점을 이용하여 레버리지 기능이 활성화된 상태에서 공매도 포지션을 열었습니다.
문제의 근원은 executeDecreaseOrder 함수가 잘못 사용된 것입니다. 해당 함수의 첫 번째 매개변수는 외부 계정(EOA)이어야 했지만, 공격자는 스마트 계약 주소를 입력했습니다. 이를 통해 공격자는 상환 과정에서 시스템에 재진입하여 내부 상태를 조작하고, 최종적으로 실제 보유한 GLP 가치를 크게 초과하는 자산을 상환받을 수 있었습니다.
GLP 정상 상환 메커니즘
GM(Good Morning)X에서 GLP는 유동성 공급자(LP) 토큰으로, 금고 자산(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


마무리
이번 공격은 GM(Good Morning)X의 레버리지 메커니즘과 재진입 방지 설계의 심각한 결함을 드러냈습니다. 핵심 문제는 자산 상환 로직이 운영자산(AUM)을 지나치게 신뢰하고, 구성 요소(예: 미실현 손실)에 대해 충분히 신중한 보안 검증을 하지 않았다는 것입니다. 또한 핵심 함수는 호출자의 신원(EOA vs 계약)에 대한 가정에 강제 검증이 부족했습니다. 이 사건은 개발자들에게 자금과 관련된 민감한 작업을 수행할 때 시스템 상태가 조작되지 않도록 확실히 해야 하며, 특히 레버리지나 파생상품과 같은 복잡한 금융 로직을 도입할 때는 재진입 및 상태 오염으로 인한 시스템적 리스크를 엄중히 방지해야 한다는 점을 다시 한 번 상기시켜 줍니다.




