By:小白@慢霧安全團隊
背景概述
上周寫了智能合約安全審計入門篇——重入漏洞,這次我們接著來說一個同樣很經典的漏洞——?溢出漏洞。
前置知識
首先我們還是先來看看溢出是什么:
算術溢出或簡稱為溢出分為兩種:上溢和下溢。所謂上溢是指在運行單項數值計算時,當計算產生出來的結果非常大,大于寄存器或存儲器所能存儲或表示的能力限制就會產生上溢,例如在solidity中,uint8所能表示的范圍是0-255這256個數,當使用uint8類型在實際運算中計算255+1是會出現上溢的,這樣計算出來的結果為0也就是uint8類型可表示的最小值。同樣的,下溢就是當計算產生出來的結果非常小,小于寄存器或存儲器所能存儲或表示的能力限制就會產生下溢。例如在Solidity中,當使用uint8類型計算0-1時就會產生下溢,這樣計算出來的值為255也就是uint8類型可表示的最大值。
歐易OKEx將于3月18日推出DeFi系列科普視頻:據歐易OKEx官方消息顯示,歐易OKEx將正式推出DeFi系列科普視頻《歐易DeFi20講》,本系列節目由歐易OKEx亞太區CEO馬克金主講。該視頻首期將于3月18日11:00(HKT)推出,用戶可以在歐易OKEx官方學院、金色財經觀看。
《歐易DeFi20講》主要包含DeFi入門指南、全景解讀DeFi生態及如何參與DeFi三個篇章,可以輕松使用戶了解DeFi原理,洞察DeFi價值,掌握DeFi熱點,更多詳情請關注歐易OKEx官方學院。[2021/3/18 18:55:59]
如果一個合約有溢出漏洞的話會導致計算的實際結果和預期的結果產生非常大的差異,這樣輕則會影響合約的正常邏輯,重則會導致合約中的資金丟失。但是溢出漏洞是存在版本限制的,在Solidity<0
動態 | 鏈客社區聯合北京交通廣播推出區塊鏈技術科普節目:12月11日15:15—16:00,區塊鏈技術社區——鏈客區塊鏈技術社區將聯合北京交通廣播FM103.9從零開始為大眾科普解碼區塊鏈技術,蜻蜓FM及北京廣播網同期進行全球直播。首期做客嘉賓為鏈客區塊鏈技術社區創始人郄建軍和百度區塊鏈產品負責人于雅楠。[2019/12/11]
functionincreaseLockTime(uint_secondsToIncrease)public{lockTime+=_secondsToIncrease;}
functionwithdraw()public{require(balances>0,"Insufficientfunds");require(block
聲音 | CNBC主持人:加密貨幣最大的缺點之一就是難以向外行快速科普:CNBC主持人Ran NeuNer近期發推稱,加密貨幣最大的缺點之一就是很難向外行快速解釋。當人們要求我向他們解釋比特幣時,我知道他們至少需要一個小時才能真正理解。[2019/9/10]
}
漏洞分析
我們可以看到,TimeLock合約充當了時間保險庫。用戶可以將代幣通過deposit函數存入該合約并鎖定,且至少一周內不能提現。當然用戶也可以通過increaseLockTime函數來增加存儲時間,用戶在設定的存儲期限到期前是無法提取TimeLock合約中鎖定的代幣的。首先我們發現這個合約中的increaseLockTime函數和deposit函數具有運算功能,并且合約支持的版本是:0
科普時報:區塊鏈與云計算長期發展目標不謀而合:據《科普時報》今日報道,區塊鏈與云計算兩項技術的結合,從宏觀上來說,一方面,利用云計算已有的基礎服務設施或根據實際需求做相應改變,實現開發應用流程加速,滿足未來區塊鏈生態系統中初創企業、學術機構、開源機構、聯盟和金融等機構對區塊鏈應用的需求。另一方面,對于云計算來說,“可信、可靠、可控制”被認為是云計算發展必須要翻越的“三座山”,而區塊鏈技術以去中心化、匿名性,以及數據不可篡改為主要特征,與云計算長期發展目標不謀而合。[2018/5/4]
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且合約中存在算術運算的我們就可以認為這個合約是可能存在溢出風險的,在實際審計中還要結合實際代碼來看。
1992年,尼爾·斯蒂芬森在科幻小說《雪崩》里寫到:在元宇宙里,哪怕你剛剛起床,你的化身仍然能夠穿著得體、裝扮考究.
1900/1/1 0:00:00原標題:《耐克、阿迪、LV等服裝品牌的元宇宙暢想》近些日子,元宇宙相關的話題非常的火熱。元宇宙被譽為是下一代互聯網。許多科技公司都因為元宇宙未來的巨大潛力而紛紛布局元宇宙相關業務.
1900/1/1 0:00:00作者:JesseWalden,JonathanGlick大約20年前,《軟件隨想錄》作者喬爾·斯波爾斯基(JoelSpolsky)創造了一個短語.
1900/1/1 0:00:00來源:央視財經 近期,元宇宙成了市場上的熱點,但與此同時,市面上出現了很多打著元宇宙旗號的區塊鏈游戲。這些游戲宣傳稱可以一邊玩游戲一邊賺錢,月收益甚至接近100%.
1900/1/1 0:00:00萬向區塊鏈蜂巢研習社第71期,邀請了RSS3創始人Joshua分享“Web3時代的個人博客”。在直播中,Joshua以實際用例分享了Web3時代,個人博客從創作,到分發,以及最后的渲染是如何完成.
1900/1/1 0:00:00據news.bitcoin12月4日報道,根據歐洲中央銀行發布的文件,為了創建一個成功的CBDC,貨幣當局需要將數字貨幣建立為一種廣泛的支付和交換手段,并具有足夠的價值存儲功能.
1900/1/1 0:00:00