一文详解Vyper漏洞5200万美元损失始末

CertiK
CertiK 机构得得号

Aug 03, 2023 Towards Building Trustworthy Blockchain Ecosystems.

摘要: 此次事件造成了5,200万美元被盗,成为了2023年迄今为止金额最高的重入攻击。

有报告称Vyper0.2.15、0.2.16和0.3.0版本存在漏洞,导致Curve上的许多池有遭受重入攻击的风险。该漏洞允许攻击者在移除流动性过程中调用添加流动性函数。

目前,总共有6,930万美元受到影响,其中1,670万美元已被白帽黑客追回。这也意味着此次事件造成了5,200万美元被盗,成为了2023年迄今为止金额最高的重入攻击


事件总结2023年7月30日,专为以太坊虚拟机(EVM)设计的面向合约的编程语言 Vyper编译器0.2.15、0.2.16和0.3.0版本被宣布存在重入锁失效漏洞。多个DeFi项目受到该漏洞的影响,损失总额达5,200万美元。CertiK已确定有六个地址涉及此次事件。第一个(0x172)未能利用区块 17806056中的漏洞。最初的漏洞利用者从Tornado Cash提取了 0.1 ETH,并继续创建攻击合约。然而,一个跑在前面的钱包(0x6Ec21)支付了更多的gas费用,并率先执行了交易,获得了大约6,100枚WETH(1,140 万美元)。

由MEV机器人在前置交易失败的漏洞

来源:Etherscan

该漏洞导致了进一步的损失:EOA 0xDCe5d 获得了价值约2,100万美元的资产。涉案钱包明细如下图:

共有6个项目受到影响,约有6,930万美元被盗走,其中1,670万美元已被归还,总计损失约为5,200万美元。

什么是Vype

Vyper是以太坊虚拟机(EVM)的一种面向合约的pythonic编程语言。Vyper的测试版从2017年就开始有了,但其首个非测试版本是于2020年7月发布的0.2.1版。Solidity是以太坊生态系统中的主流语言,它比Vyper存在的时间要长得多,因此许多社区成员创建了专门使用Solidity运行的工具。根据DeFiLlama的数据显示,在DeFi协议中价值约700亿美元的总锁仓价值(TVL)中,Vyper 智能合约占 21.7 亿美元,而Solidity则占绝大多数,高达674.9亿美元。

根据语言划分的总锁仓价值

来源:DeFiLlama

截至2023年5月10日,Vyper的主导地位从2020年8月的30%高点降至6.27%。尽管Vyper的TVL主导地位明显低于Solidity,但这一事件仍导致6,200万美元受到影响。
不同编程语言在 TVL 中的主导地位来源:DeFiLlama
编译器版本编译器版本是指编程语言编译器的特定版本,编译器将人类可读的源代码转换为机器可读的代码。编译器版本会定期更新,以引入功能、修复漏洞并增强安全性。Vyper语言目前不提供白客漏洞悬赏计划。版本0.2.15 - 0.3.0上文提到的就是Vyper的0.2.15、0.2.16和0.3.0版本中发现了漏洞,导致了多个DeFi项目遭到重入攻击。而最早的Vyper漏洞版本0.2.15发布于2021年7月23日。到同年12月发布0.3.1版时,之前的漏洞已不复存在。 
时间线事件最初开始于北京时间7月30日晚9点10分,攻击者针对Curve上JPEG’d池的交易由于前置运行交易而失败。北京时间7月30日晚10点,JPEG‘d确认pETH-ETH Curve池已被恶意利用。Vyper随后宣布,0.2.15、0.2.16和0.3.0版本包括了一个失效的重入锁。Vyper发布推文后,Metronome和Alchemix也受到了影响。Metronome DAO宣布消息:
北京时间第二天凌晨,Curve Finance在Discord上发布公告称,剩余的资金池不受Vyper Bug的影响,是安全的。Curve Finance在Twitter上宣布,Arbitrum上的一个资金池有可能受到影响,但没有可供恶意行为者执行的有利可图的漏洞,这意味着资金池不太可能受到攻击。CertiK也尚未检测到任何其他利用Vyper漏洞的攻击。
攻击流程以下是以JPEG’d为目标的交易示例:攻击者: 0x6ec21d1868743a44318c3c259a6d4953f9978538攻击合约: 0x466b85b49ec0c5c1eb402d5ea3c4b88864ea0f04#code1. 攻击者首先从Balancer:Vault中借入80,000WETH(约合149,371,300美元)2. 然后,攻击者将WETH换成ETH,调用pETH-ETH-f.add_liquidity(),将 40,000ETH(约合74,685,650美元)添加到pETH-ETH-f池中。作为回报,攻击者收到了32,431枚pETH(pETH-ETH-f)。3. 攻击者调用remove_liquidity()删除了在步骤2中添加的流动性。3,740 pETH和34,316 ETH被转入攻击合约,攻击合约的fallbak() 函数被触发了,将控制权交给了攻击者。在fallback()函数中,攻击者又向pETH-ETH-f池中添加了40,000 ETH的流动性,并收到了82,182 pETH。4. 攻击者再次调用remove_liquidity(),取出10,272pETH,收到47,506 ETH和1,184pETH。然后,攻击者在pETH-ETH-f池中用4,924枚 pETH交换了4,285枚ETH。总的来说,攻击者从第3步获得了34,316枚ETH,从第4步获得了47,506和4,285枚ETH,共计86,107枚ETH。在偿还了80,000ETH闪电贷后,攻击者还剩下6,107ETH(约11,395,506美元)。
漏洞该漏洞允许攻击者在移除流动性过程中调用添加流动性函数。虽然这些函数本应受到@nonreentrant('lock')的保护,但对add_liquidty()和 remove_liquidity() 函数的测试证明,它并不能防止重入攻击。
Vyper_contract for Curve.fi Factory Pool数据源:Etherscan

继利用JPEG'd、Metronome和Alchemix 漏洞之后,Vyper的v0.2.15、v0.2.16和v0.3.0版本确实存在重入保护失败的漏洞
解决措施使用易受攻击的Vyper版本的项目应联系Vyper协助进行缓解。项目也应尽量升级到不含此漏洞的最新版Vyper。

总结Vyper被攻击事件是CertiK2023年检测到的最大的重入漏洞。就资金损失而言,该攻击损失金额占据了此类事件的78.6%。
今年两起最大的重入漏洞,都是利用Vyper编写的合约,尽管漏洞并不相同。目前,2023年所有链中因重入攻击造成的损失已超过6,600万美元。这比2020年全年多出约400万美元,仅比2021年的损失额少100万美元。值得注意的是,2023年的总额也比2022年因重新定位攻击造成的损失增加了259.45%。

链得得仅提供相关信息展示,不构成任何投资建议
本文系作者 CertiK 授权链得得发表,并经链得得编辑,转载请注明出处、作者和本文链接

更多精彩内容,关注链得得微信号(ID:ChainDD),或者下载链得得App

分享到:

相关推荐

    评论(0

    Oh! no

    您是否确认要删除该条评论吗?

    分享到微信