CertiK:Vyper 5200萬美元損失事件詳解

有報告稱Vyper 0.2.15、0.2.16 和0.3.0 版本存在漏洞,導致Curve 上的許多池有遭受重入攻擊的風險。該漏洞允許攻擊者在移除流動性過程中調用添加流動性函數。

目前,總共有6,930萬美元受到影響,其中1,670萬美元已被白帽黑客追回。這也意味著此次事件造成了5,200萬美元被盜,成為了2023年迄今為止金額最高的重入攻擊。

Vyper Incident Anaylsis

事件總結

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 萬美元)。

YLsgfOUBbfcQ6Pgy77tT2prtmsSHe2U4s7HpuCV3.png

由MEV機器人在前置交易失敗的漏洞來源:Etherscan Etherscan

該漏洞導致了進一步的損失:EOA 0xDCe5d 獲得了價值約2,100 萬美元的資產。涉案錢包明細如下圖:

BQybD6x7JDeb56tNYa5gp3antJdgtukOJp5C71Gw.png

共有6個項目受到影響,約有6,930萬美元被盜走,其中1,670萬美元已被歸還,總計損失約為5,200萬美元。

什麼是Vyper

Vyper 是以太坊虛擬機(EVM)的一種面向合約的pythonic 編程語言。 Vyper 的測試版從2017 年就開始有了,但其首個非測試版本是於2020年7月發布的0.2.1 版。

Solidity是以太坊生態系統中的主流語言,它比Vyper存在的時間要長得多,因此許多社區成員創建了專門使用Solidity 運行的工具。根據DeFiLlama 的數據顯示,在DeFi協議中價值約700 億美元的總鎖倉價值(TVL)中,Vyper 智能合約佔21.7 億美元,而Solidity 則佔絕大多數,高達674.9 億美元。

KjMot1urT10BOZJi8lgltDDN62IMhxVncPFncjoP.png

616cb7f4-e84a-479f-bd50-73e2adaec534 根據語言劃分的總鎖倉價值來源:DeFiLlama

截至2023年5月10日,Vyper的主導地位從2020 年8月的30%高點降至6.27%。儘管Vyper的TVL 主導地位明顯低於Solidity,但這一事件仍導致6,200萬美元受到影響。

8G03pLGwavL4LcDkdTQS5EVlIywScZBcpTb4Fzeb.png

b89a9653-a2d4-4e89-9042-24e06ed1590a (1) 不同編程語言在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池的交易由於前置運行交易而失敗。

Screenshot 2023-07-31 at 9.08.31 PM

北京時間7月30日晚10點,JPEG’d 確認pETH-ETH Curve池已被惡意利用。

2g2jUlVcktQTJmqFFZUPSVONMA6O9Jbp7HcbQEKd.png

Vyper 隨後宣布,0.2.15、0.2.16 和0.3.0 版本包括了一個失效的重入鎖。 Vyper 發布推文後,Metronome 和Alchemix 也受到了影響。

mRZI1JtH7Qv7Mvk09k7ex0chKgffsFir98ebzqtD.png

Metronome DAO 宣布消息:

FTzOyIh9Z8Opc6soNd4zLzAcKQGuLxWY2QEefPPV.png

F9Dh7bMfVanq8deivVbWwhF24E3gbbIpThEq0t5l.png

8MYwVijoFiaJPL32YVTK6AOQHeHsZvZXyxIfmF9h.png

北京時間第二天凌晨,Curve Finance在Discord 上發佈公告稱,剩餘的資金池不受Vyper Bug的影響,是安全的。

PsdIMHoBSb8vtyuFjjlO4ZsCrmKfIC6IY6I40DkB.png

aLVrLdFyKeWEz7Jd1sqydWD4dTUWmpGw8Oj7PY0W.png

Curve Finance 在Twitter 上宣布,Arbitrum上的一個資金池有可能受到影響,但沒有可供惡意行為者執行的有利可圖的漏洞,這意味著資金池不太可能受到攻擊。 CertiK也尚未檢測到任何其他利用Vyper漏洞的攻擊。

iqFUjHgxsKZF0Hw4cIndWFLBVQBC8VyjPCrNnDNk.png

攻擊流程

以下是以JPEG’d為目標的交易示例:

攻擊者: 0x6ec21d1868743a44318c3c259a6d4953f9978538

攻擊合約: 0x466b85b49ec0c5c1eb402d5ea3c4b88864ea0f04#code

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(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,000 ETH閃電貸後,攻擊者還剩下6,107 ETH(約11,395,506美元)。

漏洞

該漏洞允許攻擊者在移除流動性過程中調用添加流動性函數。雖然這些函數本應受到@nonreentrant(‘lock’)的保護,但對add_liquidty() 和remove_liquidity() 函數的測試證明,它並不能防止重入攻擊。

HIhD33yKE94EHwUa7xkQhAzQRF4nscaJOwAPTOmK.png

Vyper_contract for Curve.fi Factory Pool 數據源: Etherscan

繼利用JPEG’d、Metronome 和Alchemix 漏洞之後,Vyper 的v0.2.15、v0.2.16 和v0.3.0 版本確實存在重入保護失敗的漏洞。

Mr3KDb2SKoLhF770OEWBAtdTuOYZ88tchEodweuv.png

解決措施

使用易受攻擊的Vyper版本的項目應聯繫Vyper協助進行緩解。項目也應盡量升級到不含此漏洞的最新版Vyper。

總結

Vyper被攻擊事件是CertiK2023 年檢測到的最大的重入漏洞。就資金損失而言,該攻擊損失金額佔據了此類事件的78.6%。

今年兩起最大的重入漏洞,都是利用Vyper編寫的合約,儘管漏洞並不相同。

目前,2023 年所有鏈中因重入攻擊造成的損失已超過6,600 萬美元。這比2020年全年多出約400萬美元,僅比2021年的損失額少100萬美元。值得注意的是,2023年的總額也比2022 年因重新定位攻擊造成的損失增加了259.45%。

Total
0
Shares
Related Posts