在2025年2月23日,Hegic期权协议遭到攻击,导致损失约80,000美元。
Hegic是一个建立在以太坊上的去中心化期权交易协议,使用户能够以无需信任、非托管的方式交易ETH和wBTC等加密资产的看涨期权和看跌期权。它采用点对池模型,流动性提供者将资产存入资金池以为期权合约提供资金。用户可以购买具有可自定义行权价格和期限的期权,而流动性提供者则可以获得溢价和奖励作为回报。
然而,被攻击的合约已经相当老旧,可能未曾投入生产使用。之所以遭到攻击,是因为合约中仍有一些资金 - 数量相当可观。
关键信息
攻击者: https://etherscan.io/address/0x4B53608fF0cE42cDF9Cf01D7d024C2c9ea1aA2e8
漏洞合约: https://etherscan.io/address/0x7094E706E75E13D1E0ea237f71A7C4511e9d270B#code
攻击交易1: https://etherscan.io/tx/0x260d5eb9151c565efda80466de2e7eee9c6bd4973d54ff68c8e045a26f62ea73
攻击交易2: https://etherscan.io/tx/0x444854ee7e7570f146b64aa8a557ede82f326232e793873f0bbd04275fa7e54c
漏洞分析
从攻击交易中可以看出,恶意交易中反复调用了withdrawWithoutHedge
函数。
看起来攻击者只需在一个for循环中调用withdrawWithoutHedge
函数就能够清空合约。这是如何做到的?withdrawWithoutHedge
函数有什么限制吗?让我们来看看withdrawWithoutHedge
函数的源代码。
withdrawWithoutHedge
函数是一个外部函数,它调用了_withdraw
函数。在_withdraw
函数中,我们可以看到要转移的amount
是根据当前"tranche"的t.share
计算的。但是,t.share
在提款后并没有更新。从代码中可以看到,执行当前tranche状态检查的那一行(require(t.state == TrancheState.Open)
)也被注释掉了。
这个漏洞合约是Hegic WBTC看跌期权池合约,这是一个相当老旧的合约,于2022年1月4日部署。但是,这个合约自部署以来几乎没有任何互动。
经验教训
这次攻击表明,协议必须谨慎跟踪和管理遗留或弃用合约中的资金。此外,在任何合约部署到生产环境之前,都应该进行彻底的代码审查和审计,以防止类似的漏洞。