CertiK:Vyper 损失 5200 万美元,事件详解

CertiK:Vyper 损失 5200 万美元,详解事件。

Vyper漏洞导致Curve上的重入攻击事件概述

2023年7月30日,以太坊虚拟机(EVM)专用的面向合约的编程语言Vyper的0.2.15、0.2.16和0.3.0版本被揭示存在重入锁失效漏洞。许多Curve上的资金池由于这个漏洞面临遭受重入攻击的风险。攻击者利用该漏洞,在移除流动性的过程中调用添加流动性函数,导致大量资金被盗取。

根据报告,该事件导致总共6930万美元的资金遭到影响,其中已经有1670万美元被白帽黑客追回,但5200万美元则变成了2023年迄今为止金额最高的重入攻击事件。

原始图片链接1:点击此处查看图片。

原始图片链接2:点击此处查看图片。

事件背景与概述

Vyper是一种面向以太坊虚拟机(EVM)的面向合约的Pythonic编程语言。虽然Vyper的测试版已经在2017年推出,但首个非测试版本直到2020年7月的0.2.1版才发布。

与已经存在较长时间的Solidity相比,Vyper的市场份额较小,因此有许多社区成员创造了专门运行在Solidity上的工具。根据DeFiLlama的数据,Vyper智能合约在总价值约700亿美元的DeFi协议总锁仓价值(TVL)中,只占据了21.7亿美元,而Solidity则占据了绝大多数,高达674.9亿美元。

原始图片链接3:点击此处查看图片。

截至2023年5月10日,Vyper的主导地位从2020年8月的30%高点降至6.27%。尽管Vyper在TVL中的份额明显低于Solidity,但本次事件仍导致6200万美元受到影响。

原始图片链接4:点击此处查看图片。

Vyper编译器版本

编译器版本指的是编程语言编译器的特定版本,编译器能将人类可读的源代码转换为机器可读的代码。

编译器版本会定期更新,以引入新功能、修复漏洞和增强安全性。Vyper语言目前没有提供白帽黑客漏洞悬赏计划。

版本0.2.15-0.3.0是指Vyper的0.2.15、0.2.16和0.3.0版本中发现的漏洞,导致许多DeFi项目遭到重入攻击。

原始图片链接5:点击此处查看图片。

时间线

事件最初开始于北京时间7月30日晚9点10分,攻击者对Curve上JPEG’d池的交易由于前置运行交易而失败。

原始图片链接6:点击此处查看图片。

北京时间7月30日晚10点,JPEG‘d确认pETH-ETH Curve池已被恶意利用。

原始图片链接7:点击此处查看图片。

随后,Vyper宣布0.2.15、0.2.16和0.3.0版本存在失效的重入锁。此后,Metronome和Alchemix也受到了影响。

Metronome DAO宣布消息。

原始图片链接8:点击此处查看图片。

北京时间第二天凌晨,Curve Finance在Discord上发布公告称,其剩余资金池不受Vyper的漏洞影响,是安全的。

原始图片链接9:点击此处查看图片。

Curve Finance在Twitter上宣布,Arbitrum上的一个资金池有可能受到影响,但目前还没有恶意行为者可以利用的有利可图漏洞,这意味着资金池不太可能受到攻击。此外,CertiK尚未检测到其他利用Vyper漏洞的攻击。

原始图片链接10:点击此处查看图片。

攻击流程

以下是针对JPEG’d的交易的攻击示例:

  • 攻击者地址:0x6ec21d1868743a44318c3c259a6d4953f9978538
  • 攻击合约地址:0x466b85b49ec0c5c1eb402d5ea3c4b88864ea0f04
  1. 攻击者首先从Balancer的Vault中借入80,000 WETH(约等于149,371,300美元)。
  2. 然后,攻击者将WETH换成ETH,调用pETH-ETH-f.add_liquidity()函数,将40,000 ETH(约等于74,685,650美元)添加到pETH-ETH-f池中。作为回报,攻击者获得32,431枚pETH。
  3. 攻击者调用remove_liquidity()函数,删除第2步添加的流动性。攻击者将3,740枚pETH和34,316 ETH转入攻击合约,触发了攻击合约的fallback()函数,将控制权交给了攻击者。在fallback()函数中,攻击者又向pETH-ETH-f池中添加了40,000 ETH的流动性,并收到了82,182枚pETH。
  4. 攻击者再次调用remove_liquidity()函数,取出10,272枚pETH,获得47,506 ETH和1,184枚pETH。然后,攻击者用4,924枚pETH在pETH-ETH-f池中交换了4,285枚ETH。

综上所述,攻击者通过上述过程获得了34,316枚ETH和47,506枚ETH以及4,285枚ETH,共计86,107枚ETH。在偿还了80,000 ETH的闪电贷后,攻击者还剩下6,107 ETH(约等于11,395,506美元)。

漏洞描述与解决措施

该漏洞允许攻击者在移除流动性的过程中调用添加流动性函数。尽管这些函数本应受到@nonreentrant('lock')的保护,但对add_liquidity()remove_liquidity()函数的测试证明,这并不能防止重入攻击。

原始图片链接11:点击此处查看图片。

继利用JPEG’d、Metronome和Alchemix漏洞之后,Vyper的v0.2.15、v0.2.16和v0.3.0版本确实存在重入保护失败的漏洞。

由于使用易受攻击的Vyper版本的项目应该与Vyper协调进行缓解,建议项目尽快升级到没有该漏洞的最新版本的Vyper。

事件总结及趋势

Vyper的重入漏洞事件是CertiK在2023年检测到的最大的重入漏洞。就资金损失而言,该攻击占据了同类型事件的78.6%。

今年出现了两起最大的重入漏洞,都是利用Vyper编写的合约,尽管漏洞并不相同。

截至目前,2023年发生的由重入攻击导致的损失金额已超过6600万美元。这比2020年全年多出约400万美元,仅比2021年的损失少100万美元。需要注意的是,2023年的损失总额比2022年由重定位攻击造成的损失增加了259.45%。