国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

智能合約漏洞檢測研究綜述

2022-11-15 16:17李雷孝高昊昱牛鐵銘杜金澤
計算機與生活 2022年11期
關(guān)鍵詞:以太攻擊者漏洞

李雷孝,鄭 岳,高昊昱,熊 嘯,牛鐵銘,杜金澤,高 靜

1.內(nèi)蒙古工業(yè)大學 數(shù)據(jù)科學與應用學院,呼和浩特010080

2.內(nèi)蒙古自治區(qū)基于大數(shù)據(jù)的軟件服務工程技術(shù)研究中心,呼和浩特010080

3.內(nèi)蒙古工業(yè)大學 信息工程學院,呼和浩特010080

4.內(nèi)蒙古農(nóng)業(yè)大學 計算機與信息工程學院,呼和浩特010011

近幾年來,新型數(shù)字貨幣發(fā)展迅速,其中以比特幣(bitcoin)為代表的數(shù)字貨幣的價值和社會影響力已經(jīng)不可估量[1]。2008 年Nakamoto[2]在比特幣白皮書中首次提出區(qū)塊鏈的概念,自此區(qū)塊鏈逐漸進入人們的視野。2015 年區(qū)塊鏈的發(fā)展迎來了大爆發(fā),逐漸壯大起來。隨后區(qū)塊鏈被逐步應用在金融[3]、交通[4-7]、醫(yī)療[8-10]以及物聯(lián)網(wǎng)[11-13]等諸多傳統(tǒng)領(lǐng)域當中。隨著區(qū)塊鏈的發(fā)展壯大,智能合約越來越多地被人們關(guān)注和提及。智能合約的概念在1994年由Szabo[14]首次提出,但是由于時代發(fā)展的局限性,智能合約并沒有很好的應用空間,直到區(qū)塊鏈的出現(xiàn),智能合約得到了發(fā)展和應用契機。智能合約逐漸成為區(qū)塊鏈發(fā)展的關(guān)鍵環(huán)節(jié),被視為區(qū)塊鏈2.0的標志之一。

區(qū)塊鏈作為一個讓多個相互不信任的各方使用加密貨幣進行交易的平臺,使用對等網(wǎng)絡解決交易過程中的信任問題,使得對等雙方能夠就交易達成一致。與區(qū)塊鏈的發(fā)展相結(jié)合,加密貨幣得到了快速的發(fā)展。加密貨幣通常采用嚴密邏輯設計的共識協(xié)議(如工作量證明(proof of work,POW[15])、權(quán)益證明(proof of stake,POS)等),由其底層網(wǎng)絡中所有參與的節(jié)點同意,網(wǎng)絡的計算節(jié)點負責在分布式賬本——區(qū)塊鏈中記錄交易后的狀態(tài)。在眾多區(qū)塊鏈網(wǎng)絡中,由于以太坊[16]的實現(xiàn)方式能夠使開發(fā)者使用區(qū)塊鏈編寫去中心化應用程序(Dapp)[17-21]和智能合約,在區(qū)塊鏈社區(qū)中越來越受歡迎。以太坊區(qū)塊鏈平臺是一種基于共識機制的全球化執(zhí)行的虛擬機,也稱為以太坊虛擬機(Ethereum virtual machine,EVM)。它通過實現(xiàn)微內(nèi)核來支持少量指令、堆棧、內(nèi)存和存儲,這支撐了分布式應用程序的全新概念。由于區(qū)塊鏈復雜的協(xié)議在設計和編碼的過程中難以避免出現(xiàn)人工的差錯,隨著區(qū)塊鏈技術(shù)的發(fā)展和應用,其脆弱性和其他性能問題逐漸暴露在人們的視野中。許多重大安全事件的發(fā)生讓人們對區(qū)塊鏈的安全產(chǎn)生了越來越多的關(guān)注。尤其近年來發(fā)生的多起重大安全事件,例如2016 年TheDAO 事件[22],惡意攻擊者利用可重入漏洞竊取了價值6 000萬美金的Ether(以太坊加密貨幣),并由此造成了以太坊硬分叉;此外,2018年美鏈(beauty chain,BEC)[23]合約自身存在整數(shù)溢出的漏洞被攻擊者利用,無限制地復制BEC 代幣,導致BEC代幣的價格跳水歸零;與此同時還有諸如Rubixi利用不可篡改性騙取代幣的龐氏騙局,King of the Ether Throne[24]采用拒絕服務攻擊來騙取代幣的攻擊方式等一系列針對區(qū)塊鏈平臺的攻擊。表1 給出了近年來區(qū)塊鏈遭受的部分標志性的攻擊事件。導致表1 中一系列安全問題出現(xiàn)的原因主要有智能合約一旦部署不可修改、合約執(zhí)行后不可逆、編程語言自身問題或程序員的邏輯問題等。因此如何快速準確地進行漏洞檢測是當前研究的重點,智能合約的漏洞檢測已經(jīng)成為當下的研究熱點。

表1 區(qū)塊鏈安全的重大事件表Table 1 List of major events in blockchain security

本文旨在介紹區(qū)塊鏈中一些常見的漏洞情況,同時介紹一些漏洞檢測的工具和方法,為之后的研究者提供一個綜合化的有關(guān)漏洞工具和方法的介紹。另外本文涉及到的區(qū)塊鏈相關(guān)代碼如無特殊介紹均為以太坊虛擬機的Solidity語言。

1 區(qū)塊鏈和智能合約

區(qū)塊鏈的誕生促進了智能合約的發(fā)展,通過智能合約編寫去中心化應用也為區(qū)塊鏈發(fā)展起到了促進作用。相比傳統(tǒng)程序代碼,智能合約肩負了保證參與多方公平性的問題,同時通過合約管理大量具有經(jīng)濟價值的加密貨幣。本章將簡要概述區(qū)塊鏈和智能合約所用到的技術(shù)和特性。

1.1 區(qū)塊鏈技術(shù)

