李雷孝,鄭 岳,高昊昱,熊 嘯,牛鐵銘,杜金澤,高 靜
1.內(nèi)蒙古工業(yè)大學(xué) 數(shù)據(jù)科學(xué)與應(yīng)用學(xué)院,呼和浩特010080
2.內(nèi)蒙古自治區(qū)基于大數(shù)據(jù)的軟件服務(wù)工程技術(shù)研究中心,呼和浩特010080
3.內(nèi)蒙古工業(yè)大學(xué) 信息工程學(xué)院,呼和浩特010080
4.內(nèi)蒙古農(nóng)業(yè)大學(xué) 計(jì)算機(jī)與信息工程學(xué)院,呼和浩特010011
近幾年來(lái),新型數(shù)字貨幣發(fā)展迅速,其中以比特幣(bitcoin)為代表的數(shù)字貨幣的價(jià)值和社會(huì)影響力已經(jīng)不可估量[1]。2008 年Nakamoto[2]在比特幣白皮書中首次提出區(qū)塊鏈的概念,自此區(qū)塊鏈逐漸進(jìn)入人們的視野。2015 年區(qū)塊鏈的發(fā)展迎來(lái)了大爆發(fā),逐漸壯大起來(lái)。隨后區(qū)塊鏈被逐步應(yīng)用在金融[3]、交通[4-7]、醫(yī)療[8-10]以及物聯(lián)網(wǎng)[11-13]等諸多傳統(tǒng)領(lǐng)域當(dāng)中。隨著區(qū)塊鏈的發(fā)展壯大,智能合約越來(lái)越多地被人們關(guān)注和提及。智能合約的概念在1994年由Szabo[14]首次提出,但是由于時(shí)代發(fā)展的局限性,智能合約并沒有很好的應(yīng)用空間,直到區(qū)塊鏈的出現(xiàn),智能合約得到了發(fā)展和應(yīng)用契機(jī)。智能合約逐漸成為區(qū)塊鏈發(fā)展的關(guān)鍵環(huán)節(jié),被視為區(qū)塊鏈2.0的標(biāo)志之一。
區(qū)塊鏈作為一個(gè)讓多個(gè)相互不信任的各方使用加密貨幣進(jìn)行交易的平臺(tái),使用對(duì)等網(wǎng)絡(luò)解決交易過程中的信任問題,使得對(duì)等雙方能夠就交易達(dá)成一致。與區(qū)塊鏈的發(fā)展相結(jié)合,加密貨幣得到了快速的發(fā)展。加密貨幣通常采用嚴(yán)密邏輯設(shè)計(jì)的共識(shí)協(xié)議(如工作量證明(proof of work,POW[15])、權(quán)益證明(proof of stake,POS)等),由其底層網(wǎng)絡(luò)中所有參與的節(jié)點(diǎn)同意,網(wǎng)絡(luò)的計(jì)算節(jié)點(diǎn)負(fù)責(zé)在分布式賬本——區(qū)塊鏈中記錄交易后的狀態(tài)。在眾多區(qū)塊鏈網(wǎng)絡(luò)中,由于以太坊[16]的實(shí)現(xiàn)方式能夠使開發(fā)者使用區(qū)塊鏈編寫去中心化應(yīng)用程序(Dapp)[17-21]和智能合約,在區(qū)塊鏈社區(qū)中越來(lái)越受歡迎。以太坊區(qū)塊鏈平臺(tái)是一種基于共識(shí)機(jī)制的全球化執(zhí)行的虛擬機(jī),也稱為以太坊虛擬機(jī)(Ethereum virtual machine,EVM)。它通過實(shí)現(xiàn)微內(nèi)核來(lái)支持少量指令、堆棧、內(nèi)存和存儲(chǔ),這支撐了分布式應(yīng)用程序的全新概念。由于區(qū)塊鏈復(fù)雜的協(xié)議在設(shè)計(jì)和編碼的過程中難以避免出現(xiàn)人工的差錯(cuò),隨著區(qū)塊鏈技術(shù)的發(fā)展和應(yīng)用,其脆弱性和其他性能問題逐漸暴露在人們的視野中。許多重大安全事件的發(fā)生讓人們對(duì)區(qū)塊鏈的安全產(chǎn)生了越來(lái)越多的關(guān)注。尤其近年來(lái)發(fā)生的多起重大安全事件,例如2016 年TheDAO 事件[22],惡意攻擊者利用可重入漏洞竊取了價(jià)值6 000萬(wàn)美金的Ether(以太坊加密貨幣),并由此造成了以太坊硬分叉;此外,2018年美鏈(beauty chain,BEC)[23]合約自身存在整數(shù)溢出的漏洞被攻擊者利用,無(wú)限制地復(fù)制BEC 代幣,導(dǎo)致BEC代幣的價(jià)格跳水歸零;與此同時(shí)還有諸如Rubixi利用不可篡改性騙取代幣的龐氏騙局,King of the Ether Throne[24]采用拒絕服務(wù)攻擊來(lái)騙取代幣的攻擊方式等一系列針對(duì)區(qū)塊鏈平臺(tái)的攻擊。表1 給出了近年來(lái)區(qū)塊鏈遭受的部分標(biāo)志性的攻擊事件。導(dǎo)致表1 中一系列安全問題出現(xiàn)的原因主要有智能合約一旦部署不可修改、合約執(zhí)行后不可逆、編程語(yǔ)言自身問題或程序員的邏輯問題等。因此如何快速準(zhǔn)確地進(jìn)行漏洞檢測(cè)是當(dāng)前研究的重點(diǎn),智能合約的漏洞檢測(cè)已經(jīng)成為當(dāng)下的研究熱點(diǎn)。
表1 區(qū)塊鏈安全的重大事件表Table 1 List of major events in blockchain security
本文旨在介紹區(qū)塊鏈中一些常見的漏洞情況,同時(shí)介紹一些漏洞檢測(cè)的工具和方法,為之后的研究者提供一個(gè)綜合化的有關(guān)漏洞工具和方法的介紹。另外本文涉及到的區(qū)塊鏈相關(guān)代碼如無(wú)特殊介紹均為以太坊虛擬機(jī)的Solidity語(yǔ)言。
區(qū)塊鏈的誕生促進(jìn)了智能合約的發(fā)展,通過智能合約編寫去中心化應(yīng)用也為區(qū)塊鏈發(fā)展起到了促進(jìn)作用。相比傳統(tǒng)程序代碼,智能合約肩負(fù)了保證參與多方公平性的問題,同時(shí)通過合約管理大量具有經(jīng)濟(jì)價(jià)值的加密貨幣。本章將簡(jiǎn)要概述區(qū)塊鏈和智能合約所用到的技術(shù)和特性。
區(qū)塊鏈?zhǔn)且粋€(gè)分布式的賬本,其利用默克爾樹、簽名、對(duì)等網(wǎng)絡(luò)以及哈希函數(shù)等技術(shù),為區(qū)塊鏈提供了安全可靠的技術(shù)支持。維基百科中對(duì)區(qū)塊鏈的描述為:區(qū)塊鏈?zhǔn)且环N不斷增長(zhǎng)的紀(jì)錄列表,這種記錄稱為“區(qū)塊(Block)”,這些區(qū)塊鏈接到一起,并使用密碼加密以確保安全。區(qū)塊鏈結(jié)合密碼學(xué),可以保證交易的可追溯性、不可篡改性、不可否認(rèn)性和不可偽造性,支持?jǐn)?shù)據(jù)安全共享和大規(guī)模協(xié)同計(jì)算,實(shí)現(xiàn)對(duì)用戶身份和機(jī)密數(shù)據(jù)的隱私保護(hù)以及適用于需要高隱私性和安全性的分布式應(yīng)用場(chǎng)景中[25]。區(qū)塊鏈在金融、醫(yī)療和交通等社會(huì)領(lǐng)域當(dāng)中的應(yīng)用以及去中心化的特性等因素,使得區(qū)塊鏈被認(rèn)為是人類信用進(jìn)化史上的第四個(gè)里程碑。
區(qū)塊鏈系統(tǒng)是由多層架構(gòu)共同構(gòu)成的,區(qū)塊鏈的系統(tǒng)架構(gòu)可分為數(shù)據(jù)結(jié)構(gòu)層、網(wǎng)絡(luò)層、共識(shí)層、激勵(lì)層、合約層和應(yīng)用層六層,如圖1 所示。區(qū)塊鏈的底層是區(qū)塊,區(qū)塊間通過哈希指針鏈接形成區(qū)塊鏈網(wǎng)絡(luò)。區(qū)塊包含區(qū)塊頭和區(qū)塊體,由區(qū)塊頭中的哈希值來(lái)定位上一個(gè)區(qū)塊的地址,而區(qū)塊體包含實(shí)際的交易內(nèi)容,區(qū)塊體的內(nèi)容由該塊的所有者通過私鑰進(jìn)行簽名以保證其安全性。網(wǎng)絡(luò)層的結(jié)構(gòu)是對(duì)等網(wǎng)絡(luò),對(duì)等網(wǎng)絡(luò)是一種動(dòng)態(tài)的網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu),有很強(qiáng)的健壯性。共識(shí)層則是通過共識(shí)協(xié)議進(jìn)行挖礦操作。區(qū)塊鏈的參與者計(jì)算哈希值,首先計(jì)算出哈希值的塊獲得挖礦獎(jiǎng)勵(lì)。在此就延伸出了共識(shí)協(xié)議(工作量證明POW、權(quán)益證明POS 等)。合約層的主要內(nèi)容為人工編寫的智能合約。應(yīng)用層則用于部署一些去中心化的應(yīng)用、進(jìn)行支付等操作,供人們更好地使用區(qū)塊鏈為現(xiàn)實(shí)需求服務(wù)。
圖1 區(qū)塊鏈的系統(tǒng)架構(gòu)圖Fig.1 Blockchain system architecture diagram
尼克薩博在智能合約白皮書中提出智能合約的設(shè)計(jì)應(yīng)遵循可觀察性、客觀可核查性、相對(duì)性以及可執(zhí)行性同時(shí)減少執(zhí)行的需要的四點(diǎn)設(shè)計(jì)原則和目標(biāo)。同時(shí)其提出一個(gè)需要解決的問題,如何保證一個(gè)可信的第三方有足夠的判斷力來(lái)恰當(dāng)?shù)爻袚?dān)任務(wù),即如何保證第三方的公平性、非惡意性。隨著區(qū)塊鏈的出現(xiàn),研究者發(fā)現(xiàn)智能合約與區(qū)塊鏈可以完美地結(jié)合,用以實(shí)現(xiàn)去中心化。智能合約是運(yùn)行在區(qū)塊鏈系統(tǒng)上的一段代碼,代碼邏輯定義了合約內(nèi)容。智能合約應(yīng)用以太坊獨(dú)有的二進(jìn)制編碼格式——EVM 字節(jié)碼進(jìn)行編碼并存儲(chǔ)于區(qū)塊鏈中。然而,智能合約通常由高級(jí)語(yǔ)言編寫(例如Solidity)通過智能合約編寫去中心化應(yīng)用程序,然后編譯成字節(jié)碼上傳到區(qū)塊鏈上。
圖2 以HelloWorld 為例展示智能合約的部署流程。首先調(diào)用transaction 函數(shù)在礦工打包的時(shí)候會(huì)生成智能合約地址。智能合約地址的生成是由創(chuàng)建者的賬號(hào)和發(fā)送的交易數(shù)作為隨機(jī)數(shù)輸入,通過Kecca-256加密算法重新創(chuàng)建一個(gè)地址作為賬號(hào)。即最后合約地址對(duì)應(yīng)合約的代碼會(huì)保存在區(qū)塊鏈數(shù)據(jù)庫(kù)中,調(diào)用者只需要有合約地址和abi文件就可以調(diào)用合約的代碼。
圖2 智能合約的部署流程Fig.2 Deployment process of smart contract
雖然智能合約促進(jìn)了區(qū)塊鏈技術(shù)的發(fā)展,但是由于智能合約編寫語(yǔ)言自身缺陷或程序員編寫過程中出現(xiàn)的邏輯錯(cuò)誤等問題,使智能合約產(chǎn)生了一些漏洞,因此造成了智能合約成為攻擊者攻擊的目標(biāo)。一些統(tǒng)計(jì)顯示智能合約中的漏洞是普遍存在的,例如整數(shù)溢出漏洞、重入攻擊、拒絕服務(wù)攻擊等都是常見的智能合約漏洞類型。
智能合約作為區(qū)塊鏈技術(shù)的重要組成,通過編寫智能合約在區(qū)塊鏈上部署去中心化的應(yīng)用程序?yàn)閰^(qū)塊鏈快速發(fā)展提供了幫助。但同時(shí)大量針對(duì)智能合約的漏洞也暴露在漏洞檢測(cè)人員的視野中。在漏洞研究中,據(jù)統(tǒng)計(jì)存在25 種左右的常見漏洞。Atzei等人[26]對(duì)當(dāng)時(shí)存在的智能合約漏洞,根據(jù)Solidity、EVM 和Blockchain 三個(gè)層級(jí)進(jìn)行了分類。表2 展示了Nicola 對(duì)漏洞的分類。本章將列舉八種以太坊中常見的漏洞,并對(duì)部分漏洞代碼進(jìn)行重現(xiàn)。由于智能合約典型漏洞案例大多由以太坊智能合約引發(fā),并且研究者常以以太坊智能合約作為研究對(duì)象進(jìn)行研究。因此本文以以太坊智能合約作為研究對(duì)象,詳細(xì)描述了智能合約安全漏洞。
表2 以太坊漏洞分類Table 2 Ethereum vulnerabilities classification
重入攻擊漏洞是區(qū)塊鏈網(wǎng)絡(luò)中被頻繁利用的漏洞之一,TheDao 事件便是利用重入攻擊漏洞進(jìn)行的攻擊。重入攻擊漏洞常見于轉(zhuǎn)賬操作中,由于Solidity語(yǔ)言本身的原因,fallback[27]函數(shù)會(huì)在函數(shù)調(diào)用結(jié)束前讓攻擊者有機(jī)會(huì)再次執(zhí)行被調(diào)用的函數(shù)。攻擊者在執(zhí)行轉(zhuǎn)賬操作時(shí)對(duì)fallback函數(shù)進(jìn)行修改。在執(zhí)行轉(zhuǎn)賬操作的時(shí)候,會(huì)涉及到跨合約的調(diào)用,此時(shí)攻擊者會(huì)利用這些外部調(diào)用,設(shè)計(jì)惡意的代碼多次調(diào)用漏洞合約中的轉(zhuǎn)賬操作,將賬戶中的余額不斷消耗,直至gas耗盡。這里對(duì)重入攻擊漏洞進(jìn)行代碼重現(xiàn),具體代碼如下所示。
重入漏洞代碼示例:
在該合約中,withdraw()函數(shù)使用call.value()方法進(jìn)行轉(zhuǎn)賬時(shí),該方法會(huì)傳遞所有可用gas 進(jìn)行調(diào)用。當(dāng)該方法轉(zhuǎn)賬的地址為攻擊者的合約地址時(shí),就會(huì)調(diào)用攻擊者合約地址的fallback函數(shù)。如果攻擊者在自身合約的fallback 函數(shù)中寫入調(diào)用withdraw函數(shù)的代碼,就可不停地循環(huán)獲取代幣,不再執(zhí)行balance[msg.sender]-=amount的減幣操作,從而導(dǎo)致重入漏洞攻擊的發(fā)生。
整數(shù)溢出的類型包括乘法溢出、加法溢出和減法溢出三種。由于EVM為所有的整數(shù)指定了固定大小的數(shù)據(jù)類型,一個(gè)整型的變量只能由一定范圍的數(shù)字來(lái)進(jìn)行表示。以u(píng)int8 為例,uint8 的范圍為0 到255,因此如果存儲(chǔ)一個(gè)256位的數(shù)值,則存儲(chǔ)結(jié)果將會(huì)變?yōu)?。如圖3所示,8位無(wú)符整數(shù)255在內(nèi)存中占據(jù)8 bit位置,若再加1則整體會(huì)因?yàn)檫M(jìn)位而導(dǎo)致整體翻轉(zhuǎn)為0,進(jìn)而導(dǎo)致原有的8 bit整數(shù)表示為整數(shù)0。
圖3 整數(shù)溢出示例Fig.3 Integer overflow example
針對(duì)整數(shù)溢出漏洞,以太坊為開發(fā)者提供了SafeMath庫(kù)[28],庫(kù)中的數(shù)值計(jì)算操作會(huì)檢測(cè)整數(shù)溢出行為,并在溢出發(fā)生時(shí)拋出異常。
以太坊合約開發(fā)者(Owner)具有合約的超級(jí)權(quán)限,包括凍結(jié)代幣、增發(fā)代幣、銷毀代幣、鑄造新的代幣以及終止合約運(yùn)行等。若合約權(quán)限被攻擊者竊取將造成嚴(yán)重影響[29]。訪問控制漏洞的產(chǎn)生是由于智能合約的編寫者沒能準(zhǔn)確檢查合約中函數(shù)的訪問權(quán)限,例如將一些應(yīng)該設(shè)置為private 的函數(shù)不加區(qū)別或未定義權(quán)限,默認(rèn)為了public類型。這些函數(shù)本應(yīng)該是普通用戶無(wú)法訪問的,因此就導(dǎo)致攻擊者有足夠的權(quán)限去訪問本不該被其訪問的函數(shù)或者變量。
訪問控制漏洞示例:
如上所示,setOwner 函數(shù)未定義函數(shù)類型,因此其類型為public,此函數(shù)可以用于設(shè)置合約的擁有者。但其標(biāo)注為public 類型就使得所有人都擁有了訪問的權(quán)限,因此攻擊者可以輕松地設(shè)置其他用戶為owner并竊取其中的加密貨幣。
與大多數(shù)區(qū)塊鏈一樣,以太坊節(jié)點(diǎn)通過匯總交易并將其形成塊。一旦礦工解決了共識(shí)機(jī)制(例如以太坊的POW),那么該交易就被認(rèn)為是有效的。解決該區(qū)塊的礦工能夠選擇來(lái)自該礦池的哪些交易將包含在該區(qū)塊中,這通常是由gas交易決定的。在這里有一個(gè)潛在的攻擊媒介,攻擊者可以觀察事務(wù)池中是否存在可能包含問題解決方案的交易,修改或撤銷攻擊者的權(quán)限或更改合約中對(duì)攻擊者不利的狀態(tài)。然后,攻擊者可以從這個(gè)事務(wù)中獲取數(shù)據(jù),并創(chuàng)建一個(gè)更高級(jí)別的事務(wù)gas,在交易公布之前將其交易打包存放在一個(gè)區(qū)塊中。
如下代碼示例所示,此合約包含10個(gè)以太幣,如果礦工能成功查找到hash,則發(fā)放10 個(gè)以太幣給第一個(gè)查找到此hash 的礦工。但是在這個(gè)過程中,攻擊者可以時(shí)刻關(guān)注到交易池中所有人提交的答案,攻擊者也可以隨時(shí)檢查答案的有效性,然后發(fā)起更高gas 的交易,從而獲得這筆交易的10 以太幣獎(jiǎng)勵(lì)。而第一個(gè)查找到此hash的礦工將一無(wú)所獲。因此錯(cuò)誤的交易順序可能會(huì)對(duì)合約造成負(fù)面的影響[30]。
交易順序依賴攻擊代碼示例:
對(duì)可預(yù)測(cè)變量的依賴[31]是由于在區(qū)塊鏈中取隨機(jī)操作存在偽隨機(jī)行為,即攻擊者可以通過某些手段去預(yù)測(cè)下一步的變量值,達(dá)到控制合約并造成不可預(yù)料的結(jié)果從而取得加密貨幣的目的。
在以太坊中,區(qū)塊頭包含一些以太坊自身特殊的字段來(lái)表示區(qū)塊的屬性值,智能合約可以通過以太坊提供的這些接口來(lái)讀取相應(yīng)的屬性值,如block.coinbase(address)、block.gaslimit(uint)等。在以太坊中存在熵的概念[32],即隨機(jī)性。由于以太坊不存在傳統(tǒng)編程語(yǔ)言中的Random()函數(shù),而是利用這些屬性值產(chǎn)生隨機(jī)數(shù)。聰明的攻擊者會(huì)利用這些屬性值去尋找隨機(jī)數(shù)的生成方法,并竊取加密貨幣。同時(shí)由于一個(gè)區(qū)塊的時(shí)間戳是由礦工決定的,并且允許有900 s 的偏移,這就給一些投機(jī)的礦工利用這個(gè)時(shí)間節(jié)點(diǎn)去搶先獲取出塊獎(jiǎng)勵(lì)的機(jī)會(huì)。
對(duì)可預(yù)測(cè)變量的依賴代碼漏洞示例:
如上面展示了一個(gè)時(shí)間戳依賴的例子,礦工可以根據(jù)需要調(diào)整時(shí)間戳,因此如果合約中有足夠的以太幣,計(jì)算出某個(gè)區(qū)塊的礦工將被激勵(lì)選擇一個(gè)now%15==0 的時(shí)間戳,這樣便可有機(jī)會(huì)贏得這個(gè)合約。由于每個(gè)區(qū)塊只允許一個(gè)人下注,也易受前置交易的攻擊。由于塊時(shí)間戳是單調(diào)遞增的,礦工不能自主選擇任意的塊時(shí)間戳,這些塊可能會(huì)被網(wǎng)絡(luò)拒絕。
以太坊智能合約有一個(gè)全局變量tx.origin[33],它能夠回溯整個(gè)調(diào)用棧并返回最初發(fā)起調(diào)用的合約地址。若合約使用這個(gè)變量做用戶驗(yàn)證或授權(quán)操作,攻擊者便可以利用tx.origin 的特性創(chuàng)建相應(yīng)的攻擊合約盜取以太幣。例如,攻擊者在自己的Fallback 函數(shù)中調(diào)用受害者合約的取錢函數(shù),通過誘導(dǎo)受害者合約轉(zhuǎn)賬以太幣給攻擊者合約,而由于“tx.origin==owner”的緣故,會(huì)導(dǎo)致無(wú)法檢測(cè)出異常,從而使受害者合約中的以太幣全部轉(zhuǎn)到攻擊者合約賬戶中。
tx-origin漏洞代碼示例:
如上所示,合同擁有者成功發(fā)送了一個(gè)交易給攻擊者合約,這將觸發(fā)Fallback函數(shù)執(zhí)行。在Fallback函數(shù)中調(diào)用被攻擊合約里的withdrawAll()函數(shù)。這將導(dǎo)致被攻擊合約里的所有代幣被提取到攻擊者的地址。這是因?yàn)樽畛鹾霞s的調(diào)用者是受害者合約地址(這里是受攻擊的合約地址)。因而,tx.origin等于所有者,在被釣魚合約的第11 行上的require 語(yǔ)句就會(huì)不起作用,因此withdrawAll()函數(shù)得以繼續(xù)執(zhí)行。
拒絕服務(wù)攻擊(denial of service,DOS)[34]就是用戶想要進(jìn)行的操作或服務(wù)請(qǐng)求無(wú)法被系統(tǒng)處理。DOS 的攻擊方式有多種,其中針對(duì)智能合約的DOS攻擊屬于利用協(xié)議漏洞進(jìn)行攻擊的手段,攻擊將導(dǎo)致合約在短時(shí)間內(nèi)無(wú)法運(yùn)行,或者某些情況下永久無(wú)法運(yùn)行。因此在區(qū)塊鏈網(wǎng)絡(luò)上造成永久的“凍土”,即合約被鎖定,用戶的加密貨幣也隨合約一同“冰封”。拒絕服務(wù)攻擊的典型案例為Throne of King of Ether,在此游戲合約中,攻擊造成了沒有成功拿到王位的人不能取回作為保證金的加密貨幣,以下面的游戲合約為例展示拒絕服務(wù)攻擊。在此游戲中,只有支付大于emperor的金額才能成為新的emperor,但要先退回之前的emperor 的加密貨幣才能更改新的emperor。如果前一個(gè)emperor 一直不接受退回的加密貨幣,則前一個(gè)emperor 就能一直保持emperor的身份,以此造成拒絕服務(wù)攻擊。
拒絕服務(wù)攻擊代碼示例:
動(dòng)態(tài)數(shù)組雙重訪問攻擊(dynamic array doubleaccess attack)區(qū)別于雙花攻擊,由Chang 等人[35]于2020 年提出。如圖4 所示,由于智能合約或者EVM底層的機(jī)制,不同的變量可能存儲(chǔ)在同一位置。但是某些情況下會(huì)導(dǎo)致存儲(chǔ)的變量被覆蓋,進(jìn)而導(dǎo)致合約的執(zhí)行不正確。動(dòng)態(tài)數(shù)組雙重訪問攻擊會(huì)導(dǎo)致兩種主要的危害。
圖4 動(dòng)態(tài)數(shù)組和映射變量雙重訪問攻擊示意圖Fig.4 Schematic diagram of double access attacks on dynamic arrays and mapping variables
(1)繞過限制條件。即可以修改if或require的條件分支語(yǔ)句修改狀態(tài)變量的值。
(2)特權(quán)升級(jí)。攻擊者利用此漏洞破壞合約的存儲(chǔ)結(jié)構(gòu),可以任意執(zhí)行變量覆蓋的操作,從而執(zhí)行一些普通用戶無(wú)法執(zhí)行的操作。
因此可以設(shè)計(jì)在同一存儲(chǔ)位置中訪問不同類型的變量,進(jìn)行雙重訪問攻擊,通過控制合約執(zhí)行過程,竊取以太幣。
目前在以太坊環(huán)境中缺少有效的工具能夠?qū)?dòng)態(tài)數(shù)組雙重訪問攻擊進(jìn)行有效的檢測(cè),依賴人工方法進(jìn)行檢測(cè)效率低,因此設(shè)計(jì)有效的動(dòng)態(tài)數(shù)組雙重訪問攻擊漏洞檢測(cè)工具是當(dāng)前的重要研究方向。
第2章介紹了八種常見的漏洞類型,由于區(qū)塊鏈不可篡改性,需要在上鏈前把智能合約中存在的漏洞進(jìn)行檢查,避免存在漏洞的智能合約被部署上鏈。本章介紹了形式化驗(yàn)證、符號(hào)執(zhí)行、模糊測(cè)試以及機(jī)器學(xué)習(xí)等幾類智能合約漏洞檢測(cè)的方法,并分別介紹了對(duì)應(yīng)方法所使用的一些工具。
目前,形式化驗(yàn)證技術(shù)已經(jīng)在核電、航天等高安全要求的領(lǐng)域取得了成功應(yīng)用,通過將形式化方法應(yīng)用于智能合約漏洞檢測(cè),可以使得智能合約的生成和執(zhí)行有規(guī)范性約束,從而保證合約的可信性和可靠性。形式化驗(yàn)證是智能合約安全分析的重要技術(shù)之一。通過形式化語(yǔ)言把合約中的概念、判斷、推理轉(zhuǎn)化成形式化模型,從而消除合約中的歧義性和不通用性,然后配合嚴(yán)謹(jǐn)?shù)倪壿嫼妥C明,驗(yàn)證智能合約中函數(shù)功能的正確性和安全性[36]。這些形式化驗(yàn)證方法主要包括以下四類方法:基于類BAN 邏輯的形式化方法[37],基于模型檢驗(yàn)的形式化方法[38],基于密碼學(xué)原語(yǔ)代數(shù)屬性的形式化方法和基于定理證明的形式化方法。
常見的形式化驗(yàn)證方法包括模型檢測(cè)和演繹驗(yàn)證。模型檢測(cè)列舉出所有可能的狀態(tài)并逐一檢驗(yàn),這種方法的基本思想通過數(shù)理邏輯證明的方式,驗(yàn)證代碼在規(guī)范描述的前提下滿足某些特性。
ZEUS[39]是一款利用形式化驗(yàn)證方法進(jìn)行漏洞檢測(cè)的工具,該工具支持將Solidity 語(yǔ)言編寫的智能合約轉(zhuǎn)換為L(zhǎng)LVM(low level virtual machine)的中間語(yǔ)言表示,再利用形式化驗(yàn)證方法驗(yàn)證安全性。但其無(wú)法檢測(cè)跨函數(shù)的重入攻擊和一些跨功能的分析策略[40]。
Isabelle/HOL 是Hirai[41-42]提出的針對(duì)EVM 字節(jié)碼進(jìn)行檢測(cè)的形式化驗(yàn)證工具,將EVM 字節(jié)碼通過lem language 轉(zhuǎn)換成一個(gè)形式化的模型,然后通過形式化的模型去驗(yàn)證代碼邏輯中是否存在問題?;贗sabelle 方法,研究人員將其進(jìn)行了改進(jìn),放棄了lem language 這種相對(duì)來(lái)說低效率的方式,而是采用Fframework(一種航天領(lǐng)域使用的形式化漏洞驗(yàn)證框架)[43]和K-framework(一種語(yǔ)義的整合框架)[44]來(lái)進(jìn)行驗(yàn)證。
此外國(guó)內(nèi)的一些學(xué)者也提出了自己的形式化驗(yàn)證模型,董春燕等人[45]提出了一種基于CPN(colored Petri net)模型的形式化驗(yàn)證方法,用于Auction 合約的驗(yàn)證。該模型能成功檢測(cè)出潛在可能發(fā)生不回退加密貨幣的漏洞出現(xiàn)的位置。歐陽(yáng)恒一等人[36]借鑒數(shù)學(xué)歸納法的思想,優(yōu)化SmartVerif(一種基于定理證明的形式化驗(yàn)證結(jié)合機(jī)器學(xué)習(xí)的形式化方法)模型驗(yàn)證過程,避免狀態(tài)空間的無(wú)限遍歷并能成功找出目標(biāo)漏洞。
符號(hào)執(zhí)行審計(jì)方法的主要思想是將代碼中的變量符號(hào)化。通過符號(hào)化程序輸入,符號(hào)執(zhí)行能夠?yàn)樗械膱?zhí)行路徑維護(hù)一組約束,執(zhí)行之后,約束求解器將用于求解約束并確定該執(zhí)行的輸入,最后利用約束求解器得到新的測(cè)試輸入,檢測(cè)符號(hào)值是否可以產(chǎn)生漏洞。符號(hào)執(zhí)行法應(yīng)用于智能合約漏洞檢測(cè)的執(zhí)行過程為:首先,將合約中的變量值符號(hào)化;然后逐條解釋執(zhí)行程序中的指令,在解釋執(zhí)行過程中更新執(zhí)行狀態(tài)、搜集路徑約束,以完成程序中所有可執(zhí)行路徑的探索并發(fā)現(xiàn)相應(yīng)的安全問題。
趙偉等人[29]對(duì)智能合約反編譯生成的字節(jié)碼構(gòu)建智能合約執(zhí)行的控制流圖,隨后利用約束求解生成軟件測(cè)試用例,對(duì)已知的五種類型漏洞達(dá)到了85%的檢測(cè)成功率。圖5為其符號(hào)執(zhí)行過程流程圖。
圖5 符號(hào)執(zhí)行流圖Fig.5 Symbolic execution flow graph
Oyente[46]是第一個(gè)用于以太坊上的漏洞檢測(cè)工具,該工具采用符號(hào)執(zhí)行方法,直接檢測(cè)EVM 字節(jié)碼,支持重入漏洞、交易順序依賴以及偽隨機(jī)等安全漏洞的檢測(cè),但是該工具對(duì)于自殺合約和tx-origin的濫用問題并不能做到有效的檢測(cè)。Mythril[47]作為一個(gè)符號(hào)執(zhí)行的漏洞檢測(cè)工具,通過對(duì)EVM 字節(jié)碼進(jìn)行分析,能夠支持多達(dá)14種漏洞的檢測(cè)。MythX[48]整合了Truffle和Remix等工具,能夠支持多平臺(tái)的漏洞檢測(cè)。
面對(duì)現(xiàn)有符號(hào)執(zhí)行方法檢測(cè)速度較慢的問題,李宗鴻等人提出一種自底向上求解約束的改進(jìn)符號(hào)執(zhí)行方法[49]。結(jié)合深度優(yōu)先遍歷和廣度優(yōu)先遍歷進(jìn)行路徑的選擇,以此提高符號(hào)執(zhí)行的代碼覆蓋率。該方法顯著地提高了中等規(guī)模智能合約中的檢測(cè)效率,并在正確率方面取得了不錯(cuò)的效果。
模糊測(cè)試是一種通過向目標(biāo)系統(tǒng)提供非預(yù)期的輸入并監(jiān)視異常結(jié)果來(lái)發(fā)現(xiàn)軟件漏洞的方法。模糊測(cè)試方法的核心思想是將自動(dòng)或半自動(dòng)化生成的隨機(jī)數(shù)據(jù)輸入到一個(gè)程序中,并檢測(cè)程序的異常,以發(fā)現(xiàn)可能的程序錯(cuò)誤。在模糊測(cè)試中用隨機(jī)的壞的數(shù)據(jù),即fuzz去攻擊程序并觀察出現(xiàn)問題的點(diǎn)。其好處在于這個(gè)數(shù)據(jù)是不符合邏輯的,因?yàn)槌绦虼嬖诘穆┒创蟛糠秩舭凑杖说恼_壿嬍菬o(wú)法觀察到的,因此模糊測(cè)試是一項(xiàng)十分有效的漏洞檢測(cè)技術(shù)。
ContractFuzzer[50]是一個(gè)利用模糊測(cè)試進(jìn)行智能合約漏洞檢測(cè)的黑盒測(cè)試工具。它使用智能合約的二進(jìn)制接口生成交易,通過EVM執(zhí)行這些交易,通過分析執(zhí)行日志來(lái)檢測(cè)安全漏洞。圖6 展示的是ContractFuzzer 的檢測(cè)流程。其通過第0 和1 步在以太坊官網(wǎng)獲取開源的智能合約并通過對(duì)ABI 簽名分析生成一個(gè)ABI規(guī)范的模糊測(cè)試輸入,并在3、4、5步執(zhí)行模糊測(cè)試過程。
圖6 ContractFuzzer架構(gòu)圖Fig.6 Overview of ContractFuzzer
SoliAudit 是一款Liao 等人[51]提出的機(jī)器學(xué)習(xí)和模糊測(cè)試相結(jié)合的漏洞檢測(cè)工具,SoliAudit 動(dòng)態(tài)模糊器不僅能夠模糊函數(shù)參數(shù),還可以模糊區(qū)塊鏈環(huán)境的一些參數(shù),如gas和ether。同時(shí)利用操作碼特征進(jìn)行機(jī)器學(xué)習(xí)分類,漏洞識(shí)別達(dá)到90%,還可以自動(dòng)生成模糊測(cè)試合同以及適應(yīng)新的漏洞。
GasFuzzer[52]是一個(gè)利用模糊測(cè)試方法,用于檢測(cè)交易中有較高gas消耗異常的工具。通過提出gasgreedy 和gas-leveling 兩種策略有效提高了漏洞檢測(cè)的效率。相比ContractFuzzer 漏洞檢測(cè)工具,效率提升了約28%。
機(jī)器學(xué)習(xí)作為當(dāng)前計(jì)算機(jī)研究方向的熱點(diǎn),由于在漏洞檢測(cè)中可以提供較高的自動(dòng)化程度和漏洞檢測(cè)效率,與漏洞檢測(cè)結(jié)合也成為了大量學(xué)者的研究熱點(diǎn)。
傳統(tǒng)的智能合約代碼審計(jì)工具高度依賴專家定義的固定規(guī)則或模式來(lái)檢測(cè)智能合約的漏洞,但專家規(guī)則容易出錯(cuò),一些復(fù)雜的模式也不容易被覆蓋。同時(shí)基于規(guī)則開發(fā)的檢測(cè)工具可伸縮性有限[30],隨著智能合約數(shù)量的爆炸式增長(zhǎng),這種模式的適用性越來(lái)越低。機(jī)器學(xué)習(xí)在漏洞檢測(cè)中可以提供較高的自動(dòng)化程度和漏洞檢測(cè)效率。因此利用機(jī)器學(xué)習(xí)的方法逐漸進(jìn)入人們的視野。本節(jié)會(huì)介紹幾種利用機(jī)器學(xué)習(xí)進(jìn)行智能合約漏洞檢測(cè)的工具和方法。
Xiong等人[53]提出了一種利用強(qiáng)化學(xué)習(xí)的智能合約漏洞檢測(cè)方法SmartVerif,該方法增強(qiáng)了漏洞檢測(cè)的自動(dòng)化程度,提高了檢測(cè)的準(zhǔn)確率。但是由于該方法需要為每一種協(xié)議訓(xùn)練一個(gè)獨(dú)立的模型,或是利用預(yù)訓(xùn)練和優(yōu)化的網(wǎng)絡(luò)來(lái)驗(yàn)證協(xié)議,存在驗(yàn)證時(shí)間增加以及精度降低的問題。因此如何訓(xùn)練通用的模型,增加檢測(cè)效率將是以后的研究重點(diǎn)。通過實(shí)驗(yàn)與傳統(tǒng)的漏洞檢測(cè)方法對(duì)比,證明該方法比傳統(tǒng)的漏洞檢測(cè)方法在效率和準(zhǔn)確率方面均有大幅度的提高,同時(shí)其自動(dòng)化程度也比傳統(tǒng)方法更加強(qiáng)大。
Xing 等人[54]提出用Tensorflow 構(gòu)造卷積神經(jīng)網(wǎng)絡(luò)模型以漏洞合約的切片矩陣做輸入,用卷積神經(jīng)網(wǎng)絡(luò)算法分別對(duì)has_short_address、has_flows和is_greedy三個(gè)漏洞合約代碼片段訓(xùn)練,得到三個(gè)檢測(cè)合約漏洞的分類模型。利用Tensorflow 構(gòu)造卷積神經(jīng)網(wǎng)絡(luò)模型,只使用卷積層,然后導(dǎo)出的矩陣被提供給神經(jīng)網(wǎng)絡(luò),最后得到基于卷積神經(jīng)網(wǎng)絡(luò)的分類模型。利用卷積神經(jīng)網(wǎng)絡(luò)和隨機(jī)森林做對(duì)比實(shí)驗(yàn),但對(duì)比實(shí)驗(yàn)結(jié)果顯示隨機(jī)森林方法的效果更好。
Momeni 等人[55]引入機(jī)器學(xué)習(xí)預(yù)測(cè)模型,采用兩個(gè)靜態(tài)代碼分析器標(biāo)記了1 000 個(gè)以太坊平臺(tái)使用的智能合約。其對(duì)漏洞的檢測(cè)平均準(zhǔn)確率達(dá)到95%。
在使用機(jī)器學(xué)習(xí)的方法中,多將代碼轉(zhuǎn)換為控制流圖(control flow graph,CFG),利用CFG 進(jìn)行切片,對(duì)切片矩陣建立機(jī)器學(xué)習(xí)的預(yù)測(cè)模型,利用CFG建模的同時(shí)配合字符串匹配和模糊測(cè)試等代碼審計(jì)技術(shù)對(duì)漏洞進(jìn)行檢測(cè),以獲得較高的準(zhǔn)確率和效率。
Qian[56-57]團(tuán)隊(duì)致力于將專家定義的安全模式與機(jī)器學(xué)習(xí)相結(jié)合。將源代碼的控制和數(shù)據(jù)流語(yǔ)義轉(zhuǎn)換為合約圖,同時(shí)設(shè)計(jì)一個(gè)消除階段來(lái)進(jìn)行圖的歸一化。提出了一種新的消息傳播網(wǎng)絡(luò)(temporal message propagation network,TMP)用于從規(guī)范化圖中提取圖特征,并將圖特征與設(shè)計(jì)的專家模式相結(jié)合,產(chǎn)生最終的檢測(cè)系統(tǒng)。利用深度學(xué)習(xí)網(wǎng)絡(luò)(deep neural networks,DNN)、無(wú)度圖卷積神經(jīng)網(wǎng)絡(luò)(degree-free graph convolutional neural network,DR-GCN)、雙向長(zhǎng)短期記憶(bi-directional long short-term memory,Bi-LSTM)以及長(zhǎng)短期記憶(long short-term memory,LSTM)進(jìn)行針對(duì)某一類型漏洞的精確檢測(cè)。此外還提出了智能合約的合約片段表示,用于捕捉基本的語(yǔ)義信息和控制流依賴。在檢測(cè)性能的表現(xiàn)方面,利用深度學(xué)習(xí)網(wǎng)絡(luò)的方法在針對(duì)重入攻擊、時(shí)間戳依賴以及無(wú)限循環(huán)的檢測(cè)準(zhǔn)確率分別達(dá)到了89.15%、89.02%和83.21%。其他學(xué)習(xí)模型也對(duì)重入攻擊有較好的檢測(cè)準(zhǔn)確性。
Tann等人[58]也使用機(jī)器學(xué)習(xí)長(zhǎng)短期記憶(LSTM)對(duì)智能合約的漏洞進(jìn)行順序?qū)W習(xí)。該方法能夠快速檢測(cè)到智能合約的漏洞,并實(shí)現(xiàn)了99%的準(zhǔn)確率,保證了智能合約上鏈之前的安全性。
除了現(xiàn)有的符號(hào)執(zhí)行和形式化驗(yàn)證等主流檢測(cè)方法外,還有許多利用其他方法和思想的漏洞檢測(cè)方式。
在以太坊中,透明公開的智能合約占了總交易量和總交易金額的2/3 左右,但是有大約77.3%的智能合約是不透明非開源的。針對(duì)這種因非開源導(dǎo)致無(wú)法利用正面解析智能合約源代碼的問題,Zhou 等人[59]提出了Erays 方法,一種利用逆向工程的思想來(lái)進(jìn)行漏洞檢測(cè)的方法。Erays方法用于研究以太坊系統(tǒng)中不透明的智能合約,從十六進(jìn)制編碼的智能合約作為輸入,將十六進(jìn)制的字符串分解為EVM指令,從十六進(jìn)制字符串的第一個(gè)字節(jié)開始,每個(gè)字節(jié)被順序解碼成相應(yīng)的指令,而后從基本塊中恢復(fù)控制流圖,以此來(lái)進(jìn)行漏洞檢測(cè)工作。但是該方法也存在巨大的弊端,由于沒有源代碼,該項(xiàng)工作的代價(jià)昂貴,因此該工具也難以實(shí)現(xiàn)高自動(dòng)化,更適合于手動(dòng)分析并且高度依賴專家經(jīng)驗(yàn)。
除逆向工程外也有在傳統(tǒng)漏洞檢測(cè)方法的思想上做出改進(jìn)的技術(shù)方法,韓松明等人[60]提出了Dc-Hunter。Dc-Hunter 檢測(cè)方案,通過計(jì)算待檢測(cè)合約與已知漏洞合約之間的相似性檢測(cè)智能合約,同時(shí)此方法還可以用于發(fā)現(xiàn)潛在的蜜罐合約。該方法無(wú)需源碼和預(yù)先定義的漏洞特征,通過應(yīng)用切片降低無(wú)關(guān)代碼影響,并使用圖嵌入算法來(lái)捕捉函數(shù)的結(jié)構(gòu)信息。
在利用傳統(tǒng)特征代碼匹配的方法中,Slither[61]應(yīng)用廣泛使用的污點(diǎn)跟蹤技術(shù)和數(shù)據(jù)流來(lái)提取細(xì)化信息。它將智能合約轉(zhuǎn)化為中間表示SlithIR,利用這種中間表示與問題代碼做匹配進(jìn)行檢測(cè)。其性能在準(zhǔn)確率和時(shí)間效率方面取得了不錯(cuò)的表現(xiàn)。同時(shí)EASYFLOW[62]也是利用污點(diǎn)跟蹤來(lái)進(jìn)行漏洞檢測(cè)的工具,在對(duì)具體的漏洞合約檢測(cè)時(shí)同樣取得了不錯(cuò)的效果。同樣的,SmartCheck[63]也是一種利用中間表示來(lái)進(jìn)行漏洞檢測(cè)的方法,通過將智能合約源代碼轉(zhuǎn)換為一種基于XML 的中間表示,從而形成對(duì)漏洞的有效檢測(cè),但與ZEUS一樣,若語(yǔ)義定義不準(zhǔn)確,會(huì)大大降低其準(zhǔn)確率。傳統(tǒng)的靜態(tài)分析方法很容易應(yīng)用到其他區(qū)塊鏈平臺(tái)和不同語(yǔ)言編寫的智能合約中,但是其執(zhí)行效率和準(zhǔn)確率問題有待提高。
本節(jié)通過使用檢測(cè)速度、適用范圍、自動(dòng)化程度以及準(zhǔn)確率四項(xiàng)評(píng)價(jià)指標(biāo)來(lái)說明上述各類檢測(cè)方法存在的問題及其局限性。
形式化驗(yàn)證方法審計(jì)智能合約安全的工作,從應(yīng)用之初就存在大量的問題。形式化驗(yàn)證方法的局限性在于其應(yīng)用了大量的數(shù)學(xué)推導(dǎo)和證明過程,因此使得一些非專業(yè)人員很難參與此類方法的研究,導(dǎo)致基于該種方法的檢測(cè)工具發(fā)展緩慢。同時(shí)由于復(fù)雜的推理和驗(yàn)證過程,造成其適用范圍降低且自動(dòng)化程度較低。
符號(hào)執(zhí)行方法需要對(duì)源碼轉(zhuǎn)換成操作碼(OPCODE)之后生成控制流圖,而后需要轉(zhuǎn)換為一種自定義的語(yǔ)義再進(jìn)行驗(yàn)證。這一個(gè)復(fù)雜的過程中涉及到大量的路徑遍歷和遍歷路徑的約束問題,路徑問題就很難避免出現(xiàn)路徑爆炸,因此是十分耗時(shí)的。若通過限制條件減少遍歷路徑,則會(huì)使得檢測(cè)準(zhǔn)確率降低。
模糊測(cè)試方法與其他方法相比,可用工具最少,各類評(píng)價(jià)指標(biāo)上的表現(xiàn)都不盡人意。主要原因在于模糊測(cè)試需要精巧的設(shè)計(jì)測(cè)試過程,前文提到的模糊測(cè)試方法需要隨機(jī)種子進(jìn)行檢測(cè),但隨機(jī)種子很難覆蓋全部路徑,因此導(dǎo)致其檢測(cè)的準(zhǔn)確率不能達(dá)到理想的狀態(tài)。
機(jī)器學(xué)習(xí)方法在檢測(cè)結(jié)果方面的效果表現(xiàn)最為出色,但是取得出色的結(jié)果依賴于大量開源智能合約的支持。但開源智能合約在整個(gè)已部署的智能合約中占比較低,會(huì)影響這類方法的性能。隨著開源智能合約的數(shù)量提升,機(jī)器學(xué)習(xí)方法的效率也會(huì)提升。同時(shí)可以注意到,機(jī)器學(xué)習(xí)方法在適用范圍方面表現(xiàn)較差。由于機(jī)器學(xué)習(xí)方法的學(xué)習(xí)過程要具體到某一個(gè)具體的函數(shù)或某一類漏洞的代碼段,需要對(duì)每種漏洞進(jìn)行建模,這就降低了其通用性。
特征匹配方法作為一種靜態(tài)分析方法,其檢測(cè)速度快并能夠迅速響應(yīng)新漏洞的優(yōu)勢(shì)明顯。不同于傳統(tǒng)的漏洞檢測(cè),區(qū)塊鏈的漏洞檢測(cè)受限于開源智能合約的數(shù)量。但是以太坊中有超過一半的非開源智能合約,在無(wú)法獲得開源代碼的情況下,漏洞檢測(cè)人員可以獲得其操作碼但是對(duì)操作碼的分析代價(jià)十分巨大。因此該方法的適用范圍有限,同時(shí)由于智能合約函數(shù)和一些特征自身限制,導(dǎo)致特征匹配方法的漏報(bào)率較高。
本文通過實(shí)驗(yàn)分析對(duì)比了各種漏洞檢測(cè)方法,通過實(shí)驗(yàn)數(shù)據(jù)更直觀地體現(xiàn)各種方法的優(yōu)缺點(diǎn)。從以太坊官網(wǎng)中選取450個(gè)智能合約樣本,通過實(shí)驗(yàn)對(duì)VaaS、Oyente、ContractFuzzer、DR-GCN、Slither 五種具有代表性的工具進(jìn)行測(cè)試,并針對(duì)可重入和可預(yù)測(cè)變量的依賴兩種類型漏洞進(jìn)行檢測(cè)。從準(zhǔn)確率、支持漏洞數(shù)量和平均檢測(cè)速度三方面對(duì)漏洞檢測(cè)工具的性能進(jìn)行評(píng)估。本文實(shí)驗(yàn)具體實(shí)驗(yàn)環(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。實(shí)驗(yàn)結(jié)果如表3所示。
表3 各類漏洞檢測(cè)方法的評(píng)價(jià)表Table 3 Evaluation of various vulnerabilities detection methods
從表3中的實(shí)驗(yàn)結(jié)果可以看出,在準(zhǔn)確率方面機(jī)器學(xué)習(xí)方法DR-GCN 表現(xiàn)出較高的精度,同時(shí)在檢測(cè)速度上具有絕對(duì)的優(yōu)勢(shì)。VaaS作為一個(gè)成熟的商業(yè)工具在支持的漏洞數(shù)量上表現(xiàn)出較強(qiáng)優(yōu)勢(shì)。但同時(shí)也可以看出形式化驗(yàn)證方法和模糊測(cè)試方法在檢測(cè)速度上的劣勢(shì)相當(dāng)明顯。機(jī)器學(xué)習(xí)方法雖然在準(zhǔn)確率和檢測(cè)速度方面擁有較強(qiáng)的優(yōu)勢(shì),但其難以建立起通用的模型,因此支持的漏洞數(shù)量較少。
需要說明的是,由于形式化驗(yàn)證方法的復(fù)雜性以及缺少足夠的開源工具,因此選擇VaaS作為本次實(shí)驗(yàn)對(duì)象。VaaS是一款成熟的商用漏洞檢測(cè)工具,因此其支持檢測(cè)的漏洞數(shù)量和準(zhǔn)確率都有不俗的表現(xiàn)。
(1)符號(hào)執(zhí)行的路徑優(yōu)化
符號(hào)執(zhí)行方法由于路徑選擇的需要將面臨路徑爆炸問題,如何縮短符號(hào)匹配的路徑、優(yōu)化最優(yōu)路徑、避免路徑爆炸問題是以后提高符號(hào)執(zhí)行工具效率的重點(diǎn)方向。
在優(yōu)化符號(hào)執(zhí)行中,通過廣度優(yōu)先遍歷和深度優(yōu)先遍歷結(jié)合,提高符號(hào)執(zhí)行代碼覆蓋率。在對(duì)路徑進(jìn)行遍歷的同時(shí),對(duì)路徑的選擇進(jìn)行優(yōu)化,精簡(jiǎn)對(duì)程序無(wú)影響的路徑,以此縮短漏洞檢測(cè)的時(shí)間,提高執(zhí)行效率。
(2)自動(dòng)化程度較低
當(dāng)前多數(shù)工具的自動(dòng)化程度較低且高度依賴人工檢測(cè)和專家方法,部分檢測(cè)工具的自動(dòng)化程度不高,隨著智能合約數(shù)量的增長(zhǎng),自動(dòng)化程度低的弊端逐漸顯現(xiàn),在工作量提高時(shí)檢測(cè)效率低的問題亟需解決。因此如何提高自動(dòng)化程度將是未來(lái)研究的重點(diǎn)。
利用機(jī)器學(xué)習(xí)的方法可以使自動(dòng)化程度顯著提高,在未來(lái)的研究中,應(yīng)致力于深度學(xué)習(xí)方法的研究,由此提高智能合約漏洞檢測(cè)的自動(dòng)化程度和整體效率。
(3)漏洞類型覆蓋率低
現(xiàn)階段智能合約的漏洞類型多,不同區(qū)塊鏈網(wǎng)絡(luò)編寫智能合約采用的語(yǔ)言也不盡相同,這也給漏洞檢測(cè)帶來(lái)了困難。本文調(diào)研的眾多漏洞檢測(cè)工具個(gè)體支持檢測(cè)的漏洞類型最多不超過10 種,但現(xiàn)有常見的漏洞類型多達(dá)20多種。因此下一步的重點(diǎn)是整合更多的漏洞檢測(cè)工具以提高漏洞覆蓋率,同時(shí)可以致力于使用機(jī)器學(xué)習(xí)方法建立通用的模型,使用機(jī)器學(xué)習(xí)方法能更好地提高漏洞覆蓋率,以此作為今后的研究重點(diǎn)。
(4)漏洞檢測(cè)效率較低
當(dāng)前的漏洞檢測(cè)準(zhǔn)確率較低且速度較慢,如何提高漏洞檢測(cè)效率,即如何解決在檢測(cè)過程中出現(xiàn)的假陽(yáng)性、真陰性問題以及如何提高漏洞檢測(cè)的速度是未來(lái)研究過程中需要探索的問題。當(dāng)前漏洞檢測(cè)效率低的原因是形式化驗(yàn)證等方法需要大量的數(shù)學(xué)推導(dǎo)同時(shí)依賴專家經(jīng)驗(yàn),此計(jì)算過程時(shí)間較長(zhǎng),因此優(yōu)化數(shù)學(xué)方法、優(yōu)化搜索路徑或使用深度學(xué)習(xí)方法都能有效提高檢測(cè)效率。
(5)智能合約開源程度低
當(dāng)前智能合約的開源程度較低,這就給漏洞檢測(cè)造成了困難。由于現(xiàn)階段非開源智能合約超過半數(shù),促進(jìn)智能合約的開源才能有效與機(jī)器學(xué)習(xí)結(jié)合,以此為研究者提供更好的代碼檢測(cè)環(huán)境。同時(shí)利用這些非開源的智能合約進(jìn)行逆向工程的漏洞檢測(cè),提高對(duì)非開源智能合約的利用,將是解決現(xiàn)有開源智能合約不足問題的方法。
(6)機(jī)器學(xué)習(xí)方法構(gòu)建通用模型
當(dāng)前機(jī)器學(xué)習(xí)方法雖然能夠?qū)崿F(xiàn)較高的學(xué)習(xí)效率與較好的學(xué)習(xí)結(jié)果,但是當(dāng)前智能合約數(shù)量的增長(zhǎng)速度快,漏洞類型也越來(lái)越多,而機(jī)器學(xué)習(xí)方法大多只針對(duì)某一具體漏洞或具體函數(shù)進(jìn)行學(xué)習(xí),對(duì)新漏洞的適應(yīng)能力不足,因此需要形成通用的漏洞檢測(cè)模型。
構(gòu)建通用模型或適用性更廣的模型來(lái)同時(shí)檢測(cè)更多的漏洞將是使用機(jī)器學(xué)習(xí)方法未來(lái)研究的方向。通過構(gòu)建通用檢測(cè)模型,將會(huì)使機(jī)器學(xué)習(xí)方法更快速、方便地服務(wù)于漏洞檢測(cè),并做到對(duì)新型漏洞的快速響應(yīng)。
(7)可移植性低
當(dāng)前的智能合約編寫語(yǔ)言種類繁多,平臺(tái)較多,多數(shù)漏洞檢測(cè)軟件的跨平臺(tái)性差甚至完全不支持跨平臺(tái)。未來(lái)如何使成熟的漏洞檢測(cè)工具在支持更多智能合約語(yǔ)言的同時(shí)提高其跨平臺(tái)性,以及使漏洞檢測(cè)工具更好地發(fā)揮其檢測(cè)的效率將是研究的重點(diǎn)方向。整合不同漏洞檢測(cè)工具,發(fā)揮其不同的性能優(yōu)勢(shì),將會(huì)更好地提高檢測(cè)工具的檢測(cè)效率和可移植性。
(8)缺乏統(tǒng)一的評(píng)價(jià)指標(biāo)和完善的漏洞合約庫(kù)
現(xiàn)階段智能合約的漏洞檢測(cè)工具評(píng)價(jià)標(biāo)準(zhǔn)集中在速度、準(zhǔn)確率等指標(biāo),缺少統(tǒng)一的評(píng)價(jià)指標(biāo)。而且每種工具支持的漏洞數(shù)量、跨平臺(tái)性等不盡相同。因此需要整合漏洞檢測(cè)工具的評(píng)價(jià)標(biāo)準(zhǔn),綜合考慮可移植性、自動(dòng)化程度以及準(zhǔn)確率等指標(biāo)形成統(tǒng)一的評(píng)價(jià)標(biāo)準(zhǔn)。同時(shí),關(guān)于智能合約的測(cè)試沒有標(biāo)準(zhǔn)的測(cè)試集,因此造成各工具對(duì)比數(shù)據(jù)可信度大大降低。下一步研究應(yīng)建立完善的存在漏洞的智能合約庫(kù),為未來(lái)漏洞檢測(cè)的研究和攻擊行為的預(yù)防提供支持。
本節(jié)總結(jié)了不同智能合約檢測(cè)方法的問題并對(duì)部分問題給出了改進(jìn)思路。未來(lái),總結(jié)各種方法的利弊,綜合各種方法的長(zhǎng)處,開發(fā)更加高效的漏洞檢測(cè)工具將是未來(lái)研究的重點(diǎn),以此形成更加安全的、可靠的智能合約環(huán)境。由于傳統(tǒng)漏洞檢測(cè)方法存在以上描述的各種問題,倡導(dǎo)在未來(lái)的研究中加大機(jī)器學(xué)習(xí)的研究力度。與此同時(shí),由于機(jī)器學(xué)習(xí)方法對(duì)數(shù)據(jù)高度依賴,在未來(lái)建立統(tǒng)一的檢測(cè)標(biāo)準(zhǔn)和相關(guān)數(shù)據(jù)集,有助于開發(fā)者更好地開發(fā)漏洞檢測(cè)工具。
區(qū)塊鏈?zhǔn)怯?jì)算機(jī)技術(shù)發(fā)展的重要產(chǎn)物。密碼學(xué)、智能合約、對(duì)等網(wǎng)絡(luò)等的綜合應(yīng)用,使區(qū)塊鏈正在改變交通、醫(yī)療、金融等傳統(tǒng)行業(yè)。在快速的發(fā)展過程中,安全問題也大量涌現(xiàn)。TheDAO、Beauty Chain等事件的出現(xiàn)為安全人員敲響了警鐘,在利用區(qū)塊鏈去改變社會(huì)的同時(shí),也應(yīng)該對(duì)其安全性進(jìn)行審視,解決安全漏洞問題。本文簡(jiǎn)要介紹了重入漏洞、整數(shù)溢出漏洞、訪問控制漏洞等八種常見的漏洞類型,并對(duì)部分漏洞代碼進(jìn)行了重現(xiàn),讓研究者更直觀地了解漏洞。通過對(duì)形式化驗(yàn)證、符號(hào)執(zhí)行、機(jī)器學(xué)習(xí)等五類漏洞檢測(cè)方法的介紹,引入對(duì)應(yīng)類型漏洞檢測(cè)方法的工具,對(duì)這些方法和工具進(jìn)行了討論分析,并給出未來(lái)智能合約漏洞檢測(cè)研究的一些展望。