头条
本次攻击事件根本原因是:一是新 Market 未初始化流动性,造成流动性可控;二是数值计算问题,存在精度损失问题。
撰文:SharkTeam
北京时间 2023 年 11 月 1 日,由于 redeemUnderlying() 函数存在精度损失漏洞,Ethereum 链上项目 Onyx Protocol 遭受攻击,攻击者已获利 210 万美元。
SharkTeam 对此事件第一时间进行了技术分析,并总结了安全防范手段,希望后续项目可以引以为戒,共筑区块链行业的安全防线。
攻击者地址:
0x43083E943cd4D35F242F7850bE2402126A57D6B5
0x30E4d4e89369cf4D91cB675448Db0B2f126c1caF
0x085bDfF2C522e8637D4154039Db8746bb8642BfF
0x4C9C8661243E9E9a15A35B8873317eb881330c98
攻击合约:
0x526e8e98356194b64eae4c2d443cc8aad367336f
攻击交易:
0xf7c21600452939a81b599017ee24ee0dfd92aaaccd0a55d02819a7658a6ef635
攻击流程:
(1) 攻击者(0x085bDfF2)在攻击之前提议了一个关于在 Onyx 中建立新的 Market:PEPE。
(2)攻击者(0x085bDfF2)通过闪电贷,贷了 4,000 枚 WETH。随后,利用所贷的 WETH 兑换成 PEPE。
(3)攻击者(0x085bDfF2)通过 Create2 方式创建了合约(0xf8e15371),将 1 枚 PEPE 代币存入 oPEPE 池里,铸造了 50,000,000,000,000,000,000 枚 oPEPE 代币。随后,攻击者(0x085bDfF2)redeem 了大量的 oPEPE,并留有 2wei 的 oPEPE。攻击者(0x085bDfF2)又从其他的 Market 中借了一些 ETH。
(4)攻击者(0x085bDfF2)利用 redeemUnderlying() 函数中的精度损失漏洞,赎回大量的 PEPE,留有 1 枚 oPEPE。然后,攻击者(0x085bDfF2)清算了自己,并且重置了 Market 的状态。
(5)攻击者(0x085bDfF2)重复上述 3 和 4 的方式,归还闪电贷,最终获利约 1156 枚 ETH。
在攻击之前,OnyxProtrol 引入了新的 Market-oPEPE。此时的 Market 没有初始流动性。这样,攻击者(0x085bDfF2)就能够在具有可控流动性的 oPEPE 池中实施漏洞攻击。redeemUnderlying() 函数在计算相关数值时候存在四舍五入,从而获得巨额利润。
本次攻击事件根本原因是:一是新 Market 未初始化流动性,造成流动性可控;二是数值计算问题,存在精度损失问题。
针对本次攻击事件,开发人员在日常开发中应当采取有以下的缓解措施:
(1)对于部分使用数学计算的函数,需要进行精度损失测试。由于可能存在多个函数相互调用和多次计算,会导致相应的数值损失;
(2)项目上线前,需要通过第三方专业的审计团队进行智能合约审计。