7月30日,因为Vyper部分版本中的漏洞,导致Curve、JPEG'd等项目陆续受到攻击,损失总计超过5200万美元。SharkTeam对此事件第一时间进行了技术分析,并总结了安全防范手段,希望后续项目可以引以为戒,共筑区块链行业的安全防线。一、事件分析以JPEG'd被攻击为例:攻击者
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版本的重入锁相关设计不合理,并且没有进行足够全面的功能测试。导致后期使用这些版本的项目中重入锁失效,最终遭受了黑客攻击。
对于本次攻击事件,开发人员在日常开发中应当采取有以下的安全措施:
(1) 项目方需保障功能设计合理并对代码进行全面测试,防止遗漏某些功能的测试。
(2) 项目发版前,需要向第三方专业的审计团队寻求技术帮助。
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>
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!