區(qū)塊鏈是一個分布式的賬本,其利用默克爾樹、簽名、對等網(wǎng)絡以及哈希函數(shù)等技術(shù),為區(qū)塊鏈提供了安全可靠的技術(shù)支持。維基百科中對區(qū)塊鏈的描述為:區(qū)塊鏈是一種不斷增長的紀錄列表,這種記錄稱為“區(qū)塊(Block)”,這些區(qū)塊鏈接到一起,并使用密碼加密以確保安全。區(qū)塊鏈結(jié)合密碼學,可以保證交易的可追溯性、不可篡改性、不可否認性和不可偽造性,支持數(shù)據(jù)安全共享和大規(guī)模協(xié)同計算,實現(xiàn)對用戶身份和機密數(shù)據(jù)的隱私保護以及適用于需要高隱私性和安全性的分布式應用場景中[25]。區(qū)塊鏈在金融、醫(yī)療和交通等社會領(lǐng)域當中的應用以及去中心化的特性等因素,使得區(qū)塊鏈被認為是人類信用進化史上的第四個里程碑。

區(qū)塊鏈系統(tǒng)是由多層架構(gòu)共同構(gòu)成的,區(qū)塊鏈的系統(tǒng)架構(gòu)可分為數(shù)據(jù)結(jié)構(gòu)層、網(wǎng)絡層、共識層、激勵層、合約層和應用層六層,如圖1 所示。區(qū)塊鏈的底層是區(qū)塊,區(qū)塊間通過哈希指針鏈接形成區(qū)塊鏈網(wǎng)絡。區(qū)塊包含區(qū)塊頭和區(qū)塊體,由區(qū)塊頭中的哈希值來定位上一個區(qū)塊的地址,而區(qū)塊體包含實際的交易內(nèi)容,區(qū)塊體的內(nèi)容由該塊的所有者通過私鑰進行簽名以保證其安全性。網(wǎng)絡層的結(jié)構(gòu)是對等網(wǎng)絡,對等網(wǎng)絡是一種動態(tài)的網(wǎng)絡拓撲結(jié)構(gòu),有很強的健壯性。共識層則是通過共識協(xié)議進行挖礦操作。區(qū)塊鏈的參與者計算哈希值,首先計算出哈希值的塊獲得挖礦獎勵。在此就延伸出了共識協(xié)議(工作量證明POW、權(quán)益證明POS 等)。合約層的主要內(nèi)容為人工編寫的智能合約。應用層則用于部署一些去中心化的應用、進行支付等操作,供人們更好地使用區(qū)塊鏈為現(xiàn)實需求服務。

圖1 區(qū)塊鏈的系統(tǒng)架構(gòu)圖Fig.1 Blockchain system architecture diagram

1.2 智能合約

尼克薩博在智能合約白皮書中提出智能合約的設計應遵循可觀察性、客觀可核查性、相對性以及可執(zhí)行性同時減少執(zhí)行的需要的四點設計原則和目標。同時其提出一個需要解決的問題,如何保證一個可信的第三方有足夠的判斷力來恰當?shù)爻袚蝿?,即如何保證第三方的公平性、非惡意性。隨著區(qū)塊鏈的出現(xiàn),研究者發(fā)現(xiàn)智能合約與區(qū)塊鏈可以完美地結(jié)合,用以實現(xiàn)去中心化。智能合約是運行在區(qū)塊鏈系統(tǒng)上的一段代碼,代碼邏輯定義了合約內(nèi)容。智能合約應用以太坊獨有的二進制編碼格式——EVM 字節(jié)碼進行編碼并存儲于區(qū)塊鏈中。然而,智能合約通常由高級語言編寫(例如Solidity)通過智能合約編寫去中心化應用程序,然后編譯成字節(jié)碼上傳到區(qū)塊鏈上。

圖2 以HelloWorld 為例展示智能合約的部署流程。首先調(diào)用transaction 函數(shù)在礦工打包的時候會生成智能合約地址。智能合約地址的生成是由創(chuàng)建者的賬號和發(fā)送的交易數(shù)作為隨機數(shù)輸入,通過Kecca-256加密算法重新創(chuàng)建一個地址作為賬號。即最后合約地址對應合約的代碼會保存在區(qū)塊鏈數(shù)據(jù)庫中,調(diào)用者只需要有合約地址和abi文件就可以調(diào)用合約的代碼。

圖2 智能合約的部署流程Fig.2 Deployment process of smart contract

雖然智能合約促進了區(qū)塊鏈技術(shù)的發(fā)展,但是由于智能合約編寫語言自身缺陷或程序員編寫過程中出現(xiàn)的邏輯錯誤等問題,使智能合約產(chǎn)生了一些漏洞,因此造成了智能合約成為攻擊者攻擊的目標。一些統(tǒng)計顯示智能合約中的漏洞是普遍存在的,例如整數(shù)溢出漏洞、重入攻擊、拒絕服務攻擊等都是常見的智能合約漏洞類型。

2 智能合約的漏洞

智能合約作為區(qū)塊鏈技術(shù)的重要組成,通過編寫智能合約在區(qū)塊鏈上部署去中心化的應用程序為區(qū)塊鏈快速發(fā)展提供了幫助。但同時大量針對智能合約的漏洞也暴露在漏洞檢測人員的視野中。在漏洞研究中,據(jù)統(tǒng)計存在25 種左右的常見漏洞。Atzei等人[26]對當時存在的智能合約漏洞,根據(jù)Solidity、EVM 和Blockchain 三個層級進行了分類。表2 展示了Nicola 對漏洞的分類。本章將列舉八種以太坊中常見的漏洞,并對部分漏洞代碼進行重現(xiàn)。由于智能合約典型漏洞案例大多由以太坊智能合約引發(fā),并且研究者常以以太坊智能合約作為研究對象進行研究。因此本文以以太坊智能合約作為研究對象,詳細描述了智能合約安全漏洞。

表2 以太坊漏洞分類Table 2 Ethereum vulnerabilities classification

2.1 重入攻擊漏洞

重入攻擊漏洞是區(qū)塊鏈網(wǎng)絡中被頻繁利用的漏洞之一,TheDao 事件便是利用重入攻擊漏洞進行的攻擊。重入攻擊漏洞常見于轉(zhuǎn)賬操作中,由于Solidity語言本身的原因,fallback[27]函數(shù)會在函數(shù)調(diào)用結(jié)束前讓攻擊者有機會再次執(zhí)行被調(diào)用的函數(shù)。攻擊者在執(zhí)行轉(zhuǎn)賬操作時對fallback函數(shù)進行修改。在執(zhí)行轉(zhuǎn)賬操作的時候,會涉及到跨合約的調(diào)用,此時攻擊者會利用這些外部調(diào)用,設計惡意的代碼多次調(diào)用漏洞合約中的轉(zhuǎn)賬操作,將賬戶中的余額不斷消耗,直至gas耗盡。這里對重入攻擊漏洞進行代碼重現(xiàn),具體代碼如下所示。

