GMX 遭受黑客入侵,造成超过 4000 万美元的损失。攻击者利用了一个可重入漏洞,并在合约启用杠杆功能的情况下建立空头头寸来实施攻击。问题的核心在于 executeDecreaseOrder 函数的错误使用。该函数的第一个参数应该是外部账户(EOA),但攻击者传入了一个智能合约地址。这使得攻击者能够在赎回过程中重新进入系统,操纵内部状态,最终赎回的资产远超其实际持有的 GLP 价值。在 GMX 中,GLP 是流动性提供者代币,代表对金库资产(如 USDC、ETH、WBTC)的份额。正常情况下,当用户赎回 GLP 时,系统会根据用户持有的 GLP 占比和当前管理资产总额(AUM)计算应返还的资产数量。AUM 的计算包括所有代币池的总价值、全局空头未实现损益、已预留金额和预设扣减等因素。然而,当启用杠杆功能后,系统出现了漏洞。攻击者在赎回 GLP 之前,开设了大额的 WBTC 空头头寸。由于空头一开仓就增加了全局空头规模,在价格尚未变动的情况下,系统默认该空头处于亏损状态。这部分未实现亏损被错误地计入金库的"资产",导致 AUM 人为上升。尽管金库实际上并未获得额外价值,但赎回计算却基于这个虚高的 AUM,使得攻击者获得了远超其应得的资产。这次攻击暴露了 GMX 在杠杆机制与可重入保护设计上的严重缺陷。核心问题在于资产赎回逻辑对 AUM 的信任过高,未对其组成部分(如未实现亏损)进行足够审慎的安全校验。同时,关键函数对调用者身份的假设(EOA vs 合约)也缺乏强制性验证。这一事件再次提醒开发者,在涉及资金敏感操作时,必须确保系统状态不可被操纵。特别是在引入复杂金融逻辑(如杠杆、衍生品)时,更需严防重入与状态污染带来的系统性风险。开发团队应该重新审视其合约设计,加强安全措施,并考虑引入更严格的身份验证和状态检查机制,以防止类似攻击再次发生。
GMX遭黑客攻击 可重入漏洞致损4000万美元
GMX 遭受黑客入侵,造成超过 4000 万美元的损失。攻击者利用了一个可重入漏洞,并在合约启用杠杆功能的情况下建立空头头寸来实施攻击。
问题的核心在于 executeDecreaseOrder 函数的错误使用。该函数的第一个参数应该是外部账户(EOA),但攻击者传入了一个智能合约地址。这使得攻击者能够在赎回过程中重新进入系统,操纵内部状态,最终赎回的资产远超其实际持有的 GLP 价值。
在 GMX 中,GLP 是流动性提供者代币,代表对金库资产(如 USDC、ETH、WBTC)的份额。正常情况下,当用户赎回 GLP 时,系统会根据用户持有的 GLP 占比和当前管理资产总额(AUM)计算应返还的资产数量。AUM 的计算包括所有代币池的总价值、全局空头未实现损益、已预留金额和预设扣减等因素。
然而,当启用杠杆功能后,系统出现了漏洞。攻击者在赎回 GLP 之前,开设了大额的 WBTC 空头头寸。由于空头一开仓就增加了全局空头规模,在价格尚未变动的情况下,系统默认该空头处于亏损状态。这部分未实现亏损被错误地计入金库的"资产",导致 AUM 人为上升。尽管金库实际上并未获得额外价值,但赎回计算却基于这个虚高的 AUM,使得攻击者获得了远超其应得的资产。
这次攻击暴露了 GMX 在杠杆机制与可重入保护设计上的严重缺陷。核心问题在于资产赎回逻辑对 AUM 的信任过高,未对其组成部分(如未实现亏损)进行足够审慎的安全校验。同时,关键函数对调用者身份的假设(EOA vs 合约)也缺乏强制性验证。
这一事件再次提醒开发者,在涉及资金敏感操作时,必须确保系统状态不可被操纵。特别是在引入复杂金融逻辑(如杠杆、衍生品)时,更需严防重入与状态污染带来的系统性风险。开发团队应该重新审视其合约设计,加强安全措施,并考虑引入更严格的身份验证和状态检查机制,以防止类似攻击再次发生。