作者:BlockSec;翻譯:金色財經xiaozou
GMX遭黑客攻擊,損失超4000萬美元。攻擊者利用合約漏洞,在啓用槓桿的情況下建立空頭頭寸實施攻擊。
根本原因在於executeDecreaseOrder函數的調用錯誤:該函數首個參數本應是外部賬戶(EOA),但攻擊者傳入的卻是智能合約地址。這使得攻擊者在贖回過程中操縱內部狀態,最終提取的資產價值遠超其GLP持倉的實際價值。
GLP贖回機制解析(正常情況)
在GMX協議中,GLP作爲流動性提供者代幣,代表金庫資產(如USDC、ETH、WBTC)的份額。
當用戶調用unstakeAndRedeemGlp時,系統通過以下公式計算應返還的資產數量:
贖回金額 = (user_GLP / total_GLP_supply) × 資產管理規模(AUM)
其中資產管理規模(AUM)由以下要素決定:
AUM = token_pool_value總和 + 全局空頭未實現虧損 - 全局空頭未實現收益 - 預留金額 - 配置扣除項(aumDeduction)
該機制確保每位GLP持有者都能按比例獲取金庫總價值的對應份額。
槓桿啓用時的漏洞原理
當enableLeverage功能開啓時,用戶可建立槓桿頭寸(多頭或空頭)。本次事件中,攻擊者在贖回GLP前立即建立了大量WBTC空頭頭寸。
當空頭頭寸建立時,系統會立即增加全局空頭倉位規模。若此時價格尚未波動,系統會默認該空頭處於虧損狀態——這部分虧損被計入金庫資產(即未實現虧損)。因此,儘管沒有實際價值注入金庫,資產管理規模(AUM)卻被虛增。
這種虛增的AUM導致GLP贖回時返還了超出合理範圍的資產。
下圖爲攻擊流程詳解
由於executeDecreaseOrder的首個參數是智能合約(而非外部賬戶EOA),攻擊者能在回調期間執行任意邏輯,從而操縱內部狀態並套取利潤。若該參數是不支持ERC-7702式執行的外部賬戶(EOA),這種基於重入的攻擊便無法實現。
這對我們來說絕對是個安全警示!