SharkTeam:Vyper 漏洞导致 Curve 和 JPEG'd 等项目被攻击原理分析
Web3
PoS
Moonbeam
7 月 30 日,因为 Vyper 部分版本中的漏洞,导致 Curve、JPEG'd 等项目陆续受到攻击,损失总计超过 5200 万美元。
撰文:SharkTeam
7 月 30 日,因为 Vyper 部分版本中的漏洞,导致 Curve、JPEG'd 等项目陆续受到攻击,损失总计超过 5200 万美元。
SharkTeam 对此事件第一时间进行了技术分析,并总结了安全防范手段,希望后续项目可以引以为戒,共筑区块链行业的安全防线。
事件分析
以 JPEG'd 被攻击为例:
攻击者地址:0x6ec21d1868743a44318c3c259a6d4953f9978538
攻击者合约:0x9420F8821aB4609Ad9FA514f8D2F5344C3c0A6Ab
攻击交易:0xa84aa065ce61dbb1eb50ab6ae67fc31a9da50dd2c74eefd561661bfce2f1620c
(1)攻击者(0x6ec21d18)创建 0x466B85B4 的合约,通过闪电贷向 [Balancer: Vault]借了 80,000 枚 WETH。
(2)攻击者(0x6ec21d18)向 pETH-ETH-f(0x9848482d)流动性池中添加了 40,000 枚 WETH,获得 32,431 枚 pETH。
(3)随后攻击者(0x6ec21d18)从 pETH-ETH-f(0x9848482d)流动性池中重复地移除流动性。
(4)最终,攻击者(0x6ec21d18)获得 86,106 枚 WETH,归还闪电贷后,获利 6,106 枚 WETH 离场。
二、漏洞分析
(1)该攻击是典型的重入攻击。对遭受攻击的项目合约进行字节码反编译,我们从下图可以发现:add_liquidity 和 remove_liquidity 两个函数在进行校验存储槽值时,所要验证的存储槽是不一样的。使用不同的存储槽,重入锁可能会失效。此时,怀疑是 Vyper 底层设计漏洞。
(2)结合 Curve 官方的推文所说。最终,定位是 Vyper 版本漏洞。该漏洞存在于 0.2.15、0.2.16、0.3.0 版本中,在重入锁设计方面存在缺陷。我们对比 0.2.15 之前的 0.2.14 以及 0.3.0 之后的 0.3.1 版本,发现这部分代码在不断更新中,老的 0.2.14 和交心的 0.3.1 版本没有这个问题。
(3)在 Vyper 对应的重入锁相关设置文件 data_positions.py 中,storage_slot 的值会被覆盖。在 ret 中,第一次获取锁的 slot 为 0,然后再次调用函数时会将锁的 slot 加 1,此时的重入锁会失效。
漏洞总结:本次攻击事件根本原因是 Vyper 的 0.2.15、0.2.16、0.3.0 版本的重入锁相关设计不合理,并且没有进行足够全面的功能测试。导致后期使用这些版本的项目中重入锁失效,最终遭受了黑客攻击。
安全建议
对于本次攻击事件,开发人员在日常开发中应当采取有以下的安全措施:
项目方需保障功能设计合理并对代码进行全面测试,防止遗漏某些功能的测试。
项目发版前,需要向第三方专业的审计团队寻求技术帮助。
About Us
SharkTeam 的愿景是全面保护 Web3 世界的安全。团队由来自世界各地的经验丰富的安全专业人士和高级研究人员组成,精通区块链和智能合约的底层理论,提供包括智能合约审计、链上分析、应急响应等服务。已与区块链生态系统各个领域的关键参与者,如 Polkadot、Moonbeam、polygon、OKC、Huobi Global、imToken、ChainIDE 等建立长期合作关系。
官网:https://www.sharkteam.org
Twitter:https://twitter.com/sharkteamorg
Discord:https://discord.gg/jGH9xXCjDZ
Telegram:https://t.me/sharkteamorg
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表Bi123的观点或立场