重入漏洞代碼示例:

在該合約中,withdraw()函數(shù)使用call.value()方法進行轉(zhuǎn)賬時,該方法會傳遞所有可用gas 進行調(diào)用。當該方法轉(zhuǎn)賬的地址為攻擊者的合約地址時,就會調(diào)用攻擊者合約地址的fallback函數(shù)。如果攻擊者在自身合約的fallback 函數(shù)中寫入調(diào)用withdraw函數(shù)的代碼,就可不停地循環(huán)獲取代幣,不再執(zhí)行balance[msg.sender]-=amount的減幣操作,從而導致重入漏洞攻擊的發(fā)生。

2.2 整數(shù)溢出漏洞

整數(shù)溢出的類型包括乘法溢出、加法溢出和減法溢出三種。由于EVM為所有的整數(shù)指定了固定大小的數(shù)據(jù)類型,一個整型的變量只能由一定范圍的數(shù)字來進行表示。以uint8 為例,uint8 的范圍為0 到255,因此如果存儲一個256位的數(shù)值,則存儲結(jié)果將會變?yōu)?。如圖3所示,8位無符整數(shù)255在內(nèi)存中占據(jù)8 bit位置,若再加1則整體會因為進位而導致整體翻轉(zhuǎn)為0,進而導致原有的8 bit整數(shù)表示為整數(shù)0。

圖3 整數(shù)溢出示例Fig.3 Integer overflow example

針對整數(shù)溢出漏洞,以太坊為開發(fā)者提供了SafeMath庫[28],庫中的數(shù)值計算操作會檢測整數(shù)溢出行為,并在溢出發(fā)生時拋出異常。

2.3 訪問控制漏洞

以太坊合約開發(fā)者(Owner)具有合約的超級權(quán)限,包括凍結(jié)代幣、增發(fā)代幣、銷毀代幣、鑄造新的代幣以及終止合約運行等。若合約權(quán)限被攻擊者竊取將造成嚴重影響[29]。訪問控制漏洞的產(chǎn)生是由于智能合約的編寫者沒能準確檢查合約中函數(shù)的訪問權(quán)限,例如將一些應該設置為private 的函數(shù)不加區(qū)別或未定義權(quán)限,默認為了public類型。這些函數(shù)本應該是普通用戶無法訪問的,因此就導致攻擊者有足夠的權(quán)限去訪問本不該被其訪問的函數(shù)或者變量。

訪問控制漏洞示例:

如上所示,setOwner 函數(shù)未定義函數(shù)類型,因此其類型為public,此函數(shù)可以用于設置合約的擁有者。但其標注為public 類型就使得所有人都擁有了訪問的權(quán)限,因此攻擊者可以輕松地設置其他用戶為owner并竊取其中的加密貨幣。

2.4 交易順序依賴攻擊

與大多數(shù)區(qū)塊鏈一樣,以太坊節(jié)點通過匯總交易并將其形成塊。一旦礦工解決了共識機制(例如以太坊的POW),那么該交易就被認為是有效的。解決該區(qū)塊的礦工能夠選擇來自該礦池的哪些交易將包含在該區(qū)塊中,這通常是由gas交易決定的。在這里有一個潛在的攻擊媒介,攻擊者可以觀察事務池中是否存在可能包含問題解決方案的交易,修改或撤銷攻擊者的權(quán)限或更改合約中對攻擊者不利的狀態(tài)。然后,攻擊者可以從這個事務中獲取數(shù)據(jù),并創(chuàng)建一個更高級別的事務gas,在交易公布之前將其交易打包存放在一個區(qū)塊中。

如下代碼示例所示,此合約包含10個以太幣,如果礦工能成功查找到hash,則發(fā)放10 個以太幣給第一個查找到此hash 的礦工。但是在這個過程中,攻擊者可以時刻關(guān)注到交易池中所有人提交的答案,攻擊者也可以隨時檢查答案的有效性,然后發(fā)起更高gas 的交易,從而獲得這筆交易的10 以太幣獎勵。而第一個查找到此hash的礦工將一無所獲。因此錯誤的交易順序可能會對合約造成負面的影響[30]。

交易順序依賴攻擊代碼示例:

2.5 對可預測變量的依賴

對可預測變量的依賴[31]是由于在區(qū)塊鏈中取隨機操作存在偽隨機行為,即攻擊者可以通過某些手段去預測下一步的變量值,達到控制合約并造成不可預料的結(jié)果從而取得加密貨幣的目的。

在以太坊中,區(qū)塊頭包含一些以太坊自身特殊的字段來表示區(qū)塊的屬性值,智能合約可以通過以太坊提供的這些接口來讀取相應的屬性值,如block.coinbase(address)、block.gaslimit(uint)等。在以太坊中存在熵的概念[32],即隨機性。由于以太坊不存在傳統(tǒng)編程語言中的Random()函數(shù),而是利用這些屬性值產(chǎn)生隨機數(shù)。聰明的攻擊者會利用這些屬性值去尋找隨機數(shù)的生成方法,并竊取加密貨幣。同時由于一個區(qū)塊的時間戳是由礦工決定的,并且允許有900 s 的偏移,這就給一些投機的礦工利用這個時間節(jié)點去搶先獲取出塊獎勵的機會。

對可預測變量的依賴代碼漏洞示例:

如上面展示了一個時間戳依賴的例子,礦工可以根據(jù)需要調(diào)整時間戳,因此如果合約中有足夠的以太幣,計算出某個區(qū)塊的礦工將被激勵選擇一個now%15==0 的時間戳,這樣便可有機會贏得這個合約。由于每個區(qū)塊只允許一個人下注,也易受前置交易的攻擊。由于塊時間戳是單調(diào)遞增的,礦工不能自主選擇任意的塊時間戳,這些塊可能會被網(wǎng)絡拒絕。

