注:今日,DeFi安全審計公司TrailofBits披露了Aave借貸協議此前存在的一個嚴重漏洞,在發現到該問題后,Aave迅速修復了該漏洞,從而避免了一場危機。
原文來自TrailofBits:
12月3日,知名DeFi借貸協議Aave部署了V2版本,盡管我們并沒有被雇傭來查看其代碼,但在次日,我們還是對其進行了簡單審查。很快,我們就發現了一個影響AaveV1和V2版本合約的漏洞,并報告了該問題。在將我們的分析發送給Aave的一小時內,他們的團隊修復了該漏洞,以減輕潛在影響。如果該漏洞被利用,這一問題將破壞Aave,并影響外部DeFi合約中的資金。
據悉,有5家不同的安全公司審查了Aave代碼庫,其中有一些使用了形式化驗證。然而,這個漏洞并沒有被這些公司注意到。這篇文章描述了這一問題,以及“該漏洞是如何逃過檢測”等其它的一些經驗教訓。此外,我們也在開發一種新的Slither檢測器,它可以識別這一漏洞,從而為以太坊社區提高安全性。
漏洞
Aave使用了delegatecall代理模式,這一點我們在過去的文章中已經詳細討論過了。簡單來看,每個組件被分成了兩個合約:包含實現的邏輯合約,包含數據并使用delegatecall與邏輯合約進行交互的代理。在邏輯合約上執行代碼時,用戶與代理合約進行交互。這是delegatecall代理模式的簡化表示:
Coinbase首席法律官:政府對Tornado Cash的制裁不符合法律:5月25日消息,試圖推翻美國財政部制裁加密貨幣混合服務Tornado Cash的六人組發表了四個關鍵論點來支持他們的動議。Coinbase的首席法律官Paul Grewal認為美國政府正在尋求使用財產制裁法規來禁止開源軟件這與法律的意圖背道而馳。Coinbase支持對美國財政部的訴訟,該訴訟于2022年9月8日首次提起。訴訟文件詳細說明,該組織的大多數成員此前曾與Tornado Cash有過互動。
第一個論點與財政部試圖將Tornado Cash歸類為外國國民有關,財政部必須這樣做,以證明其行動的合理性。但原告指出,財政部已將Tornado Cash定義為包括TORN代幣的所有持有者,無論他們是否出于任何共同目的而組合在一起。原告認為,根據這一定義,根據財政部自己的測試,Tornado Cash不能被歸類為非法人組織。
第二個論點是,為Tornado Cash提供功能的開源智能合約不能被視為財產,因為財產只指可以擁有的東西。即使這些智能合約可以被視為財產。
第三個論點是,Tornado Cash實體對此沒有任何利益,因此財政部沒有權力制裁它。
第四一個論點是,即使財政部有權這樣做,制裁Tornado Cash違反了第一修正案。[2023/5/25 10:39:38]
在Aave中,LendingPool是使用delegatecall代理的可升級組件。
“美聯儲傳聲筒”:美聯儲在加息問題上面臨艱難決定:3月21日消息,“美聯儲傳聲筒”Nick Timiraos稱,在當前的情形下,美聯儲面臨是否加息的艱難決定,美聯儲官員們必須在通脹擔憂與對銀行業動蕩溢出效應的新擔憂之間取得平衡。
Timiraos 認為,美聯儲是否繼續加息 25 個基點的決定可能部分取決于市場如何消化瑞銀收購瑞信的消息,以及美國和其他經濟體采取的平息市場對銀行業擔憂的舉措是否奏效。而在 2018 年至 2022 年期間曾擔任美聯儲副主席的克拉里達表示,建議美聯儲繼續進行 25 個基點的加息。如果美聯儲暫停加息,市場可能會討論,是不是他們隱瞞了一些市場不知道的真相。[2023/3/21 13:16:16]
而我們發現的漏洞依賴于這些合約中的兩個功能:
可以直接調用邏輯合約的函數,包括初始化函數;
借貸池具有其自己的delegatecall功能;
1
初始化可升級合約
這種可升級模式的一個限制是,代理不能依賴邏輯合約的構造函數進行初始化。因此,狀態變量和初始設置必須在公共初始化函數中執行。
數據:3,284 枚BTC從Coinbase轉移到未知錢包:金色財經報道,WhaleAlert數據顯示,3,284 枚BTC(價值約64,972,841美元)從Coinbase轉移到未知錢包。[2022/9/17 7:02:53]
在LendingPool中,初始化函數設置提供者地址:
initializer調節器防止多次調用initialize,它要求滿足以下條件為true:
以下:
初始化允許在相同交易中多次調用調節器;
isConstructor是代理執行代碼所需的;
revision>lastInitializedRevision允許在合約升級時再次調用初始化函數;
雖然它通過代理,預期可正常工作,但是也允許任何人直接在邏輯合約上調用initialize函數。一旦邏輯合約被部署:
revision將為0x2(LendingPool.sol#L56);
lastInitializedRevision將為0x0;
Aave團隊Web3社交協議Lens上線Polygon網絡:5月18日消息,借貸協議Aave團隊開發的Web3社交協議Lens Protocol已在Polygon上線,Lens于2022年2月首次推出,目前其生態內已有50多個應用程序,其中包括Lenster、Lens Booster、SpamDAO、GoldenCircle、Peer Stream、Swapify、SocialLink等。
據了解,Lens是一個軟件堆棧,使開發人員能夠搭建分散內容和用戶帳戶所有權的社交網絡,協議使用加密地址和NFT進行身份驗證和貨幣化。此前報道,Aave的CEOStaniKulechov曾在今年4月因發布以臨時CEO身份加入推特的笑話而被推特禁封。[2022/5/18 3:25:59]
而漏洞是:任何人都可以在LendingPool邏輯合約中設置_addressesProvider。
2
任意delegatecall
LendingPool.liquidationCall直接委托調用由_addressProvider返回的地址:
基于比特幣閃電網絡開發游戲的工作室Pnkfrg完成300萬美元融資:金色財經消息,基于比特幣閃電網絡開發游戲的工作室Pnkfrg完成300萬美元融資,游戲行業專家London Venture Partners(LVP)和Initial Capital領投,Stillmark、Velo Partners、Fulgur Ventures參投。
Pnkfrg專注于在比特幣閃電網絡上設計游戲,新資金將用于開發基于閃電網絡的休閑游戲。Pnkfrg工作室以移動游戲為核心,專注于免費游戲(F2P),允許玩家參與經濟而無需花費資金來享受游戲。(Bitcoin Magazine)[2022/5/17 3:20:48]
這允許任何人啟動LendingPool邏輯合約,設置受控地址提供者,并執行任意代碼,包括selfdestruct。
利用漏洞的場景:任何人都可以破壞借貸池邏輯合約。下面是一個簡化的視覺表示:
3
缺乏存在檢查
就問題本身而言,已經是很嚴重了,因為任何人都可以破壞邏輯合約,并阻止代理執行借貸池代碼。
然而,在代理合約中使用OpenZeppelin會加劇這一問題的嚴重性。
我們在2018年撰寫的一篇博客文章中強調,沒有代碼的合約委托調用能在不執行任何代碼的情況下返回成功。盡管我們最初發出警告,但OpenZeppelin并未在其代理合約中修復回退函數:
如果代理委托調用了一個已破壞的借貸池邏輯合約,則代理將返回成功,而不會執行任何代碼。
由于Aave可以更新代理以指向另一個邏輯合約,因此這種漏洞利用不會持久。但在可利用此漏洞的時間范圍內,任何調用該借貸池的第三方合約,都將表現為某些代碼已被執行,但實際卻并未執行。這將打破很多外部合約的基本邏輯。
4
受影響的合約
所有AToken:AToken.redeem調用pool.redeemUnderlying(AToken.sol#L255-L260)。由于調用什么也不做,用戶將燒掉他們的AToken,而不會收到他們的底層資產;
WETHGateway(WETHGateway.sol#L103-L111):存款會存儲在網關中,然后任何人都可以竊取存款資產;
任何基于Aave信用委托v2的代碼庫(MyV2CreditDelegation.sol);
如果我們發現的問題被利用,則Aave之外的很多合約都會受到各種方式的影響。確定一份完整的名單是困難的,我們沒有試圖這樣做。這一事件凸顯了DeFi可組合性的潛在風險,以下是我們找到的一些受影響的合約:
DefiSaverv1(AaveSaverProxy.sol)
DefiSaverv2(AaveSaverProxyV2.sol)
PieDao–pieoven(InterestingRecipe.sol#L66)
5
修復及建議
幸運的是,在我們報告這個漏洞之前,還沒有人利用它。Aave對其兩個版本的借貸池調用了initialize函數,從而保證了合約的安全:
LendingPoolV1:0x017788dded30fdd859d295b90d4e41a19393f423?修復時間:2020年12月4日07:34:26PM+UTC
LendingPoolV2:0x987115c38fd9fd2aa2c6f1718451d167c13a3186?修復時間:2020年12月4日07:53:00PM+UTC
長期而言,合約部署者應:
在所有邏輯合約中添加一個構造函數以使initialize函數無效;
檢查delegatecall代理fallback函數中是否存在合約;
仔細檢查delegatecall陷阱,并使用slither-check-upgradeability;
6
形式化驗證合約并不是防彈的
Aave的代碼庫經過了形式化驗證,區塊鏈領域的一個趨勢是,人們會認為安全特性是圣杯。用戶可能會嘗試根據這些特性的存在與否,對各種合約的安全性進行排序。我們認為這是危險的,它會導致錯誤的安全感。
Aave形式化驗證報告列出了LendingPool視圖函數以及池操作的屬性。例如,已驗證的屬性之一是:
然而,如果邏輯合約遭到破壞,則該屬性可能會被破壞。那如何才能對此進行驗證?雖然我們無法訪問定理證明或所使用的設置,但很可能證明proof沒有考慮可升級性,或者prover不支持復雜的合約交互。
這在代碼驗證中是很常見的。你可以通過對整體行為的假設來證明目標組件中的行為,但是在多合約設置中證明屬性是具有挑戰性和耗時的,因此必須進行權衡。
形式化驗證技術很棒,但是用戶必須意識到它們覆蓋范圍很小,并且可能會錯過攻擊媒介。另一方面,自動化工具和人工審查可幫助開發人員以較少的資源來提升代碼庫的安全性。了解每種解決方案的優點和局限性,對開發人員和用戶而言都至關重要。當前的問題就是一個很好的例子,Slither可以在幾秒鐘內發現這個問題,受過訓練的專家可能會很快指出它,而要用安全特性來檢測,則需要付出很大的精力。
總結
Aave做出了積極反應,并在發現問題后迅速修復了該漏洞。危機避免了,但最近遭受黑客攻擊的其他受害者卻沒有那么幸運。在部署代碼并將其暴露于對抗性環境之前,我們建議開發者:
查看這里的檢查表和訓練;
將Slither添加到你的持續集成管道中并調查其所有報告;
給安全公司適當的時間來審查你的系統;
請注意可升級性,至少請審查合約升級反模式,合約遷移的工作方式,以及使用OpenZeppelin的可升級性;
我們希望通過分享此信息以及與此問題相關的Slither檢測器來防止類似的錯誤。
10月,“巴比特DeFi投資實戰班”首次在深圳開班,全國近50位學員前往學習。接下來,12月北京、1月杭州,我們相約defi線下課,報名正式啟動!
當你能飛的時候,就不要放棄飛;當你能夢的時候,就不要放棄夢。世界沒有盡頭,只要心中還有追求。人生真正的終點是希望的終結。蒼鷹的驕傲是飛翔的雙翼,人生的意義是不斷的追求.
1900/1/1 0:00:00三月以來,比特幣行情持續上漲超過270%。早些時候,PaulTudorJones等華爾街億萬富翁認可了比特幣,乃至將部分投資組合入場了比特幣.
1900/1/1 0:00:00關注鄭毅學習,告別虧損交易。一定要理解行情的運行,不是盲目交易。鄭毅所有的策略每天都是連貫的,牽一發動全身.
1900/1/1 0:00:00當前盤面技術指標無法講解,行情再次單邊回調,此刻傾向于比特幣突破形態,若再次回踩也只是對壓力確認,以及蓄勢!晚間行情繼續站穩歷史新高19888壓力的前提下,我們將毫不猶豫的直接進場干多.
1900/1/1 0:00:00前言: 要學會用小止損博大利潤,而不是扛單,或許有時候扛單可以改變一時的浮虧,但卻會為未來的大虧留下禍根,就好比在戰場,子彈沒有擊中的時候,誰都覺得輕裝上陣不帶頭盔最舒服,當在槍林彈雨的時候.
1900/1/1 0:00:00前言: 一直相信,這世界上,有一種默契是可以沁骨的,猶如一種初相遇,不是在路上,而是在心里,沒有擦肩而過,卻會留下瞬間驚喜,不用回過頭去,那過往的漲跌,依然是心中的美麗,一波行情,一次感動.
1900/1/1 0:00:00