BlockSec: GMX 공격 원리 분석

이 기사는 기계로 번역되었습니다
원문 표시
이번 공격은 GMX의 레버리지 메커니즘과 재진입 보호 설계의 심각한 결함을 드러냈습니다.

작성: 블록섹(BlockSec)

GMX가 해커 공격을 당해 4,000만 달러 이상의 손실을 입었습니다. 공격자는 재진입 취약점을 이용해 계약의 레버리지 기능이 활성화된 상태에서 공매도 포지션을 열었습니다.

문제의 근원은 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 계약)도 강제 검증이 부족했습니다. 이 사건은 개발자들에게 자금과 관련된 민감한 작업을 수행할 때는 시스템 상태가 조작되지 않도록 반드시 확인해야 하며, 특히 레버리지나 파생상품과 같은 복잡한 금융 로직을 도입할 때는 재진입 및 상태 오염으로 인한 시스템적 리스크를 엄중히 방지해야 한다는 점을 다시 한 번 상기시켜 줍니다.

출처
면책조항: 상기 내용은 작자의 개인적인 의견입니다. 따라서 이는 Followin의 입장과 무관하며 Followin과 관련된 어떠한 투자 제안도 구성하지 않습니다.
라이크
즐겨찾기에 추가
코멘트