2.6 tx-origin濫用

以太坊智能合約有一個全局變量tx.origin[33],它能夠回溯整個調(diào)用棧并返回最初發(fā)起調(diào)用的合約地址。若合約使用這個變量做用戶驗證或授權(quán)操作,攻擊者便可以利用tx.origin 的特性創(chuàng)建相應的攻擊合約盜取以太幣。例如,攻擊者在自己的Fallback 函數(shù)中調(diào)用受害者合約的取錢函數(shù),通過誘導受害者合約轉(zhuǎn)賬以太幣給攻擊者合約,而由于“tx.origin==owner”的緣故,會導致無法檢測出異常,從而使受害者合約中的以太幣全部轉(zhuǎn)到攻擊者合約賬戶中。

tx-origin漏洞代碼示例:

如上所示,合同擁有者成功發(fā)送了一個交易給攻擊者合約,這將觸發(fā)Fallback函數(shù)執(zhí)行。在Fallback函數(shù)中調(diào)用被攻擊合約里的withdrawAll()函數(shù)。這將導致被攻擊合約里的所有代幣被提取到攻擊者的地址。這是因為最初合約的調(diào)用者是受害者合約地址(這里是受攻擊的合約地址)。因而,tx.origin等于所有者,在被釣魚合約的第11 行上的require 語句就會不起作用,因此withdrawAll()函數(shù)得以繼續(xù)執(zhí)行。

2.7 拒絕服務攻擊

拒絕服務攻擊(denial of service,DOS)[34]就是用戶想要進行的操作或服務請求無法被系統(tǒng)處理。DOS 的攻擊方式有多種,其中針對智能合約的DOS攻擊屬于利用協(xié)議漏洞進行攻擊的手段,攻擊將導致合約在短時間內(nèi)無法運行,或者某些情況下永久無法運行。因此在區(qū)塊鏈網(wǎng)絡上造成永久的“凍土”,即合約被鎖定,用戶的加密貨幣也隨合約一同“冰封”。拒絕服務攻擊的典型案例為Throne of King of Ether,在此游戲合約中,攻擊造成了沒有成功拿到王位的人不能取回作為保證金的加密貨幣,以下面的游戲合約為例展示拒絕服務攻擊。在此游戲中,只有支付大于emperor的金額才能成為新的emperor,但要先退回之前的emperor 的加密貨幣才能更改新的emperor。如果前一個emperor 一直不接受退回的加密貨幣,則前一個emperor 就能一直保持emperor的身份,以此造成拒絕服務攻擊。

拒絕服務攻擊代碼示例:

2.8 動態(tài)數(shù)組雙重訪問攻擊

動態(tài)數(shù)組雙重訪問攻擊(dynamic array doubleaccess attack)區(qū)別于雙花攻擊,由Chang 等人[35]于2020 年提出。如圖4 所示,由于智能合約或者EVM底層的機制,不同的變量可能存儲在同一位置。但是某些情況下會導致存儲的變量被覆蓋,進而導致合約的執(zhí)行不正確。動態(tài)數(shù)組雙重訪問攻擊會導致兩種主要的危害。

圖4 動態(tài)數(shù)組和映射變量雙重訪問攻擊示意圖Fig.4 Schematic diagram of double access attacks on dynamic arrays and mapping variables

(1)繞過限制條件。即可以修改if或require的條件分支語句修改狀態(tài)變量的值。

(2)特權(quán)升級。攻擊者利用此漏洞破壞合約的存儲結(jié)構(gòu),可以任意執(zhí)行變量覆蓋的操作,從而執(zhí)行一些普通用戶無法執(zhí)行的操作。

因此可以設計在同一存儲位置中訪問不同類型的變量,進行雙重訪問攻擊,通過控制合約執(zhí)行過程,竊取以太幣。

目前在以太坊環(huán)境中缺少有效的工具能夠?qū)討B(tài)數(shù)組雙重訪問攻擊進行有效的檢測,依賴人工方法進行檢測效率低,因此設計有效的動態(tài)數(shù)組雙重訪問攻擊漏洞檢測工具是當前的重要研究方向。

3 智能合約漏洞檢測方法

第2章介紹了八種常見的漏洞類型,由于區(qū)塊鏈不可篡改性,需要在上鏈前把智能合約中存在的漏洞進行檢查,避免存在漏洞的智能合約被部署上鏈。本章介紹了形式化驗證、符號執(zhí)行、模糊測試以及機器學習等幾類智能合約漏洞檢測的方法,并分別介紹了對應方法所使用的一些工具。

3.1 利用形式化驗證的審計方法

目前,形式化驗證技術(shù)已經(jīng)在核電、航天等高安全要求的領(lǐng)域取得了成功應用,通過將形式化方法應用于智能合約漏洞檢測,可以使得智能合約的生成和執(zhí)行有規(guī)范性約束,從而保證合約的可信性和可靠性。形式化驗證是智能合約安全分析的重要技術(shù)之一。通過形式化語言把合約中的概念、判斷、推理轉(zhuǎn)化成形式化模型,從而消除合約中的歧義性和不通用性,然后配合嚴謹?shù)倪壿嫼妥C明,驗證智能合約中函數(shù)功能的正確性和安全性[36]。這些形式化驗證方法主要包括以下四類方法:基于類BAN 邏輯的形式化方法[37],基于模型檢驗的形式化方法[38],基于密碼學原語代數(shù)屬性的形式化方法和基于定理證明的形式化方法。

常見的形式化驗證方法包括模型檢測和演繹驗證。模型檢測列舉出所有可能的狀態(tài)并逐一檢驗,這種方法的基本思想通過數(shù)理邏輯證明的方式,驗證代碼在規(guī)范描述的前提下滿足某些特性。

ZEUS[39]是一款利用形式化驗證方法進行漏洞檢測的工具,該工具支持將Solidity 語言編寫的智能合約轉(zhuǎn)換為LLVM(low level virtual machine)的中間語言表示,再利用形式化驗證方法驗證安全性。但其無法檢測跨函數(shù)的重入攻擊和一些跨功能的分析策略[40]。

