以太坊價格 以太坊價格
Ctrl+D 以太坊價格
ads
首頁 > AAVE > Info

BSP:Curve這次遭遇的漏洞利用 或許為黑客們打開了新思路

Author:

Time:1900/1/1 0:00:00

作者:Jaleel,BlockBeats 

隨著一場漏洞利用事件的發生,DeFi 行業陷入了一場混亂。Curve Finance,這個 DeFi 行業的巨頭,成為了嚴重「攻擊」的目標,諸如 alETH/msETH/pETH 的多個穩定幣池岌岌可危。據不完全統計,該漏洞利用事件已造成 Alchemix、JPEG'd、MetronomeDAO、deBridge、Ellipsis 和 CRV/ETH 池累計損失 5200 萬美元,整個市場的信心被嚴重撼動。

Vyper 0.2.15、 0.2.16 和 0.3.0 版本的重入鎖失效,Vyper 官方文檔安裝界面推薦的也是一個錯誤的版本。其他使用 Vyper 編譯器的項目方也趕緊進行了自查,試圖確保自己不會成為下一個受害者。隨著漏洞利用事件的源頭被逐漸揭露,市場逐漸認識到,這次的危機并不僅意味著一次普通的黑客漏洞利用事件,更是展露出整個底層堆棧對整個 DeFi 行業潛在的巨大風險。

和以往相比,前段時間的黑客事件數量越來越少,這與市場的繁榮程度脫不開關系。DeFi summer 和 NFT summer 時期,每周都有新的十億美元協議推出,相比之下如今的市場十分萎縮。與此同時的,黑客們找到漏洞利用或者制造大筆的攻擊事件的市場機會也在逐漸萎縮,這意味著黑客需要更新的、未開發的切入口來探索。

回歸「第一性原理」的黑客們在更底層的編譯器上找到了一個完美的切入口,去饞食 DeFi 市場上巨大可口的「蛋糕」,更底層的編譯器成為了黑客們更「聰明」的選擇。就這次事件及其暴露出的相關問題,BlockBeats 采訪了智能合約開發者 Box(@BoxMrChen)和 BTX 研究員 Derek(@begas_btxcap)。

Aave 及 Lens 的創始人 Stani(@StaniKulechov)在社交媒體發表了自己對事件的看法:「這對 Curve 和 DeFi 來說是一個不幸的挫折。雖然 DeFi 是一個可以做出貢獻的開放空間,但要做到絕對正確是很困難的,而且風險很高。在 Curve 的案例中,他們在協議級別上做對了。」

Curve向alETH池黑客發送鏈上消息:請將攻擊相關資金返還給Alchemix多簽:8月4日消息,alETH攻擊者通過鏈上轉賬向Curve配置地址留言:“請確認0xbabe…地址是Curve所有地址,確保我們不會弄錯。”

Curve回復表示稱,請將與alETH池黑客攻擊相關的資金返還給Alchemix多簽(0x9e2b)。[2023/8/4 16:19:14]

Curve 遭遇的漏洞利用事件是最古老,也許是最常見的以太坊智能合約攻擊形式之一,重入攻擊。重入攻擊允許攻擊者反復調用智能合約的某一函數,而不等該函數的前一個調用完成。這樣,他們就可以不斷利用漏洞提款,直至受害合約資金耗盡。

舉個簡單的例子來說明重入攻擊:一家銀行總共擁有 10 萬現金。但這家銀行有一個很大的漏洞,每當人們取錢時,銀行工作人員并不立即更新賬戶余額,而是等到一天結束時才進行核對和更新。這時有人發現了這個漏洞,他在銀行開了一個賬戶,先存入 1000 元,然后取出 1000 元,過 5 分鐘再取出 1000 元。由于銀行沒有實時更新余額,系統會在進行核對和更新前認為他賬戶還有 1000 元。通過反復操作,最終該用戶取出了銀行里全部的 10 萬美元現金。到這天結束時銀行才發現被利用了這個漏洞。

