上篇文章中我們了解了什么是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));??}}
CertiK:Army of Fortune項目Discord服務器遭入侵:金色財經報道,據CertiK官方推特發布消息稱,Army of Fortune項目Discord服務器遭入侵,有黑客發布釣魚鏈接。在團隊宣布服務器恢復安全之前,請用戶勿與任何鏈接交互。[2023/6/27 22:02:26]
漏洞分析
這次的攻擊目標依然是獲得HackMe合約中的?owner?權限,我們可以看到兩個合約中除了HackMe合約中的構造函數可以修改合約的?owner?其他地方并沒有修改?owner?的函數。我們要如何完成攻擊呢?這里需要一點小技巧,大家可以思考一下,剛好也可以驗證一下自己對于之前知識的掌握程度以及自己的思維是否活躍。
是否有想法呢?沒有想法也沒關系,我們一起來看攻擊是如何完成的:
加密貨幣總市值為1.193萬億美元:金色財經報道,據CoinGecko數據顯示,當前加密貨幣市值為1.193萬億美元,24小時交易量為354.79億美元,當前比特幣市值為528391979,731美元,以太坊市值為229112913,574美元。[2023/6/3 11:55:50]
攻擊合約
//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;??}}
美SEC訴Ripple案進展:SEC要求法院撤銷XRP持有者法庭之友的身份:7月20日消息,美國證券交易委員會(SEC)已于7月19日要求法院撤銷授予XRP持有者的法庭之友身份。SEC表示,這些人提出的案情摘要只是重復了被告的努力。此外,SEC還指出,道伯特動議(一種旨在排除專家作證的動議)不是決定性動議。
早在2021年3月,在律師John Deaton的帶領下,一群XRP持有者提交了一項動議,希望干預此案。雖然他們試圖介入此案的努力在去年10月被法院駁回,但他們確實設法獲得了法庭之友身份。 這使得XRP持有者可以提交法庭之友的陳述書。 今年5月,Deaton要求法院就SEC專家Patrick B. Doody的意見提交一份法庭之友陳述書。此前7月13日消息,法官拒絕SEC將Hinman演講文件保密的動議。(U.today)[2022/7/20 2:25:37]
我們先看攻擊流程:
ARK基金6月1日至今買入超13萬股Coinbase股票:金色財經報道,ARK方舟基金持倉數據顯示,6月1日至今,ARK基金共買入131701股Coinbase股票(Coin)。金色財經此前報道,美國宏橋信托投資集團將Coinbase目標價從380美元下調至290美元。[2022/6/24 1:28:21]
1.Alice部署Lib合約;
2.Alice部署HackMe合約并在構造函數中傳入Lib合約的地址;
3.攻擊者Eve部署Attack合約并在構造函數中傳入HackMe合約的地址;
4.攻擊者調用Attack.attack()函數將HackMe合約中的owner變為自己。
咋回事兒呢?其實這個攻擊方式就是很巧妙的運用了delegatecall這個函數修改storage類型變量時的特征:delegatecall函數的執行環境是調用者的環境并且對于storage類型變量的修改是根據被調用合約變量存儲的插槽位置來修改的。
Nexo:昨天向Celsius團隊伸出援手但被拒絕,將向Celsius提供一份收購報價:6月13日消息,加密借貸機構Nexo發推表示,所有Nexo產品都在正常運行,昨天向Celsius團隊伸出援手,希望提供支持,但被拒絕了。Nexo擁有堅實的流動性和股權,可以輕松收購Celsius的任何剩余合格資產,主要是其抵押貸款組合,我們正在根據該協議向Celsius提供一份報價,并將公開傳達。[2022/6/13 4:22:32]
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想想2000年大家對互聯網或者智能手機的想象,先不要預設所謂看起來像炒作的概念和自己毫無關系。超元域的天空和大地都是漆黑一片,宛如一幅沒有任何圖像顯示的電腦熒幕.
1900/1/1 0:00:002022年6月,Optimism的Airdrop#1階段空投計劃正式拉開帷幕。這場看似司空見慣的空投活動,卻為當時籠罩在LUNA陰影下的加密市場注入了一針強心劑.
1900/1/1 0:00:00李笑來所著《韭菜的自我修養》一書中曾提到“每一次牛市都是市場上大量外部資金流入的結果,每一次熊市都是市場內部大量資金流出的結果.
1900/1/1 0:00:001.金色觀察|eBay、Uniswap紛紛收購NFT平臺意味著啥牛市中,公司收購是為了加快增長;然而在熊市中,公司收購是為重整其業務,從而更好地經受住時代的考驗.
1900/1/1 0:00:006.29比特幣以太坊日內行情解析,及操作思路 比特幣解析:周初市場走出一波四小時級別的回撤走勢.
1900/1/1 0:00:00