Isabelle/HOL 是Hirai[41-42]提出的針對EVM 字節(jié)碼進行檢測的形式化驗證工具,將EVM 字節(jié)碼通過lem language 轉(zhuǎn)換成一個形式化的模型,然后通過形式化的模型去驗證代碼邏輯中是否存在問題?;贗sabelle 方法,研究人員將其進行了改進,放棄了lem language 這種相對來說低效率的方式,而是采用Fframework(一種航天領(lǐng)域使用的形式化漏洞驗證框架)[43]和K-framework(一種語義的整合框架)[44]來進行驗證。

此外國內(nèi)的一些學者也提出了自己的形式化驗證模型,董春燕等人[45]提出了一種基于CPN(colored Petri net)模型的形式化驗證方法,用于Auction 合約的驗證。該模型能成功檢測出潛在可能發(fā)生不回退加密貨幣的漏洞出現(xiàn)的位置。歐陽恒一等人[36]借鑒數(shù)學歸納法的思想,優(yōu)化SmartVerif(一種基于定理證明的形式化驗證結(jié)合機器學習的形式化方法)模型驗證過程,避免狀態(tài)空間的無限遍歷并能成功找出目標漏洞。

3.2 利用符號執(zhí)行的審計方法

符號執(zhí)行審計方法的主要思想是將代碼中的變量符號化。通過符號化程序輸入,符號執(zhí)行能夠為所有的執(zhí)行路徑維護一組約束,執(zhí)行之后,約束求解器將用于求解約束并確定該執(zhí)行的輸入,最后利用約束求解器得到新的測試輸入,檢測符號值是否可以產(chǎn)生漏洞。符號執(zhí)行法應用于智能合約漏洞檢測的執(zhí)行過程為:首先,將合約中的變量值符號化;然后逐條解釋執(zhí)行程序中的指令,在解釋執(zhí)行過程中更新執(zhí)行狀態(tài)、搜集路徑約束,以完成程序中所有可執(zhí)行路徑的探索并發(fā)現(xiàn)相應的安全問題。

趙偉等人[29]對智能合約反編譯生成的字節(jié)碼構(gòu)建智能合約執(zhí)行的控制流圖,隨后利用約束求解生成軟件測試用例,對已知的五種類型漏洞達到了85%的檢測成功率。圖5為其符號執(zhí)行過程流程圖。

圖5 符號執(zhí)行流圖Fig.5 Symbolic execution flow graph

Oyente[46]是第一個用于以太坊上的漏洞檢測工具,該工具采用符號執(zhí)行方法,直接檢測EVM 字節(jié)碼,支持重入漏洞、交易順序依賴以及偽隨機等安全漏洞的檢測,但是該工具對于自殺合約和tx-origin的濫用問題并不能做到有效的檢測。Mythril[47]作為一個符號執(zhí)行的漏洞檢測工具,通過對EVM 字節(jié)碼進行分析,能夠支持多達14種漏洞的檢測。MythX[48]整合了Truffle和Remix等工具,能夠支持多平臺的漏洞檢測。

面對現(xiàn)有符號執(zhí)行方法檢測速度較慢的問題,李宗鴻等人提出一種自底向上求解約束的改進符號執(zhí)行方法[49]。結(jié)合深度優(yōu)先遍歷和廣度優(yōu)先遍歷進行路徑的選擇,以此提高符號執(zhí)行的代碼覆蓋率。該方法顯著地提高了中等規(guī)模智能合約中的檢測效率,并在正確率方面取得了不錯的效果。

3.3 利用模糊測試的審計方法

模糊測試是一種通過向目標系統(tǒng)提供非預期的輸入并監(jiān)視異常結(jié)果來發(fā)現(xiàn)軟件漏洞的方法。模糊測試方法的核心思想是將自動或半自動化生成的隨機數(shù)據(jù)輸入到一個程序中,并檢測程序的異常,以發(fā)現(xiàn)可能的程序錯誤。在模糊測試中用隨機的壞的數(shù)據(jù),即fuzz去攻擊程序并觀察出現(xiàn)問題的點。其好處在于這個數(shù)據(jù)是不符合邏輯的,因為程序存在的漏洞大部分若按照人的正常邏輯是無法觀察到的,因此模糊測試是一項十分有效的漏洞檢測技術(shù)。

ContractFuzzer[50]是一個利用模糊測試進行智能合約漏洞檢測的黑盒測試工具。它使用智能合約的二進制接口生成交易,通過EVM執(zhí)行這些交易,通過分析執(zhí)行日志來檢測安全漏洞。圖6 展示的是ContractFuzzer 的檢測流程。其通過第0 和1 步在以太坊官網(wǎng)獲取開源的智能合約并通過對ABI 簽名分析生成一個ABI規(guī)范的模糊測試輸入,并在3、4、5步執(zhí)行模糊測試過程。

圖6 ContractFuzzer架構(gòu)圖Fig.6 Overview of ContractFuzzer

SoliAudit 是一款Liao 等人[51]提出的機器學習和模糊測試相結(jié)合的漏洞檢測工具,SoliAudit 動態(tài)模糊器不僅能夠模糊函數(shù)參數(shù),還可以模糊區(qū)塊鏈環(huán)境的一些參數(shù),如gas和ether。同時利用操作碼特征進行機器學習分類,漏洞識別達到90%,還可以自動生成模糊測試合同以及適應新的漏洞。

GasFuzzer[52]是一個利用模糊測試方法,用于檢測交易中有較高gas消耗異常的工具。通過提出gasgreedy 和gas-leveling 兩種策略有效提高了漏洞檢測的效率。相比ContractFuzzer 漏洞檢測工具,效率提升了約28%。

3.4 利用機器學習的審計方法

機器學習作為當前計算機研究方向的熱點,由于在漏洞檢測中可以提供較高的自動化程度和漏洞檢測效率,與漏洞檢測結(jié)合也成為了大量學者的研究熱點。

傳統(tǒng)的智能合約代碼審計工具高度依賴專家定義的固定規(guī)則或模式來檢測智能合約的漏洞,但專家規(guī)則容易出錯,一些復雜的模式也不容易被覆蓋。同時基于規(guī)則開發(fā)的檢測工具可伸縮性有限[30],隨著智能合約數(shù)量的爆炸式增長,這種模式的適用性越來越低。機器學習在漏洞檢測中可以提供較高的自動化程度和漏洞檢測效率。因此利用機器學習的方法逐漸進入人們的視野。本節(jié)會介紹幾種利用機器學習進行智能合約漏洞檢測的工具和方法。