重入攻擊的復雜性在于它利用了合約之間相互調用的特性,以及合約自身的邏輯漏洞,通過故意觸發異常和回退功能來實現欺詐行為。攻擊者可以反復利用合約的邏輯漏洞,竊取資金。防止重入攻擊的解決方案也很普遍,提前設置一段針對性的特殊代碼內容進行防護,用這樣的保護機制來確保資金安全,這被稱為重入鎖。

Solidity 為智能合約編程設定了一個「CEI 原則」(Check Effects Interactions),能很好地保護函數免受重入攻擊。CEI 原則的內容包括:

1. 函數組件的調用順序應該是:首先是檢查,其次是對狀態變量的影響,最后是與外部實體的交互。

Curve發起將MagicCRV列入白名單的提案投票,擬允許Abracadabra參與Curve治理:5月7日消息,Curve社區發起提案投票,提議在Curve的SmartWalletList中將MagicCRV列入白名單,允許Abracadabra參與Curve治理,從而可鎖定CRV以在MIM相關交易對上提升收益激勵。

注,MagicCRV是Abracadabra上CRV的封裝資產,用戶可以鎖定CRV鑄造MagicCRV,鎖定期為4年,期間用戶可以將MagicCRV換為mCRV,并在Curve上的mCRV/CRV池交易將其交易為CRV。[2022/5/7 2:56:57]

2. 在與外部實體交互之前,應該先更新所有狀態變量。這被稱為「樂觀記賬」,即在交互真正發生之前就將影響寫入。

3. 檢查應在函數開始處進行,以確保調用實體有調用該函數的權限。

4. 狀態變量應在任何外部調用之前更新,以防重入攻擊。

5. 即使是可信的外部實體,也應該遵循 CEI 模式,因為它們可能會將控制流轉移給惡意的第三方。

根據文檔的說法,CEI 原則有助于限制合約的攻擊面,特別是防止重入攻擊。CEI 原則可以很容易地應用,主要就是按功能代碼的順序,不需要改變任何邏輯。眾所周知的導致以太坊分叉的 The DAO 漏洞利用,也是無視「CEI 原則」,而被攻擊者實現了重入攻擊,造成了毀滅性后果。

但被攻擊的 Curve 池并沒有遵循這個 CEI 原則,原因是 Curve 采用的是 Vyper 編譯器。作為編譯器的 Vyper 代碼漏洞,導致重入鎖失效,使得黑客的重入攻擊成功實現了。

大多數人都知道 Solidity,但 Solidity 并不是創建智能合約的唯一語言,目前替代 Solidity 的流行方案就是 Vyper。雖然 Vyper 的功能和流行程度不如 Solidity,但對于熟悉 Python 的開發人員來說是理想的選擇,因為 Vyper 能將類 Python 的代碼轉譯成以太坊智能合約編程語言。

Securrency與GK8合作為銀行客戶提供機構級區塊鏈解決方案:金色財經報道,網絡安全和數字資產托管公司GK8已與道富支持的金融科技公司Securrency合作,為銀行客戶提供機構級區塊鏈解決方案。該合作伙伴關系圍繞GK8的企業級托管解決方案展開,隨著Securrency建立其代幣化基礎設施,該解決方案將提供給Securrency的客戶。[2021/8/5 1:35:20]

根據 github 的信息顯示,Vyper 的 github 代碼庫貢獻第一的開發者,也是 Curve 開發者。這也不難解釋 Curve 為什么采用的是 Vyper 而不是 Solidity。

那在這次攻擊事件里,Vyper 的問題究竟出在哪里?重入鎖為什么會失效呢?是因為沒有進行測試嗎?BlockBeats 采訪了智能合約開發者 Box 826.eth(@BoxMrChen),據他透露,Vyper 重入鎖是做過用例測試的。但失效的原因是,測試用例是結果導向,也就是測試用例也是錯的。

簡而言之,Vyper 重入鎖失效最大的原因在于,編寫測試用例的人是根據結果來編寫的測試用例,而沒有思考過為什么 slot 會莫名其妙跳過 1 。

