【英文长推】解读 GMX 4000 万美元被盗背后的合约漏洞
Chainfeeds 导读:
在涉及资产分配与回调逻辑时,必须严格限制可调用身份,审慎处理合约与 EOA 的权限边界。
文章来源:
文章作者:
BlockSec
观点:
BlockSec:在 GMX 协议中,GLP 是平台用于表示流动性提供者持仓份额的代币。它对应着 GMX 金库中真实的资产,如 USDC、ETH 和 WBTC。当用户希望退出流动性时,会调用 unstakeAndRedeemGlp 函数赎回资产。此时,系统会根据用户持有的 GLP 占比,以及金库当前管理的总资产(AUM,Assets Under Management)来计算应返还的资产数量。具体公式为:赎回金额 =(用户持有的 GLP / 总 GLP 供应量)× AUM。其中,AUM 并非简单的资产加总,它还包含了衍生品市场上的浮动盈亏。系统会将全局空头持仓的未实现亏损视为一种潜在资产计入 AUM,而将未实现利润视为潜在负债进行扣除。此外,还需扣除一部分保留金与预设的手续费项。这一机制在理论上确保每位 LP(流动性提供者)都能根据其实际贡献,从金库中公平提取自身应得的价值。然而,正是这套以市场状态估值驱动的 AUM 动态计算机制,在杠杆交易开启后,被攻击者用来构造虚假账面价值,从而打破了赎回公平的基础。 当 GMX 的 enableLeverage 开关开启后,用户便可开设杠杆多头或空头仓位。这项功能虽然提高了协议的资本利用效率,却引入了意料之外的攻击面。攻击者利用该逻辑,先在 GLP 赎回前,快速开设了一笔巨额的 WBTC 空头头寸。由于在价格尚未波动的瞬间,系统默认空头仓位是亏损的(即其开仓价格高于市场价),这一未实现亏损会立即作为虚拟资产计入 AUM,直接抬高金库的账面价值。尽管实际上并未有资金流入,但赎回逻辑会基于膨胀后的 AUM 计算赎回价值,从而导致攻击者可凭借其 GLP 获得远超实际价值的资产份额。换句话说,攻击者制造了一个虚高账本,再以 GLP 持仓身份将超额资产提取走,达成了几乎无风险套利。整个攻击流程围绕一个核心逻辑:利用系统在 AUM 计算中对空头亏损的默认假设,将未来可能发生的价格变动风险反向固化为当下的账面利润,并借此实现虚假价值兑现。 此次攻击的技术核心在于 GMX 合约中 executeDecreaseOrder 函数的第一个参数设计不当。该参数原本设想是用户地址(即外部拥有账户 EOA),但合约未对其进行严格限制,攻击者通过传入一个自定义智能合约地址,实现了回调阶段的恶意逻辑注入。当合约执行到资产赎回回调时,攻击者智能合约在这一过程中利用可重入机制修改了内部状态,成功操纵了金库的行为,套取超额资产。如果该参数在设计上强制为 EOA,或采用了更严格的合约执行沙盒限制(例如拒绝 ERC-7702 风格的外部合约逻辑调用),则此次攻击将无法成立。这类问题在 Web3 世界中屡见不鲜,源于智能合约调用路径的开放性与高度可组合性。开发者往往为了提升模块复用性或支持合约账户操作,而未进行充分的执行上下文隔离或身份类型校验,进而引发攻击向量。此次 GMX 事件表明,即便是主流 DeFi 项目,在合约接口设计、权限验证与执行环境隔离方面仍可能存在盲区。攻击者正是利用了这种默认信任的漏洞,借智能合约执行期的时序优势完成了对协议资产规则的扭曲与抽离。【原文为英文】
免责声明:文章中的所有内容仅代表作者的观点,与本平台无关。用户不应以本文作为投资决策的参考。
你也可能喜欢
GMX被盗4200万美元为何未引发中文社区关注?

顶级量化交易巨头Jane Street因算法操纵被罚484亿,对加密行业有何启示?

代币化股票市场被“踩刹车”:美SEC委员澄清代币化证券仍属证券范畴

从技术、场景和资本三大趋势出发,解读当前热门AI新项目
