童俊成,趙波
(武漢大學(xué) 國家網(wǎng)絡(luò)安全學(xué)院,武漢 430072)
在信任危機(jī)困境中,涉及第三方的交易存在安全風(fēng)險(xiǎn)或成本較高的問題。區(qū)塊鏈作為一種分散的分布式賬本,幫助人們?cè)诓豢尚诺沫h(huán)境中進(jìn)行安全可靠的交易,得到了迅速發(fā)展和廣泛應(yīng)用。區(qū)塊鏈在市場上的潛力隨著比特幣的流行而被重視[1-2],但現(xiàn)在的區(qū)塊鏈已不再局限于數(shù)字貨幣,而是由于智能合約這一應(yīng)用于區(qū)塊鏈2.0 上的技術(shù)而引起了廣泛關(guān)注[3]。
密碼學(xué)者Szabo[4]首次提出智能合約的概念,將它定義為一套以數(shù)字形式指定的承諾,合約參與者可以在上面執(zhí)行這些承諾的協(xié)議。即智能合約是一段可以在計(jì)算機(jī)上自動(dòng)執(zhí)行的代碼。由于缺乏可信的執(zhí)行環(huán)境,這一概念在當(dāng)時(shí)并未得到廣泛地應(yīng)用。如今區(qū)塊鏈技術(shù)為智能合約提供了一個(gè)可以達(dá)成共識(shí)從而整體可信的網(wǎng)絡(luò)環(huán)境,使智能合約真正流行起來。因此可以認(rèn)為智能合約與區(qū)塊鏈平臺(tái)相互促進(jìn),將受到學(xué)術(shù)界與工業(yè)界越來越多的重視。
隨著智能合約的快速發(fā)展,近年來針對(duì)它的漏洞的攻擊層出不窮。2016 年,去中心化自治組織(Decentralized Autonomous Organization,DAO)這一部署在以太網(wǎng)上的全球最大眾籌項(xiàng)目遭到黑客攻擊,導(dǎo)致超過300 萬以太幣脫離DAO 資源池,直接造成以太坊采取硬分叉策略,損害了以太坊的公平性[5]。2017 年,以太坊多重簽名錢包Parity 出現(xiàn)安全漏洞,導(dǎo)致超過15 萬以太幣被侵吞。2021 年,幣安智能鏈上的自動(dòng)做市商(Automated Market Maker,AMM)合約在遷移過程中出現(xiàn)漏洞并遭到黑客攻擊利用,導(dǎo)致5 000 萬美元的資金被盜。
智能合約與傳統(tǒng)程序區(qū)別很大。首先,它通過交易方式發(fā)布,一旦被部署成功,將分布式地存儲(chǔ)到鏈上的每一個(gè)區(qū)塊內(nèi),由礦工節(jié)點(diǎn)運(yùn)行,而在現(xiàn)有的區(qū)塊鏈系統(tǒng)中這些礦工節(jié)點(diǎn)無需具有可信的基礎(chǔ)計(jì)算環(huán)境;其次,智能合約常常通過相互調(diào)用以實(shí)現(xiàn)更加復(fù)雜的功能,但如果調(diào)用了不受信任的外部合約可能會(huì)引發(fā)風(fēng)險(xiǎn)和錯(cuò)誤,甚至當(dāng)它所依賴的其他合約內(nèi)存在惡意代碼時(shí),會(huì)導(dǎo)致每個(gè)外部調(diào)用都存在潛在的安全威脅;再者,在區(qū)塊鏈上智能合約可以由任意用戶發(fā)布或協(xié)同編制,而在這一過程中用戶知識(shí)和使用工具參差不齊、選擇使用的智能合約源碼的安全建議也并不齊全,還有可能存在不受控制的惡意用戶操作規(guī)程,無法保證智能合約部署上鏈后沒有安全漏洞或缺陷;最后,智能合約還具有一些傳統(tǒng)代碼沒有的機(jī)制,如以太坊智能合約的燃料(Gas)機(jī)制等。這些都導(dǎo)致區(qū)塊鏈智能合約漏洞挖掘具有難度和挑戰(zhàn)性。另外,區(qū)塊鏈系統(tǒng)具有的兩大特性也給智能合約的修復(fù)升級(jí)帶來挑戰(zhàn):1)區(qū)塊鏈系統(tǒng)具有的不可篡改性使智能合約一經(jīng)部署就難以更新升級(jí);2)區(qū)塊鏈系統(tǒng)具有的透明性使普通用戶獲取區(qū)塊鏈上運(yùn)行的智能合約字節(jié)碼更加容易,這就對(duì)智能合約修復(fù)工作提出了及時(shí)、快速的需求,因?yàn)閮H挖掘、發(fā)現(xiàn)漏洞而不升級(jí)合約則攻擊者更有可能利用漏洞對(duì)區(qū)塊鏈平臺(tái)產(chǎn)生威脅。
綜上所述,智能合約的漏洞檢測(cè)與自動(dòng)化修復(fù)技術(shù)的研究在區(qū)塊鏈安全領(lǐng)域十分必要也非常熱門,本文從智能合約漏洞基礎(chǔ)知識(shí)出發(fā),重點(diǎn)調(diào)研了智能合約漏洞挖掘的關(guān)鍵技術(shù)方法以及自動(dòng)化修復(fù)與升級(jí)方法,并探討了前沿技術(shù)與未來可能的發(fā)展方向。
智能合約是一種旨在提供、驗(yàn)證與執(zhí)行合約的特殊應(yīng)用程序,整個(gè)存儲(chǔ)、讀取、執(zhí)行過程由區(qū)塊鏈技術(shù)保障。首先,智能合約通過交易方式發(fā)布,一旦被部署成功,與區(qū)塊鏈融為一體,分布存儲(chǔ)到鏈上的每一個(gè)區(qū)塊內(nèi),且區(qū)塊鏈的不可篡改性使它難以更新升級(jí),而且存儲(chǔ)于區(qū)塊鏈上的智能合約字節(jié)碼公開透明,這會(huì)導(dǎo)致智能合約不可信。由于智能合約最常見的部署平臺(tái)是以太坊[6],當(dāng)前最廣泛的智能合約漏洞挖掘工作也集中在以太坊,因此本章將重新審視它們的基本概念和執(zhí)行上下文,對(duì)三個(gè)關(guān)鍵概念進(jìn)行描述:賬戶、交易和以太坊虛擬機(jī)(Ethereum Virtual Machine,EVM)。
1)賬戶。
以太坊采用類似傳統(tǒng)銀行系統(tǒng)中的賬戶管理機(jī)制的賬戶模式,有兩種賬戶類型:外部賬戶(Externally Owned Account,EOA)和合約賬戶(Contract Account,CA)。它們都由一個(gè)20 Byte 的地址唯一標(biāo)識(shí),由隨機(jī)數(shù)(Nonce)、賬戶余額(Balance)、合約代碼(Bytecode)、存儲(chǔ)(Stored Data)組成。
EOA 由公鑰/私鑰對(duì)控制,主要用于管理以太(ETHereum,ETH),并通過發(fā)送交易與合約進(jìn)行交互。而CA則由智能合約中的代碼邏輯控制,主要用于實(shí)現(xiàn)各種功能需求,記錄已執(zhí)行的交易、余額修改等合約狀態(tài)變化,但不能發(fā)送交易。CA 不能主動(dòng)與外部賬戶交互。這兩類賬戶將共同維護(hù)以太坊中包含變量狀態(tài)信息的狀態(tài)對(duì)象實(shí)體,并通過區(qū)塊鏈的共識(shí)機(jī)制實(shí)現(xiàn)各節(jié)點(diǎn)之間的一致性。
2)交易。
以太坊中的交易指由外部賬戶發(fā)送的消息簽名數(shù)據(jù),其中包含了發(fā)送者簽名、接收者地址、賬戶余額、發(fā)送幣的數(shù)量、最大消耗的Gas 限制以及合約每步執(zhí)行支付給礦工的費(fèi)用。在以太坊中,CA 在智能合約被第一次發(fā)布時(shí)創(chuàng)建,它的創(chuàng)建過程通過合約創(chuàng)建交易形式完成。交易將廣播到區(qū)塊鏈上的每個(gè)礦機(jī)執(zhí)行,并在達(dá)成一致共識(shí)后改變存儲(chǔ)狀態(tài)。在交易包含的信息中,Gas 機(jī)制維持以太坊生態(tài)系統(tǒng)正常運(yùn)行的動(dòng)力來源,合約中函數(shù)的計(jì)算都以Gas 進(jìn)行衡量,無論是轉(zhuǎn)賬交易還是合約的創(chuàng)建與執(zhí)行,都需要消耗Gas。在激勵(lì)與安全上,Gas 機(jī)制也發(fā)揮著關(guān)鍵作用:對(duì)礦工執(zhí)行和存儲(chǔ)交易進(jìn)行補(bǔ)償和激勵(lì);防范惡意用戶發(fā)送復(fù)雜計(jì)算等拒絕服務(wù)攻擊(Denial of Service,DoS)攻擊。
3)執(zhí)行環(huán)境。
以太坊智能合約由EVM 執(zhí)行。EVM 由一個(gè)具有自定義指令格式的虛擬機(jī)組成,該虛擬機(jī)基于棧結(jié)構(gòu)實(shí)現(xiàn)。在EVM 中,智能合約調(diào)用的每條指令都表示為一個(gè)字節(jié)操作碼,參數(shù)在數(shù)據(jù)堆棧上傳遞。唯一的例外是Push 指令,它將常量推送到堆棧上,這些常量被直接編碼到指令字節(jié)中。EVM 的存儲(chǔ)結(jié)構(gòu)有堆棧、內(nèi)存和存儲(chǔ)。堆棧可以存儲(chǔ)局部變量;內(nèi)存用于存儲(chǔ)參數(shù)和返回值,被函數(shù)調(diào)用后釋放。堆棧和內(nèi)存具有易失性,將在完成事務(wù)后清除,存儲(chǔ)將持久地存儲(chǔ)狀態(tài)變量。
以太坊智能合約漏洞按照引入原因可分為Solidity、EVM 和區(qū)塊鏈三個(gè)層級(jí),其中:Solidity 為智能合約編程語言,因此可以將DASP 10(Decentralized Application Security Project 10)列舉的除了未知類型漏洞外的主要智能合約漏洞按表1[7]進(jìn)行歸類。
表1 智能合約漏洞類型與引入層級(jí)Tab.1 Smart contract vulnerability types and introduction levels
1)重入漏洞。
重入漏洞是最臭名昭著的以太坊漏洞,第一次被發(fā)現(xiàn)時(shí)直接導(dǎo)致了以太坊的硬分叉。當(dāng)允許外部合約調(diào)用時(shí),在初始執(zhí)行完成之前對(duì)調(diào)用合約進(jìn)行新調(diào)用時(shí)就會(huì)發(fā)生重入。對(duì)于函數(shù)而言,這意味著合約狀態(tài)可能會(huì)在執(zhí)行過程中由于調(diào)用不受信任的合約或使用具有外部地址的低級(jí)函數(shù)而發(fā)生變化。DAO 項(xiàng)目遭到重入漏洞的攻擊過程如圖1 所示。
圖1 利用重入漏洞攻擊DAO合約Fig.1 Attacking DAO contract by exploiting reentrancy vulnerability
攻擊者調(diào)用DAO 合約中的splitDAO(),而SplitDAO()調(diào)用withdrawRewardFor(),這個(gè)函數(shù)調(diào)用由DAO 創(chuàng)建的子合約中的payOut();然后,payOu(t)調(diào)用call.value()向攻擊者的智能合約發(fā)送ETH;由于call.value()將調(diào)用被調(diào)用合約中的回退函數(shù)fallback(),因此攻擊合約可以再次調(diào)用splitDAO(),從而被攻擊的DAO 合約可被重復(fù)執(zhí)行如圖1 所示的步驟2)~6),直到耗盡Gas,導(dǎo)致超過合理數(shù)量的ETH 被取走。
2)訪問控制漏洞。
攻擊者利用不安全的可見性設(shè)置訪問合約私有值或邏輯。當(dāng)合約使用已棄用的tx.origin 驗(yàn)證調(diào)用者,并在代理庫或代理合約中魯莽使用處理冗長的大型授權(quán)邏輯require 以及delegatecall 時(shí),就會(huì)出現(xiàn)這類漏洞。如圖2 所示,在用戶A調(diào)用合約B 的內(nèi)部函數(shù)并通過該內(nèi)部函數(shù)再次調(diào)用合約C的過程中,會(huì)出現(xiàn)tx.origin 返回原始發(fā)送交易的地址,而msg.sender 返回當(dāng)前交易的發(fā)送者的情況。因此當(dāng)利用tx.origin 驗(yàn)證權(quán)限時(shí),攻擊者會(huì)利用上述差異進(jìn)行攻擊。
圖2 tx.origin與msg.sender調(diào)用結(jié)果差異Fig.2 Differences between calling results of tx.origin and msg.sender
3)算術(shù)漏洞。
算術(shù)漏洞也被稱為整數(shù)上溢和下溢,這并不是一類新的漏洞,但它們?cè)谥悄芎霞s中尤其危險(xiǎn),其中無符號(hào)整數(shù)導(dǎo)致的漏洞最常見,大多數(shù)開發(fā)人員習(xí)慣使用簡單的Int 類型(通常只是有符號(hào)整數(shù))。如果發(fā)生溢出,許多看似良性的合約代碼將成為盜竊以太幣或拒絕服務(wù)的源頭。如圖3 所示:由于高位為符號(hào)位置,若合約不檢查整數(shù)上溢的函數(shù),將導(dǎo)致127 加上1 得到有符號(hào)整數(shù)-128 的錯(cuò)誤。
圖3 整數(shù)上溢示例圖Fig.3 Schematic diagram of integer overflow
4)拒絕服務(wù)漏洞。
與大多數(shù)分布式系統(tǒng)一樣,拒絕服務(wù)在以太坊中是致命的攻擊。導(dǎo)致拒絕服務(wù)的方式有很多,包括交易接收者的惡意行為、人為增加計(jì)算函數(shù)所需的Gas、濫用控制訪問智能合約的私有組件、利用混淆和疏忽等。在如圖4 所示的鎖倉合約調(diào)用示例中,用戶A、B、C 都可以通過發(fā)布在以太坊上的Lockdrop 合約進(jìn)行鎖倉操作,成功后會(huì)生成一份屬于自己權(quán)限控制下的Lock 合約。但在Lock 合約生成中函數(shù)會(huì)進(jìn)行強(qiáng)制判斷:屬于參與者的Lock 合約的金額必須等于參與者鎖倉時(shí)發(fā)送的金額,如果不相等,意味著Lock 失敗,此時(shí)會(huì)導(dǎo)致參與者的Lock 合約“癱瘓”而形成“拒絕服務(wù)”,如果攻擊持續(xù),那么鎖倉機(jī)制將不再可用。
圖4 鎖倉合約的拒絕服務(wù)漏洞Fig.4 Denial of service vulnerability in lock contract
5)低級(jí)調(diào)用中未檢查返回值。
cal(l)、callcode()、delegatecal(l)和send()為Solidity 中的低級(jí)函數(shù)。它們?cè)谟?jì)算錯(cuò)誤方面的行為與其他Solidity 函數(shù)完全不同,因?yàn)樗鼈儾粫?huì)傳播并且導(dǎo)致當(dāng)前執(zhí)行的完全恢復(fù)。相反,它們將返回一個(gè)設(shè)置false 的布爾值,并且代碼將繼續(xù)運(yùn)行。如果不檢查此類低級(jí)調(diào)用的返回值,可能會(huì)導(dǎo)致打開失敗和其他不需要的結(jié)果。在如下所示的由于調(diào)用send()而產(chǎn)生的該類型的漏洞合約代碼2)~4)行中:如果漏洞合約提高send()函數(shù)調(diào)用將以太發(fā)送到不接受它的智能合約,EVM 將用false 替換返回值;如果漏洞合約未檢查返回值,函數(shù)對(duì)合約狀態(tài)的更改將不會(huì)被還原,并且etherLeft 變量最終將記錄不正確的值。
6)短地址攻擊。
短地址攻擊是EVM 自身接受錯(cuò)誤填充參數(shù)的副作用。攻擊者通過使用特制地址,使編碼不佳的客戶端在將參數(shù)包含在事務(wù)中之前錯(cuò)誤地對(duì)它進(jìn)行編碼。大量的以太幣可能會(huì)直接受到這個(gè)問題的影響。以以太坊協(xié)議ERC-20(Ethereum Request for Comments 20)為標(biāo)準(zhǔn)的代幣為例,如果調(diào)用transfer()函數(shù)給地址“0x12345678901234567890123456 7890123456700”發(fā)送2 個(gè)ETH,交易的input 數(shù)據(jù)可以分為如圖5 所示的3 個(gè)部分,但如果傳入的地址最后兩位是“00”,合約在解析參數(shù)時(shí),會(huì)從下一個(gè)參數(shù)的高位拿到“00”來補(bǔ)充,導(dǎo)致后面的參數(shù)不足32 Byte,從而自動(dòng)在尾部補(bǔ)上“00”,這樣則會(huì)出現(xiàn)只取2 個(gè)ETH,卻拿到512 個(gè)ETH 的漏洞。
圖5 短地址自動(dòng)補(bǔ)齊機(jī)制Fig.5 Short address auto-completion mechanism
7)交易順序依賴漏洞。
交易順序依賴漏洞指一種依賴于交易執(zhí)行順序而造成執(zhí)行結(jié)果差異的安全漏洞。交易打包發(fā)送出去后會(huì)先存入交易池中,區(qū)塊鏈礦工節(jié)點(diǎn)按照規(guī)則從交易池中選取一批交易放入新生成的區(qū)塊。此時(shí)該新生成的區(qū)塊還沒有被確認(rèn)為最終塊,不同節(jié)點(diǎn)選取的交易和交易放入的順序都不固定,因此合約執(zhí)行的函數(shù)順序也不可預(yù)測(cè)。一般礦工會(huì)選擇交易費(fèi)高的交易放入新區(qū)塊中,因此攻擊者可以通過提高交易費(fèi)使交易在其他交易之前被寫入,進(jìn)而影響合約的最終執(zhí)行結(jié)果。如圖6 所示是MarketPlace 合約的兩種不同的被調(diào)用順序。MarketPlace 合約是一個(gè)股票買賣合約,聲明了price 和stock 兩個(gè)變量,以及兩個(gè)功能函數(shù)updatePrice 和buy。其中:updatePrice 用于更新price 值,只有合約所有者才能修改;buy 是用戶從合約中購買股票。按照順序1 確認(rèn)交易會(huì)出現(xiàn)用戶使用舊的價(jià)格購買股票,而順序2 確認(rèn)交易會(huì)出現(xiàn)用戶用新的價(jià)格購買。利用這一漏洞可能導(dǎo)致合約所有者將用戶賬戶余額清零的攻擊行為。
圖6 MarketPlace合約的兩種交易確認(rèn)順序Fig.6 Two transaction confirmation orders for MarketPlace contract
8)時(shí)間戳依賴漏洞。
從鎖定代幣銷售到在游戲的特定時(shí)間解鎖資金,合約有時(shí)需要依賴當(dāng)前時(shí)間,通常通過block.timestamp 實(shí)現(xiàn)事件約束。在如圖7 所示的輪盤賭游戲合約中,如果參與用戶在區(qū)塊時(shí)間戳正好能被5 整除的區(qū)塊中第一個(gè)向智能合約轉(zhuǎn)10以太,那么他將獲得之前轉(zhuǎn)入合約的所有賭注。但由于區(qū)塊由礦工生成,礦工可以預(yù)先知道下一個(gè)區(qū)塊的時(shí)間戳是否能被5 整除,從而作惡贏得所有以太。
圖7 具有時(shí)間戳依賴漏洞的輪盤賭合約Fig.7 Roulette contract with timestamp dependence vulnerability
9)錯(cuò)誤隨機(jī)漏洞。
由于以太坊是一種確定性的圖靈機(jī),因此通過區(qū)塊鏈環(huán)境中的變量生成的隨機(jī)數(shù)并不是真隨機(jī)數(shù)。在如圖8 所示的示例中,判斷獲勝合約的發(fā)布者定義了pointer 指針作為私有變量,希望通過隱藏該私有變量,讓用戶參與者無法獲取私有種子的數(shù)值。但攻擊者實(shí)際上可以通過Web3 等方法在區(qū)塊鏈上查看到這一變量值,從而利用這一漏洞贏得游戲。
圖8 具有錯(cuò)誤隨機(jī)漏洞的游戲合約Fig.8 Game contract with error random vulnerability
符號(hào)執(zhí)行是一種重要的程序分析技術(shù),它通過用抽象符號(hào)值替換程序本身未指定的信息來表示任何值從而偽執(zhí)行程序,同時(shí)也發(fā)展出了靜態(tài)符號(hào)執(zhí)行與動(dòng)態(tài)符號(hào)執(zhí)行[8]。
在靜態(tài)執(zhí)行方面,Oyente[9]是第一個(gè)被提出的工具,它將智能合約的字節(jié)碼和以太坊區(qū)塊鏈的狀態(tài)作為輸入,通過符號(hào)執(zhí)行可以檢測(cè)出事務(wù)排序依賴、重入、時(shí)間戳依賴和未處理的異常四個(gè)類型的漏洞。文獻(xiàn)[10]中針對(duì)整數(shù)漏洞提出名為Osiris 的工具。該工具通過符號(hào)執(zhí)行方法,針對(duì)導(dǎo)致整數(shù)上溢或者整數(shù)下溢錯(cuò)誤的算術(shù)指令,檢查當(dāng)前的路徑條件下指令是否有可能違反邊界檢查要求;針對(duì)由Solidity 使用AND 和SIGNEXTEND 指令截?cái)嘤蟹?hào)整數(shù)和無符號(hào)整數(shù)導(dǎo)致的錯(cuò)誤,檢查這兩條指令的輸入是否大于指令的輸出;針對(duì)符號(hào)錯(cuò)誤,檢查特定指令的符號(hào)限制。文獻(xiàn)[11]中提出了一種基于符號(hào)執(zhí)行的工具DefectChecker,該工具使用堆事件和特征檢測(cè)器代替了SMT 求解器的使用,相較于基于符號(hào)執(zhí)行方法的Oyente、Mythril[12]和Securify[13]這三種智能合約漏洞檢測(cè)先驅(qū)工具,速度和準(zhǔn)確性更優(yōu)。
動(dòng)態(tài)符號(hào)執(zhí)行也稱為混合符號(hào)執(zhí)行,通過對(duì)路徑謂詞的識(shí)別生成有約束的程序輸入,從而提高準(zhǔn)確度。文獻(xiàn)[14]中提出名為Manticore 的開源動(dòng)態(tài)符號(hào)執(zhí)行框架,該框架實(shí)現(xiàn)了與平臺(tái)無關(guān)的通用符號(hào)執(zhí)行引擎,該引擎對(duì)底層執(zhí)行模型幾乎沒有任何假設(shè),根據(jù)狀態(tài)生命周期來操作和管理程序狀態(tài)。文獻(xiàn)[15]中提出名為MAIAN 的工具,該工具通過分析智能合約在以太坊中的多次調(diào)用(合約的每次運(yùn)行被稱為一次調(diào)用),給定輸入的上下文,在合約代碼中執(zhí)行一條執(zhí)行路徑,系統(tǒng)地描述并檢測(cè)出三種漏洞合約:1)貪婪合約,通過無法發(fā)送ETH 來鎖定資金;2)洪泛合約,可以將ETH 泄露給從未互動(dòng)過的用戶;3)自殺性合約,可以殺死合約或強(qiáng)制合約執(zhí)行自殺指令。
盡管符號(hào)執(zhí)行在智能合約漏洞檢測(cè)方法中被廣泛使用,但是將符號(hào)執(zhí)行用于智能合約仍面臨著無法識(shí)別不可行路徑、無法驗(yàn)證交互的合約等局限性[16],因此存在許多優(yōu)化的符號(hào)執(zhí)行漏洞檢測(cè)方法。例如,文獻(xiàn)[10]中的Osiris 工具采用污點(diǎn)分析方法篩選掉不能被實(shí)際利用的整數(shù)錯(cuò)誤,以降低誤報(bào)率。文獻(xiàn)[17]中提出一種新的增量符號(hào)執(zhí)行方法,該方法基于路徑探索和路徑后綴摘要之間的迭代循環(huán)。一方面,匯總探索的路徑,以更精確地識(shí)別受影響的路徑;另一方面,路徑后綴摘要將路徑探索引導(dǎo)到?jīng)]有增量行為的修剪路徑。文獻(xiàn)[18]中提出名為Annotary 的混合符號(hào)執(zhí)行工具,該工具在Mythril 工具的基礎(chǔ)上,通過構(gòu)建合約間以及交易間的控制流執(zhí)行語義模型消除傳統(tǒng)符號(hào)在執(zhí)行無法處理的不可達(dá)狀態(tài)時(shí)存在誤報(bào)的問題,并且,通過支持合約開發(fā)者聲明屬性的可驗(yàn)證來實(shí)現(xiàn)Solidity 語言的向后兼容擴(kuò)展。
結(jié)合靜態(tài)分析的程序驗(yàn)證方法在智能合約安全審計(jì)中也是研究的熱點(diǎn)。該方法基于形式化方法(Formal Method)的相關(guān)理論,通過形式化語言把合約中的概念、判斷、推理轉(zhuǎn)化成智能合約模型,可以消除自然語言的歧義性、不通用性,進(jìn)而采用形式化工具對(duì)智能合約建模、分析和驗(yàn)證。智能合約形式化驗(yàn)證方法包括演繹驗(yàn)證和模型檢測(cè)等方法。
演繹驗(yàn)證主要基于定理證明(Theorem Proving)的基本思想,采用邏輯公式描述系統(tǒng)及它的性質(zhì),通過一些公理或推理規(guī)則來證明系統(tǒng)具有某些性質(zhì)。
定理證明可以驗(yàn)證無限狀態(tài)系統(tǒng)與有限狀態(tài)系統(tǒng)。雖然定理證明技術(shù)通常是半自動(dòng)化的,需要人的參與和專業(yè)知識(shí),但是學(xué)術(shù)界與工業(yè)界依舊開發(fā)了許多由定理證明支持的智能合約安全審計(jì)方法與工具,可按照定理證明方法所基于的語言級(jí)別分為以下三類。
1)對(duì)EVM 字節(jié)碼這一低級(jí)語言層面進(jìn)行定理證明的研究工作受到了廣泛的關(guān)注:文獻(xiàn)[19]中將智能合約字節(jié)碼序列組織成直線型程序,然后在Isabelle/HOL 定理證明器中用一個(gè)字節(jié)碼級(jí)別的程序邏輯對(duì)EVM 形式化進(jìn)行了擴(kuò)展;文獻(xiàn)[20]中提出一種以Gas 消耗量為重點(diǎn)的EVM 執(zhí)行抽象模型,該模型通過對(duì)EVM 調(diào)用堆棧進(jìn)行度量,提供了對(duì)智能合約終止條件的通用形式化證明。
2)文獻(xiàn)[21]中認(rèn)為中間語言(Intermediate Language,IL)有助于在驗(yàn)證的直觀性和減少底層理解所需的能力之間取得平衡,因此通過Isabelle/HOL 證明器對(duì)Yul 這一以太坊的IL 進(jìn)行形式化證明,并在證明過程中利用Yul 的良好可理解性來設(shè)計(jì)合約函數(shù)的初始前置/后置條件以達(dá)到精確識(shí)別合約函數(shù)的所有假設(shè)和影響的目的?;贗L 的另一項(xiàng)更具代表性的工作是由文獻(xiàn)[22]中提出的ZEUS 工具,它構(gòu)建了第一個(gè)從Solidity 語言到低級(jí)虛擬機(jī)中間表示(Low Level Virtual Machine Intermediate Representation,LLVM-IR)的轉(zhuǎn)換器,并進(jìn)行給定策略下的形式化證明。
3)由于并不需要程序員理解Solidity 源碼的編譯過程,并且等價(jià)性檢查對(duì)基于IL 進(jìn)行形式化驗(yàn)證的有效性至關(guān)重要(例如ZEUS 的大多數(shù)誤報(bào)正是由Solidity 與轉(zhuǎn)換為LLVMIR 后的語義不一致造成的),因此對(duì)Solidity 以及生成的領(lǐng)域特定語言(Domain Specific Language,DSL)這樣的高級(jí)語言進(jìn)行形式化驗(yàn)證也是研究的熱點(diǎn)。文獻(xiàn)[23]中基于形式記憶框架完成了第一個(gè)Solidity 子集的語義形式化工作。
模型檢測(cè)(Model Checking)可以根據(jù)系統(tǒng)的規(guī)格自動(dòng)驗(yàn)證具有有限狀態(tài)的系統(tǒng)模型。該方法的基本思想是通過狀態(tài)空間搜索來確認(rèn)合約是否具有某些性質(zhì)。即給定一個(gè)智能合約P和規(guī)約ψ,生成對(duì)應(yīng)的合約模型M,然后證明規(guī)約公式ψ在智能合約模型M中成立,這樣就證明了智能合約P滿足規(guī)約ψ。在基于模型檢測(cè)方法的智能合約安全審計(jì)研究工作中,模型檢測(cè)方法的流行得益于傳統(tǒng)代碼分析領(lǐng)域大量成熟的框架與工具的存在,比如NuSMV 和nuXmv 等模型檢查器以及WebGME 等開源Web 框架。
文獻(xiàn)[24]中提出FSolidM 工具,該工具建立在WebGME之上,能夠?qū)⒅悄芎霞s轉(zhuǎn)為有限狀態(tài)機(jī),并通過鎖定、交易計(jì)數(shù)器等插件完成對(duì)重入漏洞與交易排序依賴漏洞的檢測(cè);在此基礎(chǔ)上,文獻(xiàn)[25]中進(jìn)一步設(shè)計(jì)并實(shí)現(xiàn)集成了nuXmv 驗(yàn)證器的VeriSolid 工具,以滿足并發(fā)系統(tǒng)死鎖和活鎖等機(jī)制的驗(yàn)證需求;文獻(xiàn)[26]中則基于多個(gè)智能合約交互的視角,通過引入部署圖來擴(kuò)展VeriSolid 系統(tǒng)的操作語義;文獻(xiàn)[27]中提出一種由不同實(shí)體開發(fā)和控制的交互智能合約組成的系統(tǒng)的驗(yàn)證方法,該方法使用NuSMV 模型檢測(cè)器和行為-交互-優(yōu)先級(jí)(Behavior Interaction Priority,BIP)工具建模智能合約的行為及交互,從而驗(yàn)證它們是否符合系統(tǒng)的功能要求。
上述模型檢測(cè)方法雖然已經(jīng)從對(duì)單個(gè)智能合約的驗(yàn)證擴(kuò)展到了對(duì)智能合約交互進(jìn)行驗(yàn)證,但由于NuSMV 等模型檢測(cè)器輸入語言的限制,模型檢查方法很少考慮區(qū)塊鏈上智能合約執(zhí)行的細(xì)節(jié),比如Gas 機(jī)制或內(nèi)存模型,這意味著對(duì)區(qū)塊鏈環(huán)境進(jìn)行精確建模成為了難點(diǎn)。文獻(xiàn)[28]中考慮智能合約在執(zhí)行環(huán)境中的執(zhí)行行為因素,如合約的注冊(cè)、外部交易的接收等并對(duì)此進(jìn)行建模;文獻(xiàn)[29]中通過將著色Petri網(wǎng)(Colored Petri Net,CPN)與EVM 字節(jié)碼的程序邏輯相結(jié)合,實(shí)現(xiàn)了一個(gè)更現(xiàn)實(shí)的智能合約執(zhí)行模型。
模糊測(cè)試(Fuzzing)是一種流行且有效的軟件測(cè)試技術(shù),通過向被測(cè)智能合約輸入大量意外數(shù)據(jù),檢測(cè)異常發(fā)生情況,從而發(fā)現(xiàn)潛在漏洞。相較于符號(hào)執(zhí)行與形式化驗(yàn)證等方法的復(fù)雜設(shè)計(jì),模糊測(cè)試具有簡單高效的特點(diǎn),而且是在運(yùn)行過程中測(cè)試,有助于挖掘出更深層的智能合約漏洞。
文獻(xiàn)[30]中設(shè)計(jì)并實(shí)現(xiàn)了第一個(gè)基于模糊測(cè)試的以太坊智能合約漏洞檢測(cè)工具ContractFuzzer,通過分析智能合約的應(yīng)用程序二進(jìn)制接口(Application Binary Interface,ABI)生成符合被測(cè)智能合約調(diào)用語法的輸入。在輸入用例生成過程中,該工具針對(duì)重入等7 個(gè)類型的智能合約漏洞按照固定大小輸入與非固定大小輸入兩類將用戶提供的輸入種子生成輸入。
后續(xù)學(xué)者在智能合約模糊測(cè)試領(lǐng)域的研究工作熱衷于提高模糊測(cè)試中測(cè)試用例的覆蓋率以提高漏洞檢測(cè)的精度。文獻(xiàn)[31]中提出一種基于屬性的智能合約測(cè)試工具Echidna,它利用了基于語法的模糊測(cè)試。Echidna 首先通過智能合約靜態(tài)分析框架編譯合約并進(jìn)行分析,確定直接處理ETH 的常量和函數(shù);然后基于得到的常量、事務(wù)與函數(shù)生成的隨機(jī)交易進(jìn)行模糊測(cè)試。文獻(xiàn)[32]中提出名為sFuzz 的方法,該方法基于傳統(tǒng)工具AFL,采用反饋?zhàn)赃m應(yīng)模糊策略并考慮將區(qū)塊編號(hào)和時(shí)間戳建模為環(huán)境信息,以提高路徑覆蓋率。文獻(xiàn)[33]中結(jié)合深度學(xué)習(xí)在學(xué)習(xí)階段通過神經(jīng)網(wǎng)絡(luò)對(duì)運(yùn)行符號(hào)執(zhí)行所獲得的交易序列進(jìn)行訓(xùn)練,但也增加了學(xué)習(xí)階段的開銷。文獻(xiàn)[34]中提出了一個(gè)用于智能合約的混合模糊測(cè)試器ConFuzzius,結(jié)合了進(jìn)化模糊測(cè)試和約束求解,能執(zhí)行更多的智能合約代碼并找出更多的bug。進(jìn)化模糊測(cè)試用于測(cè)試智能合約的淺層邏輯,約束求解用于生成可以滿足復(fù)雜條件的輸入,從而得到更深入的測(cè)試路徑,而且ConFuzzius 使用數(shù)據(jù)依賴分析高效地生成交易序列,以找出可能存在bug 的特定的合約狀態(tài)。
另外,也有越來越多的學(xué)者致力于研究效率和覆蓋率平衡的智能合約模糊測(cè)試方法。文獻(xiàn)[35]中通過污點(diǎn)分析指導(dǎo)交易序列的生成,排除候選測(cè)試對(duì)象,從而實(shí)現(xiàn)最小化搜索空間并提高模糊測(cè)試過程效率的目的。文獻(xiàn)[36]中提出一種用于智能合約漏洞挖掘的灰盒模糊測(cè)試方法Harvey,它在兼顧灰盒模糊測(cè)試方法輕量級(jí)特點(diǎn)的同時(shí)通過基于預(yù)測(cè)輸入和基于需求驅(qū)動(dòng)的模糊序列的方式以提高覆蓋率。
雖然已經(jīng)有如第3 章所示的各類方法致力于檢測(cè)出智能合約的錯(cuò)誤,以太坊社區(qū)也已經(jīng)發(fā)布了許多安全編程建議與指南[37-39],但一旦智能合約部署在區(qū)塊鏈上,區(qū)塊鏈系統(tǒng)就認(rèn)為它的代碼不可改變,因此需要漏洞自動(dòng)修復(fù)技術(shù)以升級(jí)部署無錯(cuò)誤的指南合約,否則,智能合約安全審計(jì)方法反而會(huì)增加攻擊者利用合約漏洞的可能性。
對(duì)于智能合約升級(jí)部署問題,以太坊社區(qū)已經(jīng)探索了幾種設(shè)計(jì)模式來支持可升級(jí)的智能合約[40-43]。其中,最簡單的方法是將修補(bǔ)后的合約部署在新地址,并將原始合約的狀態(tài)遷移到該地址。但這一過程要求合約開發(fā)者訪問舊合約的所有內(nèi)部狀態(tài)以及新合約中接受狀態(tài)轉(zhuǎn)移的程序,增加了開發(fā)者的工作量。為避免狀態(tài)遷移,合約修復(fù)與升級(jí)還可以由開發(fā)者使用新的合約作為數(shù)據(jù)存儲(chǔ)合約(也稱為永恒存儲(chǔ)模式)來實(shí)現(xiàn),但是這會(huì)增加外部調(diào)用帶來的額外的Gas 開銷問題。一種更實(shí)用的策略是使用委托調(diào)用代理模式編寫合約。在該模式下,一個(gè)智能合約被拆分為兩個(gè)不同的合約:1)代理合約,持有所有資金和所有內(nèi)部狀態(tài),但不實(shí)現(xiàn)任何業(yè)務(wù)邏輯,它是所有用戶交易的接入點(diǎn),具有不可變的代碼與合約地址。2)邏輯合約,包含管理合約動(dòng)作的實(shí)際代碼。代理合約使用DELEGATECALL 指令將所有函數(shù)調(diào)用轉(zhuǎn)發(fā)到注冊(cè)的邏輯合約。該指令用于授予邏輯合約訪問代理合約中存儲(chǔ)的所有內(nèi)部狀態(tài)和資金的權(quán)限。當(dāng)智能合約升級(jí)時(shí),首先需要部署一個(gè)新的邏輯合約,并在代理合約中更新相應(yīng)地址;然后,代理合約將所有未來的交易轉(zhuǎn)發(fā)給修補(bǔ)后的邏輯合約。在這一部署升級(jí)合約的過程中不需要任何數(shù)據(jù)遷移,因?yàn)樗袛?shù)據(jù)都存儲(chǔ)在不可變代理合約中,并且,由于合約地址保持不變,用戶對(duì)升級(jí)過程也是可見的。
由于區(qū)塊鏈系統(tǒng)的分布式特性,智能合約數(shù)量始終在線增長,合約升級(jí)模式又要求確保版本兼容,因此修補(bǔ)智能合約錯(cuò)誤是一個(gè)耗時(shí)、繁瑣的過程,對(duì)自動(dòng)化的智能合約字節(jié)碼重寫技術(shù)研究成為了一項(xiàng)重要且具有實(shí)際意義的工作。
文獻(xiàn)[44]中提出了智能合約字節(jié)碼修復(fù)系統(tǒng)SMARTSHIELD,該系統(tǒng)的工作流程如圖9 所示。該系統(tǒng)的工作流程主要包含以下2 部分:1)語義提取。首先分析每個(gè)智能合約的抽象語法樹(Abstract Syntax Tree,AST)和未修正的EVM 字節(jié)碼,以提取字節(jié)碼級(jí)語義信息。2)合約修正。基于提取的字節(jié)碼級(jí)語義信息通過控制流轉(zhuǎn)換和DataGuard插入來修正不安全的控制流和數(shù)據(jù)操作,最后,生成修正后的EVM 字節(jié)碼并向開發(fā)人員發(fā)送一份修正報(bào)告。
圖9 SMARTSHIELD工作流程Fig.9 Workflow of SMARTSHIELD
SMARTSHIELD 主要分析與修正了3 種典型的不安全代碼模式:1)狀態(tài)變量(存儲(chǔ)在存儲(chǔ)器中的變量)在外部函數(shù)調(diào)用之后被更新,該系統(tǒng)將所有狀態(tài)更改移至外部函數(shù)調(diào)用的前面來對(duì)它進(jìn)行修正。2)在不事先檢測(cè)數(shù)據(jù)有效性的情況下,執(zhí)行算術(shù)語句。該系統(tǒng)通過將邊界檢查插入到算術(shù)運(yùn)算中對(duì)它進(jìn)行修正。3)在調(diào)用外部合約中的函數(shù)或發(fā)送以太幣后不檢查返回值,該系統(tǒng)在外部函數(shù)調(diào)用后,插入有效性檢查來確保調(diào)用函數(shù)的返回值并進(jìn)行修正。
由于SMARTSHIELD 在語義提取階段需要完整的控制流圖(Control Flow Graph,CFG)來更新跳轉(zhuǎn)目標(biāo)和數(shù)據(jù)引用,使這一修復(fù)策略不能很好地?cái)U(kuò)展到更大更復(fù)雜的合約中。相較之下,文獻(xiàn)[45]中提出的EVMPatch 框架基于跳板(Trampoline)的重寫策略不需要精確的CFG,在重寫復(fù)雜合約時(shí)具有更好的可擴(kuò)展性。EVMPatch 框架如圖10 所示,主要由以下組件組成:1)由自動(dòng)分析工具和公開漏洞披露組成的漏洞檢測(cè)引擎;2)將補(bǔ)丁應(yīng)用到合約的字節(jié)碼重寫器;3)驗(yàn)證先前交易補(bǔ)丁的補(bǔ)丁測(cè)試機(jī)制;4)上傳合約補(bǔ)丁版本的合約部署組件。
圖10 EVMPatch框架Fig.10 Framework of EVMPatch
在字節(jié)碼重寫器中,基于Trampoline 的方法將新的EVM指令添加到空白代碼區(qū)域,從而在新合約代碼插入合約地址時(shí),可以保留或更新智能合約的代碼地址空間中對(duì)任何代碼或數(shù)據(jù)的所有基于地址的引用空間。并且該方法考慮了EVM 在代碼地址空間中強(qiáng)制對(duì)代碼和數(shù)據(jù)進(jìn)行分隔,突出了EVM 字節(jié)碼重寫器的特殊性,以達(dá)到更適用于智能合約字節(jié)碼生成的目的。
智能合約的安全問題研究吸引了學(xué)術(shù)界和產(chǎn)業(yè)界的共同關(guān)注。隨著區(qū)塊鏈技術(shù)與平臺(tái)的快速發(fā)展,智能合約的應(yīng)用越來越廣泛,其中的漏洞挖掘與自動(dòng)修復(fù)技術(shù)面臨著在線、多平臺(tái)、自動(dòng)化與智能化的挑戰(zhàn)。
挑戰(zhàn)1:多區(qū)塊鏈平臺(tái)智能合約漏洞挖掘與安全增強(qiáng)。
隨著支持智能合約功能的區(qū)塊鏈平臺(tái)的迅速發(fā)展,智能合約在這些平臺(tái)上也暴露出一些令人矚目的漏洞,越來越多的研究開始關(guān)注這些非以太坊智能合約的漏洞挖掘工作。文獻(xiàn)[46]中關(guān)注最具代表性的采用委托權(quán)益證明(Delegated Proof of Stake,DPoS)共識(shí)機(jī)制的區(qū)塊鏈項(xiàng)目Enterprise Operation System(EOSIO),基于符號(hào)執(zhí)行技術(shù)識(shí)別出EOSIO 智能合約中4 個(gè)最流行的漏洞的存在,并確定了48次擴(kuò)展中的攻擊(其中27 次已被開發(fā)人員確認(rèn)),這些攻擊已導(dǎo)致至少170 萬美元的經(jīng)濟(jì)損失。文獻(xiàn)[47]中則通過模糊測(cè)試技術(shù)對(duì)Hyperledger Fabric 這一聯(lián)盟鏈的合約漏洞進(jìn)行檢測(cè)。
上述工作的挑戰(zhàn)在于不同平臺(tái)的智能合約從虛擬機(jī)、合約字節(jié)碼到漏洞類型都不相同,因此現(xiàn)有的對(duì)以太坊智能合約的安全審計(jì)技術(shù)并不能直接應(yīng)用于這些平臺(tái),例如EOSIO虛擬機(jī)支持的浮點(diǎn)運(yùn)算、類型轉(zhuǎn)換等指令在EVM 上不支持,并且EOSIO 智能合約還具有不開源的特點(diǎn)與挑戰(zhàn)。因此未來的研究工作中在對(duì)這些非以太坊智能合約漏洞進(jìn)行檢測(cè)時(shí)需要更多地考慮這些區(qū)塊鏈平臺(tái)具有的特點(diǎn)。另外,由于在聯(lián)盟鏈等許可鏈場景下,區(qū)別于以太坊區(qū)塊鏈節(jié)點(diǎn)可以隨意加入,智能合約往往運(yùn)行在“授權(quán)”的區(qū)塊鏈節(jié)點(diǎn)上,因此對(duì)這類智能合約進(jìn)行安全增強(qiáng)時(shí),一種可行的方案是采用可信計(jì)算技術(shù)來保障智能合約運(yùn)行環(huán)境以及在上鏈過程中數(shù)據(jù)傳輸?shù)陌踩煽?。考慮到可信計(jì)算環(huán)境的構(gòu)建會(huì)損害區(qū)塊鏈的去中心化特性,現(xiàn)有研究僅利用可信執(zhí)行環(huán)境技術(shù)以保障以太坊智能合約運(yùn)行過程中的數(shù)據(jù)隱私性[48-51],但針對(duì)聯(lián)盟鏈等去中心化程度相對(duì)較低的許可鏈場景,對(duì)其智能合約的運(yùn)行節(jié)點(diǎn)進(jìn)行可信防護(hù)則很有意義與價(jià)值。
挑戰(zhàn)2:在線智能合約安全審計(jì)。
智能合約具有一經(jīng)部署不可變的特點(diǎn),區(qū)塊鏈平臺(tái)上的智能合約數(shù)量持續(xù)增加,如何高效、實(shí)時(shí)地檢測(cè)在線的智能合約近年來也吸引了學(xué)者們的關(guān)注。文獻(xiàn)[52]中提出了Sereum 技術(shù),利用污點(diǎn)分析保護(hù)現(xiàn)有的、已經(jīng)部署的具有可重入漏洞的智能合約以向后兼容的方式免受攻擊;而對(duì)于區(qū)塊鏈上易受攻擊的智能合約,特別是蜜罐類智能合約,文獻(xiàn)[53]中基于模式匹配實(shí)時(shí)恢復(fù)交易,但是并沒有透露具體的設(shè)計(jì)、實(shí)現(xiàn)和評(píng)估;文獻(xiàn)[54]中則提出了一種名為SODA 的更加兼具功能與效率的在線智能檢測(cè)框架,通過按需信息檢索以減少信息收集的開銷,并采用動(dòng)態(tài)鏈接來消除進(jìn)程間通信的開銷。在這些研究中,在線智能合約安全審計(jì)技術(shù)的挑戰(zhàn)在于對(duì)區(qū)塊鏈運(yùn)行時(shí)行為的要素建模與檢測(cè)效率的平衡,并且隨著智能合約漏洞類型的增多,需要考慮方法的可擴(kuò)展性。
挑戰(zhàn)3:智能化合約漏洞挖掘、利用與修復(fù)技術(shù)。
隨著深度學(xué)習(xí)的快速發(fā)展,越來越多的研究開始利用人工智能技術(shù)結(jié)合智能合約靜態(tài)代碼分析技術(shù)以完成合約代碼注釋[55-56]、安全審計(jì)[57-59]等工作,尤其是文獻(xiàn)[59]中提出基于圖神經(jīng)網(wǎng)絡(luò)的漏洞挖掘工作,明顯提升了檢測(cè)精度。這些方法通常基于智能合約抽象語法樹以及控制流圖來進(jìn)行語義知識(shí)的學(xué)習(xí)與訓(xùn)練,但存在一個(gè)較為普遍的問題:有標(biāo)簽的樣本數(shù)量較少?,F(xiàn)有的解決方法主要利用成熟的開源靜態(tài)代碼檢測(cè)器標(biāo)記是否存在漏洞;但這樣的方法仍存在檢測(cè)漏洞種類有限、難以發(fā)現(xiàn)新類型惡意智能合約、目標(biāo)泄露導(dǎo)致預(yù)測(cè)偏移等諸多問題。
針對(duì)這些問題與挑戰(zhàn),提出如圖11 所示的在線合約智能化安全檢測(cè)與自動(dòng)化修復(fù)升級(jí)框架,由虛擬機(jī)/Docker 層、異構(gòu)區(qū)塊鏈架構(gòu)層、可信計(jì)算層組成,結(jié)合合約代碼分析與區(qū)塊鏈情景分析兩個(gè)維度,并采用可信計(jì)算技術(shù)進(jìn)行異構(gòu)智能合約運(yùn)行環(huán)境的安全增強(qiáng),從而實(shí)現(xiàn)智能合約在線安全檢測(cè)與合約漏洞自動(dòng)化修復(fù)升級(jí)兩大功能,達(dá)到智能合約全生命周期的安全審計(jì)與可信防護(hù)的目的。
圖11 在線合約智能化安全檢測(cè)與自動(dòng)化修復(fù)升級(jí)框架Fig.11 Architecture of online contract intelligent security detection and automatic repair
該框架針對(duì)上述挑戰(zhàn),解決思路具體如下:
針對(duì)挑戰(zhàn)1,框架的整體架構(gòu)在可信計(jì)算層之上。可信計(jì)算層基于TrustZone、SGX(Software Guard eXtension)、Keystone 等異構(gòu)安全機(jī)制,可分別為許可鏈上的智能合約構(gòu)建可信的運(yùn)行環(huán)境,并且保障智能合約在修復(fù)升級(jí)中上鏈過程的傳輸安全;而對(duì)非許可區(qū)塊鏈上的智能合約,可為它的數(shù)據(jù)提供隱私保護(hù)。同時(shí),框架提取異構(gòu)區(qū)塊鏈下的智能合約的特征,考慮到在存儲(chǔ)機(jī)制、驗(yàn)證機(jī)制、共識(shí)機(jī)制等區(qū)塊鏈情景上的不同,框架提取共識(shí)驗(yàn)證特征、合約執(zhí)行流特征、交易輸入特征與存儲(chǔ)結(jié)構(gòu)特征,并針對(duì)不同智能合約以字節(jié)碼的形式讀取合約數(shù)據(jù),為接下來的數(shù)據(jù)分析作準(zhǔn)備。
針對(duì)挑戰(zhàn)2,框架從合約字節(jié)碼分析與區(qū)塊鏈情景分析兩個(gè)角度出發(fā):1)對(duì)于單個(gè)智能合約,采用輕量級(jí)符號(hào)執(zhí)行工具基于合約字節(jié)碼構(gòu)造控制流圖,得到合約內(nèi)函數(shù)調(diào)用關(guān)系等結(jié)構(gòu)信息,并利用自然語言處理(Natural Language Processing,NLP)方法中表示學(xué)習(xí)技術(shù)生成字節(jié)碼指令的語義信息。2)考慮智能合約構(gòu)建、存儲(chǔ)、執(zhí)行的全生命周期,分析智能合約安全威脅機(jī)理,借助機(jī)器學(xué)習(xí)算法對(duì)區(qū)塊鏈的異常結(jié)構(gòu)進(jìn)行分類,再利用知識(shí)圖譜方法進(jìn)一步分析智能合約之間在運(yùn)行時(shí)的交互關(guān)系與方式,從而得到智能合約行為信息。基于上述分析結(jié)果,進(jìn)一步基于圖神經(jīng)網(wǎng)絡(luò)進(jìn)行訓(xùn)練與預(yù)測(cè),從而實(shí)現(xiàn)區(qū)塊鏈智能合約在線安全檢測(cè)自動(dòng)化。
針對(duì)挑戰(zhàn)3,框架在現(xiàn)有基于圖神經(jīng)網(wǎng)絡(luò)檢測(cè)工作取得的良好精度的基礎(chǔ)上,從智能合約字節(jié)碼、交易歷史、執(zhí)行流及其他多元信息出發(fā),分析了合約操作碼和賬戶交易特征等區(qū)塊鏈情景,有助于提升神經(jīng)網(wǎng)絡(luò)模型泛化能力以及現(xiàn)有方案對(duì)未知類型漏洞智能合約的檢測(cè)能力。另外,在安全檢測(cè)功能模塊中,框架采用小樣本學(xué)習(xí)等更先進(jìn)的深度學(xué)習(xí)技術(shù)進(jìn)行數(shù)據(jù)增強(qiáng)從而解決數(shù)據(jù)不平衡的問題。
本文介紹了智能合約漏洞挖掘與自動(dòng)修復(fù)技術(shù)的研究現(xiàn)狀,重點(diǎn)介紹與分析了三類智能合約漏洞挖掘方法的研究趨勢(shì),并調(diào)研介紹了主流的智能合約升級(jí)方案以及較前沿的自動(dòng)修復(fù)技術(shù)實(shí)現(xiàn)框架與思路。在總結(jié)這些關(guān)鍵技術(shù)的基礎(chǔ)上分析了未來的三個(gè)重要的發(fā)展方向及所需解決的問題,并進(jìn)一步提出一種在線智能合約智能化安全檢測(cè)與自動(dòng)化修復(fù)升級(jí)框架,有助于未來研究工作應(yīng)對(duì)這些挑戰(zhàn)。