在 Box 后續分享出來的這幾段 Vyper 代碼中,可以明顯看出問題。當鎖名稱第二次出現的時候,storage_slot 的數量會被覆蓋,也就是說,在 ret 中,第一次獲取鎖的 slot 為 0 ,但是再次有函數使用鎖后,鎖的 slot 被加一。編譯后使用錯誤的 slot,導致重入鎖無法生效。

動態 | Ledge Secure惡意擴展程序曝光 已有價值1.6萬美金的加密貨幣遭竊:據降維安全實驗室(johnwick.io)了解,一款基于Chrome的惡意擴展程序(Ledge Secure)成功進入Chrome商店,用戶一旦安裝此插件,當用戶訪問該在線錢包時,就會竊取用戶私鑰并將其發送給該擴展程序的開發人員。初步統計,黑客已通過此方式竊取價值16000美金的加密貨幣,目前,谷歌已經將該惡意程序從Chrome商店中刪除,降維安全實驗室在此建議廣大用戶及時排查,如有安裝此插件請及時卸載,以免資產遭受損失。[2020/1/7]

左為被攻擊代碼,右為修復后代碼

「預計錯誤的測試結果,當然驗證不出錯誤。舉個簡單的例子,現在我們在做計算題, 1+ 1 = 2 ,但給定的標準答案錯了,說 1+ 1 = 3 。而這時做題的同學答錯了,回答了 1+ 1 = 3 ,但卻和提前給定的標準答案相同,程序就自然沒辦法判定出測試結果出錯。」Box 在和 BlockBeats 的采訪中這么說道。

在有所記錄的史上第一次重入攻擊事件中,WETH Attack 韋斯攻擊的攻擊者,正是為了讓開發者重視重入攻擊而故意制造攻擊的白客,目的是使更多項目免受重入攻擊的可能性。在智能合約的情境下,開發者應該采用不同的觸發機制,例如調用某個狀態改變函數來實現保護。這就要求開發人員在設計合約時充分考慮可能的攻擊場景,采取適當的預防措施。

為了深入了解 Vyper 編輯器,BlockBeats 采訪了 BTX 研究員 Derek(@begas_btxcap),他表示,對于熟悉 Python 的開發人員來說,Vyper 是比 Solidity 更理想的選擇,UI 界面更舒服,上手更快。但顯然,一些版本的 Vyper 編輯器代碼并沒有經過可靠的第三方審計。甚至有的審計工作,可能是開發者自己完成的。「傳統 IT 行業就不會發生這種事,因為一個新的語言出來后,會有無數的審計公司往死里找你的漏洞。」

動態 | 桑坦德銀行英國分公司推出采用Ripple xCurrent的應用程序新版本:據ethereumworldnews消息,西班牙桑坦德銀行(Banco Santander)英國分公司發布了一款“OnePay FX”應用程序的1.3.1版本,通過該程序,桑坦德銀行英國客戶可以將Zloty(PLN)發送給他們的波蘭收件人。該應用程序采用了基于區塊鏈技術的Ripple xCurrent解決方案。[2019/7/16]

更不用說,能讓一個錯誤堂而皇之的存在兩年之久。

Vyper 貢獻者 fubuloubu 也表示:編譯器并沒有像大家想象的那樣受到審查或審計。大多數編譯器都會進行重大且頻繁的更改,這使得審核變得不利。即使有完整的代碼庫審核,在此之后添加的版本越多,它也會過時。審核編譯器并不是一個很好的方式,因為審核最終用戶使用該工具生成的最終產品(即原始 EVM 代碼)更有意義。

所有這些都指向最后一個問題:激勵。也就是說沒有人有動力去尋找編譯器中的關鍵漏洞,尤其是舊版本。fubuloubu 此前提出過一個提案,提議將通過添加由用戶共同贊助的賞金計劃來幫助改進 Vyper,但沒有被通過。

黑客們正在回歸「第一性原理」

