This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
BlockSec:GMX攻撃原理分析
文:BlockSec
GMXはハッキング攻撃に遭い、4000万ドル以上の損失を被りました。攻撃者は再入可能な脆弱性を利用し、契約がレバレッジ機能を有効にしている場合にショートポジションを開設し、攻撃を実行しました。
問題の根源は、executeDecreaseOrder関数が誤って使用されたことにあります。この関数の最初のパラメータは外部アカウント(EOA)であるべきですが、攻撃者はスマートコントラクトアドレスを渡しました。これにより、攻撃者は償還プロセス中にシステムに再入することができ、内部状態を操作し、最終的に償還される資産は実際に保有しているGLPの価値を大幅に上回ることになりました。
GLP の正常な償還メカニズム
GMXにおいて、GLPは流動性提供者トークンであり、金庫資産(USDC、ETH、WBTCなど)に対する持分を表します。ユーザーがunstakeAndRedeemGlpを呼び出すと、システムは次の式を使用して返還すべき資産の数量を計算します:
償還_amount = (user_GLP / 合計_GLP_supply) * AUM
AUM(運用資産総額)の計算方法は次のとおりです:
AUM = すべてのトークンプールの総価値 + グローバルショートの未実現損失 - グローバルショートの未実現利益 - 予約済み金額 - 事前控除(aumDeduction)
このメカニズムは、GLP保有者が金庫の実際の資産の割合に応じて受け取ることを保証します。
レバレッジをオンにした後の問題
enableLeverage がオンになると、ユーザーはレバレッジポジション(ロングまたはショート)を開設できます。攻撃者は GLP を引き出す前に、大口の WBTC ショートポジションを開設しました。
空売りがポジションを開くと、全体の空売りの規模が増加し、価格がまだ変動していない場合、システムはその空売りを損失と見なします。この未実現損失は金庫の「資産」として計上され、AUMが人為的に上昇します。金庫は実際に追加の価値を得ていないにもかかわらず、償還計算はこの虚高のAUMに基づいて行われるため、攻撃者は得るべき資産を大幅に超えたものを得ることになります。
攻撃プロセス
アタックトレード
結びに書く
今回の攻撃は、GMXのレバレッジメカニズムと再入防止設計における深刻な欠陥を明らかにしました。核心的な問題は、資産の償還ロジックがAUMに対して過度に信頼しており、その構成要素(未実現損失など)に対する十分な安全確認が行われていないことです。同時に、重要な関数が呼び出し元の身元(EOA対契約)に対して強制的な検証を欠いていることも問題です。この事件は再び開発者に対して、資金に敏感な操作に関与する際には、システムの状態が操作されることがないようにしなければならないことを思い出させます。特に、レバレッジやデリバティブなどの複雑な金融ロジックを導入する場合、再入と状態汚染によるシステムリスクから厳重に防ぐ必要があります。