比特幣交易所 比特幣交易所
Ctrl+D 比特幣交易所
ads
首頁 > 狗狗幣 > Info

智能合約安全審計入門篇 —— delegatecall (2)_HAC

Author:

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

上篇文章中我們了解了什么是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));??}}

美SEC發布網絡攻擊披露規則,包括上市的加密公司:金色財經報道,美國證券交易委員會采用新規則,要求所有在美國上市的公司將被要求在四天內披露任何重大網絡安全事件,除非此類披露被視為可能存在國家安全或公共安全風險。SEC表示,這些規則已于7月26日獲得通過,并將在《聯邦公報》上發布通過后30天后生效。

新規則將適用于美國任何上市公司。在加密行業,公開上市的加密公司包括Coinbase (COIN)、Marathon Digital (MARA)、Riot Blockchain (RIOT) 和 Hive Digital Technologies (HIVE)。

美國證券交易委員會解釋說,數字支付和勞動力數字化操作的增加,加上犯罪分子利用網絡安全事件獲利的能力,使得新規則成為保護投資。[2023/7/28 16:03:59]

漏洞分析

韓國檢方對姜氏兄妹就涉嫌操縱Bithumb股價及挪用資金進行傳喚調查:1月9日消息,韓國首爾南部地方檢察廳今日傳喚被稱為“加密交易所Bithumb實際所有者”的姜鐘賢接受調查,且上周已兩次傳喚姜鐘賢的妹妹、Vidente(Bithumb最大股東)首席執行官姜智妍接受訊問。姜氏兄妹涉嫌操縱Bithumb股價、擾亂資本市場,并挪用公司資金。

報道稱,韓國檢方正在調查姜氏兄妹是否通過散布出售Bithumb的虛假信息操縱股價,以及是否通過頻繁發行可轉換債券轉移公司資金并通過這種方式建立行賄基金。

此前去年10月份消息,韓國檢方對Bithumb相關的多家公司進行扣押搜查,包括INBIOGEN、Vidente、Bucket Studio等;去年12月消息,Vidente的副總裁在接受韓國檢方調查期間跳樓自殺。(JTBC)[2023/1/9 11:02:28]

這次的攻擊目標依然是獲得HackMe合約中的?owner?權限,我們可以看到兩個合約中除了HackMe合約中的構造函數可以修改合約的?owner?其他地方并沒有修改?owner?的函數。我們要如何完成攻擊呢?這里需要一點小技巧,大家可以思考一下,剛好也可以驗證一下自己對于之前知識的掌握程度以及自己的思維是否活躍。

Glassnode:EIP1559的ETH燃燒率達到歷史最低點:金色財經報道,據區塊鏈分析公司Glassnode最新分析顯示,通過EIP1559的ETH燃燒率現在達到了歷史最低點,燃燒的ETH總量現在只占總發行量的11%。在目前的發行計劃下,以太坊過去只有三次跨入通貨緊縮的領域。這意味著,與EIP1559協議執行之后的所有歷史相比,目前有相對大量的ETH進入流通領域 。本文撰寫時,以太坊ETH銷毀總額為2571372.4枚,約合4,157,523,645.48美元。[2022/8/4 12:02:24]

是否有想法呢?沒有想法也沒關系,我們一起來看攻擊是如何完成的:

攻擊合約

//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;??}}

幣安將推出BUSD保證金ETC永續合約:7月27日,官方消息,幣安期貨將于北京時間7月28日10:45推出BUSD保證金ETC永續合約,最高20倍杠桿。[2022/7/27 2:40:25]

我們先看攻擊流程:

1.Alice部署Lib合約;

2.Alice部署HackMe合約并在構造函數中傳入Lib合約的地址;

3.攻擊者Eve部署Attack合約并在構造函數中傳入HackMe合約的地址;

4.攻擊者調用Attack.attack()函數將HackMe合約中的owner變為自己。

咋回事兒呢?其實這個攻擊方式就是很巧妙的運用了delegatecall這個函數修改storage類型變量時的特征:delegatecall函數的執行環境是調用者的環境并且對于storage類型變量的修改是根據被調用合約變量存儲的插槽位置來修改的。

MIM發行方Abracadabra:財庫有足夠資產償還壞賬,將公布具體還款計劃:6月19日消息,穩定幣協議Abracadabra發文稱,其財庫(Treasury)有足夠的資產來償還UST崩盤期間產生的1200萬美元壞賬。一旦收到Terra團隊關于LUNA 2.0空投規模和時間的更多信息后,Abracadabra將發布一份全面的還款計劃。

Abracadabra指出,其運營財庫(不包括SPELL代幣)目前擁有超過1320萬美元的資產。該財庫持有6619923.5枚MIM和10380153.06 CRV代幣。CRV代幣允許Abracadabra提高Curve MIM-3pool上的APY,這最終確保其保持較高的MIM流動性并保持錨定。除了運營財庫之外,Abracadabra還有單獨的SPELL財庫以及尚未申領的LUNA 2.0。此外,鑒于目前的情況,Abracadabra決定推遲分析儀表板更新,并發布之前的分析儀表板的修補版本。[2022/6/19 4:38:19]

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變量被錯誤的覆蓋。

來源:金色財經

Tags:ACKHACETHSOMEblackholecoinAlphacatCOMSA-ETHSOMEE幣

狗狗幣
玩轉五大神器密鑰NFT_Magi

NGGDAO基于元宇宙的發展和Nibiru游戲產生,由全球不同游戲公會和機構共同發起建立,用于投資基于元宇宙、虛擬世界和區塊鏈游戲的非同質化代幣.

1900/1/1 0:00:00
代幣空投的效果究竟如何?我們應該重新思考下一個周期的空投策略_MOO

加密項目經常使用空投向社區成員分發免費代幣,但它們的效果如何?空投有助于將項目的代幣供應分散給公眾,并且可能是更廣泛的營銷計劃的一部分,以提高對其核心產品或新產品的知名度.

1900/1/1 0:00:00
  BTC跌破2萬美元:熊市何時休?_區塊鏈

  BTC跌破2萬美元:熊市何時休?  漲漲跌跌,比特幣自6月23日以來再度跌破2萬美元。  熊市之下,加密貨幣市場艱難求生.

1900/1/1 0:00:00
你想成為一個成功的加密投資者嗎?閱讀這 10 條投資原則_FUN

這10條投資原則,幫助指導你的加密之旅。撰文:MilesDeutscher 編譯:Kyle 你想成為一個成功的加密投資者嗎?那么你必須了解這10條投資原則,幫助指導您的加密之旅.

1900/1/1 0:00:00
三分讀懂 Web3 學習平臺 Learnoverse:如何搭建學習元宇宙?_LEA

Learnoverse試圖創建一個融合游戲化元素和代幣獎勵的教育元宇宙,用戶可以獲得Web3學習體驗,加密項目也可以嘗試鏈接自身發展的流量需求.

1900/1/1 0:00:00
誰在為Synthetix負重前行?_USD

原文作者:@0xTodd,NothingResearch合伙人?我有一個感受,很多DeFi之所以能夠施展魔法,都是因為有人在背后「負重前行」。最近SNX表現和數據都很不錯.

1900/1/1 0:00:00
ads