對協議和項目的開發人員而言,這是合約安全開發實踐的又一次鮮活案例。但最重要的是,Curve 事件給了我們所有人一個警示,底層編譯器的安全性問題被嚴重忽略了,回歸「第一性原理」的黑客們在更底層的編譯器上找到了一個完美的切入口。

事后,Aave 及 Lens 的創始人 Stani(@StaniKulechov)也在社交媒體發布了長文表達自己的感想:這次 Curve 被攻擊事件意味著,DeFi 風險一直涉及整個底層堆棧、編程語言、EVM 等。這警示了我們應更加謹慎和敏感,尤其是將來使用定制的 EVM 和應用程序鏈時。

對于編譯器的漏洞,僅通過對合約源碼邏輯的審計,是很難發現的。僅僅是研究版本和版本之間的差異也是一個大工程。需要結合特定編譯器版本與特定的代碼模式共同分析,才能確定智能合約是否受編譯器漏洞的影響。

「目前只有兩個編譯器最佳,Vyper 的代碼庫更小,更容易閱讀,對其歷史進行分析的更改也更少,這可能就是黑客從這里下手的原因,Solidity 的代碼庫要更大一些。」fubuloubu 甚至懷疑國家支持的黑客可能參與這起 Curve 攻擊事件:「找到該漏洞需要幾周到幾個月的時間,考慮到投入的資源,這也許是由一個小團體或團隊進行的。」

作為加密行業使用最廣泛的編譯語言,Solidity 的安全更是被用戶所牽掛,畢竟如果這次是 Solidity 編譯器出現了重入鎖失效的問題,那么整個 DeFi 行業的歷史或許都要被改寫了。

根據 Solidity 開發團隊定期發布的安全預警,在多個不同版本的 Solidity 編譯器中也都曾存在過安全漏洞。

最近一次的編譯器錯誤記錄是 6 月 26 日,在調查與使用具有副作用的三元表達式的 abi.decode 作為類型參數相關的安全報告時,在 Solidity 編譯器的舊代碼生成管道中發現了一個錯誤。舊代碼生成器沒有評估復雜的表達式,如賦值、函數調用或條件,其 .selector 正在被訪問。這會導致此類表達式未執行的副作用,因此使用舊管道編譯的合約的行為可能不正確。

我們也可以看到 Solidity 的Github 倉庫 中放置著一個文件,上面列出了 Solidity 編譯器上一些已知的安全相關的 bug。該列表可以追溯到 0.3.0 版本,只在此版本之前存在的 bug 沒有被列入。這里,還有另外一個 bugs_by_version.json 文件。該文件可用于查詢特定的某個編譯器版本會受哪些 bug 影響。

幸運的是,也正是因為 Solidity 語言的廣泛應用,以及以太坊基金會在背后的輔助,許多已存在的問題已經被項目和協議在部署的過程中被指出。因此 Solidity 比 Vyper 更快幾步完成了修改和完善,從這個角度看,這也是 Solidity 更規范和更安全的原因之一。

為了幫助 Solidity 開發者進行更好的測試,防止發生同樣的事。UnitasProtocol 聯合創始人 SunSec(@ 1 nf 0 s 3 cpt)在 Curve 被攻擊事件后,發布了一份 DeFiVulnLabs Solidity 安全測試指南,支持 47 種漏洞,其中包括漏洞描述、場景、防御、漏洞代碼、緩解措施以及如何測試。

在這起 Curve 事件上,Box 認為所有開發者得到的啟示是:不要貪圖追隨技術潮流選擇不成熟的方案;不要在不寫測試用例的情況下就認可自己的代碼(Vyper 出問題的幾個版本上,甚至連測試用例都是錯誤的);永遠不要自己批準自己的代碼;有些財富,可能要數年才會被發現;不可升級是對自己的傲慢和對其他人的藐視。

通常開發人員也不會想到這里面有什么坑,隨手就選一個版本編譯,可能會忽略版本之間的區別所帶來的風險。即使是小版本升級也可能引入重大變化,這一點在開發去中心化應用程序時尤其重要。