Xiong等人[53]提出了一種利用強化學習的智能合約漏洞檢測方法SmartVerif,該方法增強了漏洞檢測的自動化程度,提高了檢測的準確率。但是由于該方法需要為每一種協(xié)議訓練一個獨立的模型,或是利用預訓練和優(yōu)化的網(wǎng)絡來驗證協(xié)議,存在驗證時間增加以及精度降低的問題。因此如何訓練通用的模型,增加檢測效率將是以后的研究重點。通過實驗與傳統(tǒng)的漏洞檢測方法對比,證明該方法比傳統(tǒng)的漏洞檢測方法在效率和準確率方面均有大幅度的提高,同時其自動化程度也比傳統(tǒng)方法更加強大。

Xing 等人[54]提出用Tensorflow 構(gòu)造卷積神經(jīng)網(wǎng)絡模型以漏洞合約的切片矩陣做輸入,用卷積神經(jīng)網(wǎng)絡算法分別對has_short_address、has_flows和is_greedy三個漏洞合約代碼片段訓練,得到三個檢測合約漏洞的分類模型。利用Tensorflow 構(gòu)造卷積神經(jīng)網(wǎng)絡模型,只使用卷積層,然后導出的矩陣被提供給神經(jīng)網(wǎng)絡,最后得到基于卷積神經(jīng)網(wǎng)絡的分類模型。利用卷積神經(jīng)網(wǎng)絡和隨機森林做對比實驗,但對比實驗結(jié)果顯示隨機森林方法的效果更好。

Momeni 等人[55]引入機器學習預測模型,采用兩個靜態(tài)代碼分析器標記了1 000 個以太坊平臺使用的智能合約。其對漏洞的檢測平均準確率達到95%。

在使用機器學習的方法中,多將代碼轉(zhuǎn)換為控制流圖(control flow graph,CFG),利用CFG 進行切片,對切片矩陣建立機器學習的預測模型,利用CFG建模的同時配合字符串匹配和模糊測試等代碼審計技術(shù)對漏洞進行檢測,以獲得較高的準確率和效率。

Qian[56-57]團隊致力于將專家定義的安全模式與機器學習相結(jié)合。將源代碼的控制和數(shù)據(jù)流語義轉(zhuǎn)換為合約圖,同時設計一個消除階段來進行圖的歸一化。提出了一種新的消息傳播網(wǎng)絡(temporal message propagation network,TMP)用于從規(guī)范化圖中提取圖特征,并將圖特征與設計的專家模式相結(jié)合,產(chǎn)生最終的檢測系統(tǒng)。利用深度學習網(wǎng)絡(deep neural networks,DNN)、無度圖卷積神經(jīng)網(wǎng)絡(degree-free graph convolutional neural network,DR-GCN)、雙向長短期記憶(bi-directional long short-term memory,Bi-LSTM)以及長短期記憶(long short-term memory,LSTM)進行針對某一類型漏洞的精確檢測。此外還提出了智能合約的合約片段表示,用于捕捉基本的語義信息和控制流依賴。在檢測性能的表現(xiàn)方面,利用深度學習網(wǎng)絡的方法在針對重入攻擊、時間戳依賴以及無限循環(huán)的檢測準確率分別達到了89.15%、89.02%和83.21%。其他學習模型也對重入攻擊有較好的檢測準確性。

Tann等人[58]也使用機器學習長短期記憶(LSTM)對智能合約的漏洞進行順序?qū)W習。該方法能夠快速檢測到智能合約的漏洞,并實現(xiàn)了99%的準確率,保證了智能合約上鏈之前的安全性。

3.5 利用其他方法的漏洞檢測技術(shù)

除了現(xiàn)有的符號執(zhí)行和形式化驗證等主流檢測方法外,還有許多利用其他方法和思想的漏洞檢測方式。

在以太坊中,透明公開的智能合約占了總交易量和總交易金額的2/3 左右,但是有大約77.3%的智能合約是不透明非開源的。針對這種因非開源導致無法利用正面解析智能合約源代碼的問題,Zhou 等人[59]提出了Erays 方法,一種利用逆向工程的思想來進行漏洞檢測的方法。Erays方法用于研究以太坊系統(tǒng)中不透明的智能合約,從十六進制編碼的智能合約作為輸入,將十六進制的字符串分解為EVM指令,從十六進制字符串的第一個字節(jié)開始,每個字節(jié)被順序解碼成相應的指令,而后從基本塊中恢復控制流圖,以此來進行漏洞檢測工作。但是該方法也存在巨大的弊端,由于沒有源代碼,該項工作的代價昂貴,因此該工具也難以實現(xiàn)高自動化,更適合于手動分析并且高度依賴專家經(jīng)驗。

除逆向工程外也有在傳統(tǒng)漏洞檢測方法的思想上做出改進的技術(shù)方法,韓松明等人[60]提出了Dc-Hunter。Dc-Hunter 檢測方案,通過計算待檢測合約與已知漏洞合約之間的相似性檢測智能合約,同時此方法還可以用于發(fā)現(xiàn)潛在的蜜罐合約。該方法無需源碼和預先定義的漏洞特征,通過應用切片降低無關(guān)代碼影響,并使用圖嵌入算法來捕捉函數(shù)的結(jié)構(gòu)信息。

在利用傳統(tǒng)特征代碼匹配的方法中,Slither[61]應用廣泛使用的污點跟蹤技術(shù)和數(shù)據(jù)流來提取細化信息。它將智能合約轉(zhuǎn)化為中間表示SlithIR,利用這種中間表示與問題代碼做匹配進行檢測。其性能在準確率和時間效率方面取得了不錯的表現(xiàn)。同時EASYFLOW[62]也是利用污點跟蹤來進行漏洞檢測的工具,在對具體的漏洞合約檢測時同樣取得了不錯的效果。同樣的,SmartCheck[63]也是一種利用中間表示來進行漏洞檢測的方法,通過將智能合約源代碼轉(zhuǎn)換為一種基于XML 的中間表示,從而形成對漏洞的有效檢測,但與ZEUS一樣,若語義定義不準確,會大大降低其準確率。傳統(tǒng)的靜態(tài)分析方法很容易應用到其他區(qū)塊鏈平臺和不同語言編寫的智能合約中,但是其執(zhí)行效率和準確率問題有待提高。

