By:小白@慢霧安全團隊
背景概述
上周寫了智能合約安全審計入門篇——重入漏洞,這次我們接著來說一個同樣很經典的漏洞——?溢出漏洞。
前置知識
首先我們還是先來看看溢出是什么:
算術溢出或簡稱為溢出分為兩種:上溢和下溢。所謂上溢是指在運行單項數值計算時,當計算產生出來的結果非常大,大于寄存器或存儲器所能存儲或表示的能力限制就會產生上溢,例如在solidity中,uint8所能表示的范圍是0-255這256個數,當使用uint8類型在實際運算中計算255+1是會出現上溢的,這樣計算出來的結果為0也就是uint8類型可表示的最小值。同樣的,下溢就是當計算產生出來的結果非常小,小于寄存器或存儲器所能存儲或表示的能力限制就會產生下溢。例如在Solidity中,當使用uint8類型計算0-1時就會產生下溢,這樣計算出來的值為255也就是uint8類型可表示的最大值。
火幣推出《一分鐘讀懂DeFi》系列科普視頻:據官方消息,8月24日,火幣推出《一分鐘讀懂DeFi》系列科普視頻,并與微博財經合作冠名播出,布道DeFi認知,助力行業發展《一分鐘讀懂DeFi》是由火幣成長學院打造的業內首個系統全面講解DeFi的系列科普動畫,繼推出《區塊鏈100問》后的再續佳作。《一分鐘讀懂DeFi》系列動畫對DeFi的發展進行系統梳理,適合想要由淺入深、全面系統了解區塊鏈DeFi的人們輕松了解DeFi。目前視頻已由火幣網官方微博發布。[2020/8/24]
如果一個合約有溢出漏洞的話會導致計算的實際結果和預期的結果產生非常大的差異,這樣輕則會影響合約的正常邏輯,重則會導致合約中的資金丟失。但是溢出漏洞是存在版本限制的,在Solidity<0
人大附中物理老師李永樂科普拜占庭將軍問題和區塊鏈:5月14日,人大附中物理老師、科普視頻網紅李永樂在其公眾號發布視頻《拜占庭將軍問題是什么?區塊鏈如何防范惡意節點?》。李永樂老師在視頻中對拜占庭將軍問題和區塊鏈進行了講解,他表示,拜占庭將軍問題本質上指的是,在分布式計算機網絡中,如果存在故障和惡意節點,是否能夠保持正常節點的網絡一致性問題。在近40年的時間里,人們提出了許多方案解決這一問題,稱為拜占庭容錯法。例如蘭波特自己提出了口頭協議、書面協議法,后來有人提出了實用拜占庭容錯PBFT算法,在2008年,中本聰發明比特幣后,人們又設想了通過區塊鏈的方法解決這一問題。區塊鏈通過算力證明來保持賬本的一致性,也就是必須計算數學題,才能得到記賬的權力,其他人對這個記賬結果進行驗證,如果是對的,就認可你的結果。與拜占庭問題比起來,就增加了叛徒的成本。[2020/5/14]
functionincreaseLockTime(uint_secondsToIncrease)public{lockTime+=_secondsToIncrease;}
聲音 | CNBC主持人:加密貨幣最大的缺點之一就是難以向外行快速科普:CNBC主持人Ran NeuNer近期發推稱,加密貨幣最大的缺點之一就是很難向外行快速解釋。當人們要求我向他們解釋比特幣時,我知道他們至少需要一個小時才能真正理解。[2019/9/10]
functionwithdraw()public{require(balances>0,"Insufficientfunds");require(block
}
漏洞分析
我們可以看到,TimeLock合約充當了時間保險庫。用戶可以將代幣通過deposit函數存入該合約并鎖定,且至少一周內不能提現。當然用戶也可以通過increaseLockTime函數來增加存儲時間,用戶在設定的存儲期限到期前是無法提取TimeLock合約中鎖定的代幣的。首先我們發現這個合約中的increaseLockTime函數和deposit函數具有運算功能,并且合約支持的版本是:0
聲音 | 中科院姚建銓:要加快推進區塊鏈與物聯網融合的科普 培訓:據新華網消息,日前,在區塊鏈與物聯網融合發展峰會上,中國科學院院士姚建銓說,關注區塊鏈技術里面的大數據,跟區塊鏈技術結合起來進行測量和檢測,能更好地提升激光清洗技術。姚建銓建議,無錫今后要加快推進區塊鏈與物聯網融合的科普、培訓,正確引導廣大人民群眾對技術的認知;同時,建立專業、權威,但又普適、成套的理論體系和標準,以此切入區塊鏈的實際應用。[2018/9/18]
fallback()externalpayable{}
functionattack()publicpayable{timeLock
}
這里我們將使用Attack攻擊合約先存入以太后利用合約的溢出漏洞在存儲未到期的情況下提取我們在剛剛TimeLock合約中存入并鎖定的以太:
1.首先部署TimeLock合約;
2.再部署Attack合約并在構造函數中傳入TimeLock合約的地址;
3.調用Attack.attack函數,Attack.attack又調用TimeLock.deposit函數向TimeLock合約中存入一個以太,之后Attack.attack又調用TimeLock.increaseLockTime函數并傳入uint類型可表示的最大值加1再減去當前TimeLock合約中記錄的鎖定時間。此時TimeLock.increaseLockTime函數中的lockTime的計算結果為2^256這個值,在uint256類型中2^256這個數存在上溢所以計算結果為2^256=0此時我們剛剛存入TimeLock合約中的一個以太的鎖定時間就變為0;
4.這時Attack.attack再調用TimeLock.withdraw函數將成功通過block.timestamp>lockTime這項檢查讓我們能夠在存儲時間未到期的情況下成功提前取出我們剛剛在TimeLock合約中存入并鎖定的那個以太。
下面是攻擊流程圖:
修復建議
到這里相信大家對溢出漏洞都有自己的理解了,那么下面我們就以開發者和審計者的角度來分析如何預防溢出漏洞和如何快速找出溢出漏洞:
作為開發者
1.使用SafeMath來防止溢出;
2.使用Solidity0.8及以上版本來開發合約并慎用unchecked因為在unchecked修飾的代碼塊里面是不會對參數進行溢出檢查的;
3.需要慎用變量類型強制轉換,例如將uint256類型的參數強轉為uint8類型由于兩種類型的取值范圍不同也可能會導致溢出。
作為審計者
1.首先查看合約版本是否在Solidity0.8版本以下或者是否存在unchecked修飾的代碼塊,如果存在則優先檢查參數的溢出可能并確定影響范圍;
2.如果合約版本在Solidity0.8版本以下則需要查看合約是否引用了SafeMath;
3.如果使用了SafeMath我們需要注意合約中有沒有強制類型轉換,如果有的話則可能會存在溢出的風險;
4.如果沒有使用SafeMath且合約中存在算術運算的我們就可以認為這個合約是可能存在溢出風險的,在實際審計中還要結合實際代碼來看。
Bytom:大家好!今天很榮幸邀請到MortezaYousefi參與我們的訪談。他是一位攝影師和3D藝術家,受邀討論加密貨幣和他令人興奮的NFT之旅,以及關于在NFT時代成為加密貨幣藝術家的任何.
1900/1/1 0:00:00雖然一些行業在其商業模式中引入了區塊鏈,但有些行業仍在努力確定該技術在其領域中的作用,以及他們可以獲得的資金類型.
1900/1/1 0:00:00據TheBlock12月14日消息,美國國稅局已公布其最終版1040表格,對加密貨幣相關提問進行了一些小的修改。稅務專業人士表示,2020年的措辭給納稅人留下了一些問題.
1900/1/1 0:00:00有報道稱TwitterCEO杰克·多爾西將辭去他在公司的職務。那么這位比特幣的信徒會把下一步的工作中心放在什么上?是否會涉及在市場上處于領先地位的比特幣.
1900/1/1 0:00:00根據市場情報平臺Blockdata今日發布的一份報告,比特幣網絡超過了領先的支付平臺PayPal,以美元價值計算的交易量增加了62%.
1900/1/1 0:00:00巴比特訊,11月29日,StarkWare宣布推出的以太坊Rollup擴容方案StarkNetAlpha已上線以太坊主網。開發者可以在StarkNet上部署他們的合約.
1900/1/1 0:00:00