這起 Curve 事件對開發者的警示有:使用較新版本的編譯器語言。保持最新的代碼庫、應用程序和操作系統非常重要,同時也要全方位搭建自身的安全防御機制。盡管新版本也可能引入新的安全問題,但已知的安全問題通常較舊版本要少。當然也要及時關注社區和官方的版本更新公告。了解每一個版本帶來的變化,按需更新自己的代碼庫和運行環境。采取這些措施或許可以大大減少編譯器錯誤導致的安全事件。

此外,要完善代碼的單元測試用例。大部分編譯器級別的錯誤會導致代碼執行結果不一致, 這很難僅通過代碼 review 發現, 但在測試中就可以暴露出來。提高代碼覆蓋率有助于避免這類問題。以及要盡量避免使用內聯匯編、多維數組編解碼等復雜語言特性,除非有明確需求。歷史上大多數 Solidity 語言漏洞都與這些高級功能相關。在沒有特殊需求的情況下,開發人員應該避免為了炫技而使用實驗性語言特性。

對協議層以及安全人員而言,在進行代碼審計時,也不能忽視編譯器版本可能帶來的風險。可以預見的是,黑客們已然打開了新思路,在未來一段時間里,更底層的漏洞被利用事件會越來越多。同時,作為更底層的基礎設施,底層堆棧、編程語言、EVM 等更需要被好好審計。未來審計公司的市場會越來越大,白客賞金的市場也會越來越大。Vyper 團隊也計劃在事情正式結束梳理后,開啟審查漏洞賞金的計劃。

當然我們也不用對底層基礎設施存在的風險過度恐慌。目前大多數編譯器 Bug 僅在特定代碼模式下觸發,還需要根據項目情況具體評估實際影響。定期升級編譯器版本、充分的單元測試都能幫助預防風險。

區塊律動BlockBeats

媒體專欄

閱讀更多

Foresight News

金色財經 Jason.

白話區塊鏈

金色早8點

LD Capital

-R3PO

MarsBit

深潮TechFlow

Tags:CURNBSBSPCurveCURRYnbs幣前景BSPT幣PAXCURVE

AAVE
NBS:金色早報 | 美媒:趙長鵬曾試圖關閉幣安在美國的交易所

▌美媒:趙長鵬曾試圖關閉幣安在美國的交易所兩位知情人士告訴美媒The Information,幣安CEO趙長鵬今年早些時候曾試圖關閉這家加密貨幣交易所的美國分支機構.

1900/1/1 0:00:00
NBS:幣安穩定幣全家桶再添一員FDUSD 背后有何玄機

作者:金色財經cryptonaitive不知道你是否注意過,幣安支持交易的穩定幣特別多:USDT、USDC、BUSD、DAI、TUSD、USDP,堪稱穩定幣全家桶.

1900/1/1 0:00:00
BASE:“Bald”跑路 低級騙局如何騙過所有人

作者:金色財經記者 Jessy近日,Coinbase的親兒子layer 2項目Base鏈上不太平.

1900/1/1 0:00:00
MEX:幣圈打工人 刑事避雷指南

作者:高孟陽,上海曼昆律師事務所資深律師近日,某區塊鏈公司產品同學來咨詢,說是突遭天降大任被安排了一個即發 Token 項目上,老板在項目啟動會上激情澎湃.

1900/1/1 0:00:00
BSP:金色早報 | a16z正在逢高出售700萬美元的MKR代幣

▌鏈上數據顯示a16z正在逢高出售700萬美元的MKR代幣區塊鏈數據顯示,隨著加密貸款平臺MakerDAO的MKR治理代幣價格飆升至近一年高位.

1900/1/1 0:00:00
LIQ:多個項目因Vyper重入鎖漏洞造成的損失已超5900w美元 你的資金還安全嗎?

2023年7月30日晚,多個項目迎來至暗時刻。7 月 30 日 21:35左右,據Beosin旗下Beosin EagleEye安全風險監控、預警與阻斷平臺監測顯示,NFT 借貸協議J.

1900/1/1 0:00:00
ads