3.6 各類檢測方法存在的問題

本節(jié)通過使用檢測速度、適用范圍、自動化程度以及準確率四項評價指標來說明上述各類檢測方法存在的問題及其局限性。

形式化驗證方法審計智能合約安全的工作,從應用之初就存在大量的問題。形式化驗證方法的局限性在于其應用了大量的數(shù)學推導和證明過程,因此使得一些非專業(yè)人員很難參與此類方法的研究,導致基于該種方法的檢測工具發(fā)展緩慢。同時由于復雜的推理和驗證過程,造成其適用范圍降低且自動化程度較低。

符號執(zhí)行方法需要對源碼轉(zhuǎn)換成操作碼(OPCODE)之后生成控制流圖,而后需要轉(zhuǎn)換為一種自定義的語義再進行驗證。這一個復雜的過程中涉及到大量的路徑遍歷和遍歷路徑的約束問題,路徑問題就很難避免出現(xiàn)路徑爆炸,因此是十分耗時的。若通過限制條件減少遍歷路徑,則會使得檢測準確率降低。

模糊測試方法與其他方法相比,可用工具最少,各類評價指標上的表現(xiàn)都不盡人意。主要原因在于模糊測試需要精巧的設計測試過程,前文提到的模糊測試方法需要隨機種子進行檢測,但隨機種子很難覆蓋全部路徑,因此導致其檢測的準確率不能達到理想的狀態(tài)。

機器學習方法在檢測結(jié)果方面的效果表現(xiàn)最為出色,但是取得出色的結(jié)果依賴于大量開源智能合約的支持。但開源智能合約在整個已部署的智能合約中占比較低,會影響這類方法的性能。隨著開源智能合約的數(shù)量提升,機器學習方法的效率也會提升。同時可以注意到,機器學習方法在適用范圍方面表現(xiàn)較差。由于機器學習方法的學習過程要具體到某一個具體的函數(shù)或某一類漏洞的代碼段,需要對每種漏洞進行建模,這就降低了其通用性。

特征匹配方法作為一種靜態(tài)分析方法,其檢測速度快并能夠迅速響應新漏洞的優(yōu)勢明顯。不同于傳統(tǒng)的漏洞檢測,區(qū)塊鏈的漏洞檢測受限于開源智能合約的數(shù)量。但是以太坊中有超過一半的非開源智能合約,在無法獲得開源代碼的情況下,漏洞檢測人員可以獲得其操作碼但是對操作碼的分析代價十分巨大。因此該方法的適用范圍有限,同時由于智能合約函數(shù)和一些特征自身限制,導致特征匹配方法的漏報率較高。

本文通過實驗分析對比了各種漏洞檢測方法,通過實驗數(shù)據(jù)更直觀地體現(xiàn)各種方法的優(yōu)缺點。從以太坊官網(wǎng)中選取450個智能合約樣本,通過實驗對VaaS、Oyente、ContractFuzzer、DR-GCN、Slither 五種具有代表性的工具進行測試,并針對可重入和可預測變量的依賴兩種類型漏洞進行檢測。從準確率、支持漏洞數(shù)量和平均檢測速度三方面對漏洞檢測工具的性能進行評估。本文實驗具體實驗環(huán)境為操作系統(tǒng)Windows 10,CPU Intel?CoreTMi5-10500 CPU@3.10 GHz 3.10 GHz,內(nèi)存16 GB,Python版本為2.7.2和3.7.0,GPU 為NVIDIA GeForce RTX 2060 super。實驗結(jié)果如表3所示。

表3 各類漏洞檢測方法的評價表Table 3 Evaluation of various vulnerabilities detection methods

從表3中的實驗結(jié)果可以看出,在準確率方面機器學習方法DR-GCN 表現(xiàn)出較高的精度,同時在檢測速度上具有絕對的優(yōu)勢。VaaS作為一個成熟的商業(yè)工具在支持的漏洞數(shù)量上表現(xiàn)出較強優(yōu)勢。但同時也可以看出形式化驗證方法和模糊測試方法在檢測速度上的劣勢相當明顯。機器學習方法雖然在準確率和檢測速度方面擁有較強的優(yōu)勢,但其難以建立起通用的模型,因此支持的漏洞數(shù)量較少。

需要說明的是,由于形式化驗證方法的復雜性以及缺少足夠的開源工具,因此選擇VaaS作為本次實驗對象。VaaS是一款成熟的商用漏洞檢測工具,因此其支持檢測的漏洞數(shù)量和準確率都有不俗的表現(xiàn)。

4 未來研究方向與總結(jié)

4.1 未來研究方向

(1)符號執(zhí)行的路徑優(yōu)化

符號執(zhí)行方法由于路徑選擇的需要將面臨路徑爆炸問題,如何縮短符號匹配的路徑、優(yōu)化最優(yōu)路徑、避免路徑爆炸問題是以后提高符號執(zhí)行工具效率的重點方向。

在優(yōu)化符號執(zhí)行中,通過廣度優(yōu)先遍歷和深度優(yōu)先遍歷結(jié)合,提高符號執(zhí)行代碼覆蓋率。在對路徑進行遍歷的同時,對路徑的選擇進行優(yōu)化,精簡對程序無影響的路徑,以此縮短漏洞檢測的時間,提高執(zhí)行效率。

(2)自動化程度較低

當前多數(shù)工具的自動化程度較低且高度依賴人工檢測和專家方法,部分檢測工具的自動化程度不高,隨著智能合約數(shù)量的增長,自動化程度低的弊端逐漸顯現(xiàn),在工作量提高時檢測效率低的問題亟需解決。因此如何提高自動化程度將是未來研究的重點。

利用機器學習的方法可以使自動化程度顯著提高,在未來的研究中,應致力于深度學習方法的研究,由此提高智能合約漏洞檢測的自動化程度和整體效率。

(3)漏洞類型覆蓋率低

現(xiàn)階段智能合約的漏洞類型多,不同區(qū)塊鏈網(wǎng)絡編寫智能合約采用的語言也不盡相同,這也給漏洞檢測帶來了困難。本文調(diào)研的眾多漏洞檢測工具個體支持檢測的漏洞類型最多不超過10 種,但現(xiàn)有常見的漏洞類型多達20多種。因此下一步的重點是整合更多的漏洞檢測工具以提高漏洞覆蓋率,同時可以致力于使用機器學習方法建立通用的模型,使用機器學習方法能更好地提高漏洞覆蓋率,以此作為今后的研究重點。

(4)漏洞檢測效率較低

當前的漏洞檢測準確率較低且速度較慢,如何提高漏洞檢測效率,即如何解決在檢測過程中出現(xiàn)的假陽性、真陰性問題以及如何提高漏洞檢測的速度是未來研究過程中需要探索的問題。當前漏洞檢測效率低的原因是形式化驗證等方法需要大量的數(shù)學推導同時依賴專家經(jīng)驗,此計算過程時間較長,因此優(yōu)化數(shù)學方法、優(yōu)化搜索路徑或使用深度學習方法都能有效提高檢測效率。

(5)智能合約開源程度低

當前智能合約的開源程度較低,這就給漏洞檢測造成了困難。由于現(xiàn)階段非開源智能合約超過半數(shù),促進智能合約的開源才能有效與機器學習結(jié)合,以此為研究者提供更好的代碼檢測環(huán)境。同時利用這些非開源的智能合約進行逆向工程的漏洞檢測,提高對非開源智能合約的利用,將是解決現(xiàn)有開源智能合約不足問題的方法。

(6)機器學習方法構(gòu)建通用模型

當前機器學習方法雖然能夠?qū)崿F(xiàn)較高的學習效率與較好的學習結(jié)果,但是當前智能合約數(shù)量的增長速度快,漏洞類型也越來越多,而機器學習方法大多只針對某一具體漏洞或具體函數(shù)進行學習,對新漏洞的適應能力不足,因此需要形成通用的漏洞檢測模型。

構(gòu)建通用模型或適用性更廣的模型來同時檢測更多的漏洞將是使用機器學習方法未來研究的方向。通過構(gòu)建通用檢測模型,將會使機器學習方法更快速、方便地服務于漏洞檢測,并做到對新型漏洞的快速響應。

(7)可移植性低

當前的智能合約編寫語言種類繁多,平臺較多,多數(shù)漏洞檢測軟件的跨平臺性差甚至完全不支持跨平臺。未來如何使成熟的漏洞檢測工具在支持更多智能合約語言的同時提高其跨平臺性,以及使漏洞檢測工具更好地發(fā)揮其檢測的效率將是研究的重點方向。整合不同漏洞檢測工具,發(fā)揮其不同的性能優(yōu)勢,將會更好地提高檢測工具的檢測效率和可移植性。

(8)缺乏統(tǒng)一的評價指標和完善的漏洞合約庫

現(xiàn)階段智能合約的漏洞檢測工具評價標準集中在速度、準確率等指標,缺少統(tǒng)一的評價指標。而且每種工具支持的漏洞數(shù)量、跨平臺性等不盡相同。因此需要整合漏洞檢測工具的評價標準,綜合考慮可移植性、自動化程度以及準確率等指標形成統(tǒng)一的評價標準。同時,關(guān)于智能合約的測試沒有標準的測試集,因此造成各工具對比數(shù)據(jù)可信度大大降低。下一步研究應建立完善的存在漏洞的智能合約庫,為未來漏洞檢測的研究和攻擊行為的預防提供支持。

本節(jié)總結(jié)了不同智能合約檢測方法的問題并對部分問題給出了改進思路。未來,總結(jié)各種方法的利弊,綜合各種方法的長處,開發(fā)更加高效的漏洞檢測工具將是未來研究的重點,以此形成更加安全的、可靠的智能合約環(huán)境。由于傳統(tǒng)漏洞檢測方法存在以上描述的各種問題,倡導在未來的研究中加大機器學習的研究力度。與此同時,由于機器學習方法對數(shù)據(jù)高度依賴,在未來建立統(tǒng)一的檢測標準和相關(guān)數(shù)據(jù)集,有助于開發(fā)者更好地開發(fā)漏洞檢測工具。

4.2 總結(jié)

區(qū)塊鏈是計算機技術(shù)發(fā)展的重要產(chǎn)物。密碼學、智能合約、對等網(wǎng)絡等的綜合應用,使區(qū)塊鏈正在改變交通、醫(yī)療、金融等傳統(tǒng)行業(yè)。在快速的發(fā)展過程中,安全問題也大量涌現(xiàn)。TheDAO、Beauty Chain等事件的出現(xiàn)為安全人員敲響了警鐘,在利用區(qū)塊鏈去改變社會的同時,也應該對其安全性進行審視,解決安全漏洞問題。本文簡要介紹了重入漏洞、整數(shù)溢出漏洞、訪問控制漏洞等八種常見的漏洞類型,并對部分漏洞代碼進行了重現(xiàn),讓研究者更直觀地了解漏洞。通過對形式化驗證、符號執(zhí)行、機器學習等五類漏洞檢測方法的介紹,引入對應類型漏洞檢測方法的工具,對這些方法和工具進行了討論分析,并給出未來智能合約漏洞檢測研究的一些展望。

猜你喜歡
以太攻擊者漏洞
漏洞
基于貝葉斯博弈的防御資源調(diào)配模型研究
基于活躍節(jié)點庫的以太坊加密流量識別方法
以太萬物理論概述
基于selenium的SQL注入漏洞檢測方法
車易鏈:做汽車業(yè)的“以太坊”
正面迎接批判
正面迎接批判
偵探推理游戲(二)
漏洞在哪兒
囊谦县| 襄汾县| 长兴县| 怀化市| 孟连| 盐源县| 民权县| 磴口县| 华坪县| 渑池县| 惠来县| 临潭县| 宜宾市| 武强县| 额尔古纳市| 依安县| 北宁市| 南投县| 徐水县| 山阳县| 临夏市| 宾阳县| 沁源县| 江口县| 光山县| 同心县| 十堰市| 曲松县| 德安县| 高州市| 沙雅县| 二连浩特市| 孟连| 榆社县| 汽车| 松江区| 黔西| 涿鹿县| 呼伦贝尔市| 聂拉木县| 康马县|