區(qū)塊鏈?zhǔn)钱?dāng)前炙手可熱的技術(shù),其不可篡改、不可偽造、不可抵賴、可追溯、無需第三方可信機(jī)構(gòu)、支持智能合約等特性,為包括醫(yī)療、物流、電商、金融、教育等行業(yè)賦能。近年來,區(qū)塊鏈安全尤其是區(qū)塊鏈智能合約安全事件層出不窮。因此,在線監(jiān)測區(qū)塊鏈安全威脅,并對安全威脅做出處置,具有重大研究意義和實(shí)用價(jià)值。深入研究智能合約運(yùn)行時(shí)信息獲取、智能合約虛擬機(jī)插樁等技術(shù),提出了一種針對區(qū)塊鏈安全威脅的實(shí)時(shí)防御框架,并利用該框架,以重入攻擊、整數(shù)溢出攻擊為威脅示例開展防御邏輯分析,以期能對該框架的應(yīng)用提供思路。
區(qū)塊鏈?zhǔn)钱?dāng)前炙手可熱的技術(shù),其不可篡改、不可偽造、不可抵賴、可追溯、無需第三方可信機(jī)構(gòu)、支持智能合約等特性,為包括醫(yī)療、物流、電商、金融、教育等行業(yè)賦能。然而,作為各種分布式應(yīng)用(Decentralized Application,DApp)的底層技術(shù),區(qū)塊鏈本身的安全性將從根本上決定上層分布式應(yīng)用的安全性、可用性以及性能。
區(qū)塊鏈部署于互聯(lián)網(wǎng)中,而互聯(lián)網(wǎng)存在著各種網(wǎng)絡(luò)威脅。尤其是區(qū)塊鏈及其上的分布式應(yīng)用涉及到大量的金錢,區(qū)塊鏈成為黑客的一個(gè)重要攻擊目標(biāo)。近年來,區(qū)塊鏈安全事件層出不窮,從底層P2P網(wǎng)絡(luò)、中間層虛擬機(jī)到上層的智能合約,都成為黑客們攻擊的對象。下面列舉一些區(qū)塊鏈威脅的例子。
Marcus等人發(fā)現(xiàn)以太坊P2P網(wǎng)絡(luò)節(jié)點(diǎn)發(fā)現(xiàn)機(jī)制的缺陷,利用該缺陷實(shí)現(xiàn)了日蝕攻擊,導(dǎo)致被攻擊節(jié)點(diǎn)被隔絕等。由于以太坊虛擬機(jī)沒有校驗(yàn)地址的位數(shù),并自動(dòng)補(bǔ)齊缺失的位,將會(huì)導(dǎo)致短地址攻擊,黑客可以利用該虛擬機(jī)漏洞盜取各種代幣。
智能合約的漏洞更是層出不窮,其中最著名的是2016年發(fā)生的TheDAO合約重入漏洞攻擊。TheDAO合約通過眾籌,在合約中存儲了價(jià)值數(shù)千萬美元的以太幣。黑客利用合約的重入漏洞,盜取了高達(dá)6千萬美元的以太幣,并導(dǎo)致以太坊分叉為了ETH和ETC。2018年以來,多款代幣合約被爆發(fā)現(xiàn)整數(shù)溢出漏洞,黑客利用這些漏洞發(fā)動(dòng)了整數(shù)溢出攻擊,導(dǎo)致了大量代幣被盜。
區(qū)塊鏈的安全威脅已經(jīng)成為制約區(qū)塊鏈未來發(fā)展的關(guān)鍵問題,因此如何在安全威脅進(jìn)行在線檢測,并實(shí)時(shí)對安全威脅做出處置,具有重大的研究意義和實(shí)用價(jià)值。
本文以智能合約運(yùn)行時(shí)信息獲取、智能合約虛擬機(jī)插樁、安全威脅檢測技術(shù)為基礎(chǔ),提出了一種區(qū)塊鏈安全威脅實(shí)時(shí)防御框架,并基于重入攻擊、整數(shù)溢出攻擊討論該框架的應(yīng)用邏輯,為該框架在區(qū)塊鏈安全威脅防護(hù)研究和實(shí)踐提供參考思路。
1 區(qū)塊鏈安全威脅分析
1.1 區(qū)塊鏈層次結(jié)構(gòu)
以以太坊(Ethereum)為例,區(qū)塊鏈結(jié)構(gòu)主要包含應(yīng)用層、數(shù)據(jù)層、共識層以及網(wǎng)絡(luò)層4層,如圖1所示。
網(wǎng)絡(luò)層,區(qū)塊鏈采用對等(Peer-to-Peer)網(wǎng)絡(luò)技術(shù)組織各個(gè)節(jié)點(diǎn),主要包括節(jié)點(diǎn)發(fā)現(xiàn)、傳播機(jī)制和驗(yàn)證機(jī)制。
共識層,主要包含共識機(jī)制和激勵(lì)機(jī)制。共識機(jī)制是用來維護(hù)區(qū)塊鏈中對等節(jié)點(diǎn)間達(dá)成一致的策略和方法。典型的共識機(jī)制包括工作量證明(Proof of Work,PoW)、權(quán)益證明(Proof of Stake,PoS)和股份授權(quán)證明(Delegate Proof ofStake,DPoS)等;激勵(lì)機(jī)制主要包括發(fā)型機(jī)制和分配機(jī)制,通過引入獎(jiǎng)勵(lì)和懲罰來引導(dǎo)區(qū)塊鏈節(jié)點(diǎn)遵循規(guī)則,實(shí)現(xiàn)區(qū)塊鏈系統(tǒng)的良性運(yùn)行。
數(shù)據(jù)層,主要包括數(shù)據(jù)區(qū)塊、交易以及事件,包含區(qū)塊鏈中的各種數(shù)據(jù)結(jié)構(gòu)。
應(yīng)用層,包括賬戶、智能合約以及運(yùn)行智能合約的虛擬機(jī)(Environment VirtualMachine,EVM)。智能合約的出現(xiàn),為區(qū)塊鏈提供了可編程特性。通過編程的方式設(shè)計(jì)智能合約,預(yù)先定義特定行為和觸發(fā)的狀態(tài),從而實(shí)現(xiàn)在沒有第三方的情況下,智能合約達(dá)到觸發(fā)條件就自動(dòng)執(zhí)行。
1.2 基于區(qū)塊鏈層次結(jié)構(gòu)的威脅分析
根據(jù)區(qū)塊鏈層次結(jié)構(gòu),區(qū)塊鏈安全威脅主要分為網(wǎng)絡(luò)層安全威脅、共識層安全威脅、數(shù)據(jù)層安全威脅以及應(yīng)用層安全威脅。
網(wǎng)絡(luò)層安全威脅。因?yàn)閰^(qū)塊鏈網(wǎng)絡(luò)結(jié)構(gòu)為對等網(wǎng)絡(luò),因此P2P網(wǎng)絡(luò)面臨的安全威脅也會(huì)對區(qū)塊鏈網(wǎng)絡(luò)層造成安全威脅。這些攻擊包括拒絕服務(wù)攻擊、日蝕攻擊等。此外,RPC API漏洞暴露可能導(dǎo)致賬戶劫持攻擊。
共識層算法安全威脅。它主要對共識機(jī)制發(fā)起攻擊,控制區(qū)塊鏈按照對攻擊者有利的方向發(fā)展。目前主要的共識層攻擊有51%攻擊、自私挖礦攻擊、女巫攻擊等。
數(shù)據(jù)層安全威脅。由于區(qū)塊鏈的公開、不可篡改、分布等特性,容易導(dǎo)致數(shù)據(jù)層遭受隱私泄露、惡意信息傳播等攻擊。
應(yīng)用層安全威脅。它包括針對虛擬機(jī)、智能合約及其他攻擊。虛擬機(jī)沒有校驗(yàn)地址的位數(shù),將會(huì)導(dǎo)致短地址攻擊。智能合約的攻擊包括重入攻擊、整數(shù)溢出攻擊等。其他攻擊則包括面向應(yīng)用提供接口的攻擊、Parity多重簽名錢包攻擊等。
應(yīng)用層安全威脅種類多樣,且已經(jīng)暴露出來的針對應(yīng)用層的安全威脅直接造成了巨大的經(jīng)濟(jì)損失,因此本文聚焦于對應(yīng)用層攻擊的防御框架的研究。
2 區(qū)塊鏈信息獲取方法研究
區(qū)塊鏈信息是進(jìn)行實(shí)時(shí)防御的核心要素,目前在區(qū)塊鏈信息獲取領(lǐng)域已有大量研究。這些研究主要可以將獲取方法分為4類:下載與區(qū)塊文件解析、調(diào)用Web3 API、爬取區(qū)塊鏈瀏覽器以及插樁區(qū)塊鏈節(jié)點(diǎn)。下面將對這4種方法進(jìn)一步展開描述。
2.1 下載與區(qū)塊文件解析
區(qū)塊鏈節(jié)點(diǎn)在同步過程中會(huì)從其他節(jié)點(diǎn)下載區(qū)塊文件,所以可以通過解析區(qū)塊文件獲得區(qū)塊鏈信息。Kiffer等人采用這種方法獲取數(shù)據(jù),用以研究以太坊的硬分叉。MAIAN是一款智能合約安全漏洞自動(dòng)化發(fā)掘工具,該工作也通過此方法獲得智能合約字節(jié)碼用以漏洞發(fā)掘。
2.2 調(diào)用Web3 API
以太坊提供了一套API,用戶可以通過調(diào)用這些API獲取區(qū)塊鏈信息。文獻(xiàn)[10]中開發(fā)的欠優(yōu)化智能合約檢測系統(tǒng)即是調(diào)用API,web3.eth.getCode()獲取智能合約字節(jié)碼。文獻(xiàn)[11]是調(diào)用API,debug.traceTransaction()獲取智能合約的執(zhí)行軌跡,用以計(jì)算虛擬機(jī)操作碼的執(zhí)行次數(shù)。Bartoletti等人設(shè)計(jì)了一款針對比特幣和以太坊的數(shù)據(jù)搜集框架,也是通過調(diào)用比特幣節(jié)點(diǎn)和以太坊節(jié)點(diǎn)提供的API實(shí)現(xiàn)的。EtherQL通過調(diào)用以太坊節(jié)點(diǎn)名為EthereumJ提供的API來獲取數(shù)據(jù)。
2.3 爬取區(qū)塊鏈瀏覽器
區(qū)塊鏈瀏覽器如Etherscan向網(wǎng)站訪問者展示區(qū)塊鏈數(shù)據(jù),因此可以通過爬取區(qū)塊鏈瀏覽器的網(wǎng)頁獲取數(shù)據(jù)。ZEUS通過這種方式爬取智能合約源代碼并基于形式化分析檢測合約漏洞。兩份最新的研究也是通過爬取Etherscan、Etherchain和EtherCamp獲取智能合約字節(jié)碼,然后檢測智能合約中的旁氏合約。Huang等人爬取數(shù)據(jù)用于估計(jì)挖礦和投資收益。Bartoletti等人基于兩個(gè)數(shù)據(jù)集對智能合約進(jìn)行統(tǒng)計(jì)分析,這兩個(gè)數(shù)據(jù)集分別來自于以太坊區(qū)塊鏈瀏覽器和比特幣區(qū)塊文件。
2.4 插樁區(qū)塊鏈節(jié)點(diǎn)
區(qū)塊鏈節(jié)點(diǎn)同步區(qū)塊重放所有的交易并在虛擬機(jī)中執(zhí)行智能合約,因此可以通過插樁區(qū)塊鏈節(jié)點(diǎn)獲取信息。文獻(xiàn)[19]插樁了節(jié)點(diǎn)Geth來獲取交易的發(fā)送者、接收者和交易金額用于復(fù)雜網(wǎng)絡(luò)的分析。Grossman通過這種方法獲取內(nèi)部交易信息與storage的運(yùn)行時(shí)信息,用以檢測智能合約的無回調(diào)對象。文獻(xiàn)[21]通過GasReducer的方法獲取智能合約執(zhí)行軌跡用于衡量GasReducer的優(yōu)化效果。
現(xiàn)存的技術(shù)或多或少存在以下3個(gè)問題:數(shù)據(jù)獲取不完整、數(shù)據(jù)信息混淆以及數(shù)據(jù)獲取效率低。文獻(xiàn)[22]研究設(shè)計(jì)了一款區(qū)塊鏈數(shù)據(jù)搜集框架,名為DataEther,解決了上述問題。因此,本項(xiàng)目沿用DataEther的方法獲取區(qū)塊鏈數(shù)據(jù),從而為本文的區(qū)塊鏈安全威脅實(shí)時(shí)防御框架提供數(shù)據(jù)基礎(chǔ)。
3 區(qū)塊鏈安全威脅實(shí)時(shí)防御框架
3.1 設(shè)計(jì)目標(biāo)
研究高擴(kuò)展的區(qū)塊鏈安全威脅實(shí)時(shí)防御框架,圍繞以下幾個(gè)目標(biāo)開展對防御框架的設(shè)計(jì):
(1)獲取完備的智能合約執(zhí)行信息;
(2)設(shè)計(jì)可擴(kuò)展框架,允許在不修改虛擬機(jī)的前提下,檢測新類型的安全問題;
(3)基于設(shè)計(jì)框架討論對實(shí)際攻擊的應(yīng)用邏輯。
3.2 安全框架設(shè)計(jì)
區(qū)塊鏈安全威脅實(shí)時(shí)防御框架如圖2所示,由基于智能合約虛擬機(jī)的插樁點(diǎn)、區(qū)塊鏈信息獲取模塊、威脅檢測模塊以及安全威脅處置模塊組成。它主要實(shí)現(xiàn)的功能包括智能合約運(yùn)行時(shí)信息獲取、威脅檢測以及安全威脅處置。
3.2.1 智能合約運(yùn)行時(shí)信息獲取
本文設(shè)計(jì)通過對智能合約虛擬機(jī)進(jìn)行插樁來實(shí)現(xiàn)對智能合約運(yùn)行時(shí)信息的完備提取。智合約運(yùn)行時(shí)信息獲取的詳細(xì)設(shè)計(jì)見3.3節(jié)。區(qū)塊鏈信息獲取模塊收集智能合約虛擬機(jī)插樁點(diǎn)采集數(shù)據(jù),并將數(shù)據(jù)傳遞到監(jiān)測模塊中的威脅檢測中間件做威脅檢測。
3.2.2 威脅檢測
威脅檢測主要的執(zhí)行單元是威脅檢測模塊。威脅檢測模塊由威脅檢測中間件和可擴(kuò)展檢測算法庫構(gòu)成。
威脅檢測中間件實(shí)現(xiàn)對可擴(kuò)展檢測算法庫中檢測算法的注冊、調(diào)度和卸載,實(shí)現(xiàn)智能合約運(yùn)行時(shí)信息從區(qū)塊鏈信息獲取模塊到檢測算法的數(shù)據(jù)傳遞,實(shí)現(xiàn)將威脅檢測結(jié)果發(fā)送到安全威脅處置模塊。
可擴(kuò)展檢測算法庫由多個(gè)檢測算法組成,算法庫自身是可縮減可擴(kuò)展的彈性架構(gòu)。根據(jù)檢測需要,通過威脅檢測中間件,注冊添加新的檢測算法。注冊檢測算法的同時(shí),將算法所需的數(shù)據(jù)信息事件注冊威脅檢測中間件,威脅檢測中間件將所需的信息事件內(nèi)容通知到區(qū)塊鏈信息獲取模塊,信息獲取模塊根據(jù)事件需求將插樁點(diǎn)采集到的智能合約運(yùn)行時(shí)信息處理后上傳到威脅檢測中間件。
詳細(xì)的事件通知設(shè)計(jì)見3.4節(jié)。檢測算法根據(jù)威脅檢測中間件提供的數(shù)據(jù)實(shí)現(xiàn)威脅檢測,并將結(jié)果傳遞回威脅檢測中間件。檢測算法庫中,檢測算法的生命周期包括注冊、更新、卸載以及使用調(diào)度。這些生命周期管理都在威脅檢測中間件完成。
3.2.3 安全威脅處置
安全威脅處置模塊收到威脅中間件發(fā)出的威脅檢測結(jié)果,根據(jù)結(jié)果情況提供不同的安全威脅處置。安全威脅處置跟進(jìn)一步的設(shè)計(jì)見3.5節(jié)。
3.3 智能合約運(yùn)行時(shí)信息獲取
智能合約運(yùn)行時(shí)信息獲取是為檢測智能合約安全問題做準(zhǔn)備,其中的關(guān)鍵點(diǎn)是保障運(yùn)行時(shí)信息的完備性。考慮到未來可能會(huì)出現(xiàn)新種類的安全威脅,所以采集部分運(yùn)行時(shí)的信息是不可取的。本文對合約執(zhí)行的兩個(gè)階段進(jìn)行插樁,從而確保信息獲取的完備性。
第一階段,外部交易提交階段。由于智能合約執(zhí)行必須由外部交易觸發(fā),所以對外部交易提交階段插樁,能夠準(zhǔn)確得知智能合約的初始執(zhí)行信息,包括交易hash、交易發(fā)送方、智能合約地址、以太幣數(shù)量、汽油上限、汽油定價(jià)、調(diào)用的函數(shù)ID、函數(shù)參數(shù)以及創(chuàng)建的合約字節(jié)碼等。
第二階段,智能合約解釋執(zhí)行階段。虛擬機(jī)內(nèi)建了一個(gè)解釋執(zhí)行器對智能合約進(jìn)行解釋執(zhí)行,因此本文對解釋執(zhí)行器插樁能夠獲得每一條字節(jié)碼的執(zhí)行情況。
智能合約包含超過130種字節(jié)碼,而針對每一種字節(jié)碼,解釋執(zhí)行器都提供了一個(gè)對應(yīng)的解釋執(zhí)行例程。因此,本文將對所有的解釋執(zhí)行例程插樁,獲取的信息包括讀/寫的棧(stack)內(nèi)容、讀/寫的存儲器(memory)內(nèi)容、讀/寫的倉庫(storage)內(nèi)容。除此以外,本文將對以下6種字節(jié)碼的解釋執(zhí)行例程進(jìn)行特別插樁處理,因?yàn)檫@6種字節(jié)碼會(huì)產(chǎn)生內(nèi)部交易。
CREATE:用于創(chuàng)建新合約,因此本文將額外獲取被創(chuàng)建合約的字節(jié)碼和合約地址。
CALL/CALLCODE/DELEGATECALL/STATICCALL:用于調(diào)用合約,因此本文將額外獲取被調(diào)用合約的字節(jié)碼、被調(diào)函數(shù)ID、調(diào)用參數(shù)以及汽油限制。
SELFDESTRUCT:用于銷毀合約,因此本文將額外獲取合約被銷毀時(shí)殘留的以太幣和以太幣的接收合約地址。
此外,本文介紹的方法還將記錄智能合約運(yùn)行時(shí)的環(huán)境信息,包括區(qū)塊高度、挖礦難度和時(shí)間戳等。
插樁代碼和虛擬機(jī)原本代碼共享計(jì)算資源,因此插樁代碼的執(zhí)行會(huì)帶來運(yùn)行時(shí)開銷(runtime overhead)。除了采集信息的完備性,本文提出一種按需(on-demand)的虛擬機(jī)插樁方法,降低了運(yùn)行時(shí)開銷。這種按需插樁的基本思路并不在一開始就將所有的插樁點(diǎn)全部插樁,而是根據(jù)用戶編寫的檢測程序注冊的事件通知,在需要的位置插樁。
3.4 事件通知
用戶在編寫檢測程序時(shí),需要注冊事件處理例程,只有注冊后才會(huì)收到相應(yīng)的事件通知。為了確保檢測程序能夠接收到完整的智能合約運(yùn)行時(shí)信息,實(shí)現(xiàn)字節(jié)碼級的檢測,本文提供了兩類事件通知。
(1)交易執(zhí)行TransApply(INFO):當(dāng)外部交易或內(nèi)部交易執(zhí)行時(shí)生成此事件,檢測程序?qū)⒌玫浇灰姿行畔⒑铜h(huán)境信息。
(2)字節(jié)碼執(zhí)行ExeOp(INFO):每一條字節(jié)碼執(zhí)行時(shí)都將生成此事件,檢測程序?qū)⒌玫皆撟止?jié)碼的運(yùn)行時(shí)信息和環(huán)境信息。
雖然通過上面兩種事件通知,檢測程序能夠獲得完整的智能合約運(yùn)行時(shí)信息,但兩種事件可能過于底層,需要用戶對虛擬機(jī)有較強(qiáng)的掌握。為了降低用戶的使用難度,本文定義如下具有一定語義的事件。
(1)合約創(chuàng)建ContractCreate(INFO):當(dāng)合約創(chuàng)建時(shí)生成此事件,檢測程序?qū)⒌玫胶霞s創(chuàng)建時(shí)所有的運(yùn)行時(shí)信息,包括被創(chuàng)建合約的字節(jié)碼和環(huán)境信息。
(2)合約調(diào)用ContractInvoke(INFO):當(dāng)合約調(diào)用時(shí)生成此事件,檢測程序?qū)⒌玫胶霞s調(diào)用時(shí)所有的運(yùn)行時(shí)信息,包括被調(diào)用合約的字節(jié)碼和環(huán)境信息。
(3)合約銷毀ContractDestruct(INFO):當(dāng)合約調(diào)用時(shí)生成此事件,檢測程序?qū)⒌玫奖讳N毀合約地址、殘留以太幣數(shù)量、接收殘留以太幣的賬戶以及環(huán)境信息。
(4)基本塊執(zhí)行ExeBB(INFO):每個(gè)基本塊第一條字節(jié)碼執(zhí)行時(shí)生成此事件,檢測程序?qū)⒌玫交緣K第一條字節(jié)碼地址和環(huán)境信息。
(5)算數(shù)操作被執(zhí)行ExeArith(INFO):當(dāng)算數(shù)操作被執(zhí)行時(shí)生成此事件,檢測程序?qū)⒌玫皆撍銛?shù)操作的運(yùn)行時(shí)信息和環(huán)境信息。
(6)位操作被執(zhí)行ExeBit(INFO):當(dāng)位操作被執(zhí)行時(shí)生成此事件,檢測程序?qū)⒌玫皆撐徊僮鞯倪\(yùn)行時(shí)信息和環(huán)境信息。
(7)跳轉(zhuǎn)操作被執(zhí)行ExeJump(INFO):當(dāng)跳轉(zhuǎn)操作被執(zhí)行時(shí)生成此事件,檢測程序?qū)⒌玫皆撎D(zhuǎn)操作的運(yùn)行時(shí)信息,包括跳轉(zhuǎn)目標(biāo),以及環(huán)境信息。
(8)日志產(chǎn)生LogProduce(INFO):智能合約通過記錄日志向區(qū)塊鏈外發(fā)送信息,當(dāng)日志產(chǎn)生時(shí)生成此事件,檢測程序?qū)⒌玫饺罩拘畔⒁约碍h(huán)境信息。
3.5 安全威脅處置
當(dāng)檢測程序檢測到安全威脅時(shí),需要處理安全威脅。由于智能合約在虛擬機(jī)內(nèi)運(yùn)行,而檢測程序在虛擬機(jī)外,因此本文擬修改虛擬機(jī),在虛擬機(jī)中內(nèi)建多個(gè)威脅處理模塊。檢測檢測程序檢測到威脅后,給虛擬機(jī)的威脅處理模塊發(fā)送命令,執(zhí)行用戶指定的處理措施。常見的威脅處理措施包括中止當(dāng)前智能合約的執(zhí)行、禁止調(diào)用危險(xiǎn)合約以及禁止創(chuàng)建惡意合約。
4 基于實(shí)時(shí)防御框架的防御示范
基于本文提出的區(qū)塊鏈安全威脅實(shí)時(shí)防御框架,以整數(shù)溢出攻擊和重入攻擊作為典型攻擊,示范討論該框架的防護(hù)邏輯,以期對區(qū)塊鏈實(shí)時(shí)防御框架的進(jìn)一步研究及應(yīng)用提供參考思路。
4.1 重入攻擊檢測
4.1.1 威脅描述
若智能合約A存在重入漏洞,則A在執(zhí)行過程中會(huì)調(diào)用合約B,而合約B又會(huì)調(diào)用合約A,形成一個(gè)調(diào)用環(huán)。若重入漏洞被攻擊者利用,可能引起嚴(yán)重的安全問題,尤其是當(dāng)該調(diào)用環(huán)在一次外部交易提交過程中被多次執(zhí)行時(shí)。例如:TheDAO合約存在重入漏洞,攻擊者攻擊該漏洞偷走了價(jià)值超過6千萬美元的以太幣[3]。這次安全事件也是造成以太坊分裂為ETH和ETC的直接原因。
4.1.2 檢測思路
檢測重入攻擊的基本思路是檢測外部交易是否使得合約調(diào)用出現(xiàn)環(huán)結(jié)構(gòu)。為了檢測調(diào)用環(huán),需要知道外部交易和內(nèi)部交易信息,所以檢測程序需要注冊交易執(zhí)行的事件通知TransApply,并在事件處理函數(shù)中實(shí)現(xiàn)檢測功能。下面首先給出重入攻擊的形式化定義,然后給出實(shí)時(shí)的重入攻擊檢測方案。首先定義一個(gè)結(jié)構(gòu),稱之為單交易圖OG,這是由一個(gè)外部交易引起的交易圖,是一個(gè)5元組數(shù)據(jù)。
(1)ACC,單個(gè)外部交易涉及的所有賬戶的集合。
(2)EOA,外部交易的調(diào)用者,EOA ACC。
(3)T,單個(gè)外部交易及其觸發(fā)的所有內(nèi)部交易的集合。
(4)N,自然數(shù)集合,表示T中各交易的相對順序,其中外部交易的順序?yàn)?。
(5),遷移函數(shù),,例如。
在一個(gè)單交易圖OG中,若存在一個(gè)賬戶使得,則認(rèn)為OG中出現(xiàn)了調(diào)用環(huán),可認(rèn)為該交易是重入攻擊。為了降低可能的誤報(bào),本方案允許用戶設(shè)置一個(gè)閾值,當(dāng)調(diào)用環(huán)執(zhí)行次數(shù)大于該閾值才認(rèn)為是重入攻擊。
本方法基于實(shí)時(shí)的調(diào)用環(huán)檢測,即當(dāng)調(diào)用環(huán)即將形成時(shí)檢測出調(diào)用環(huán),而不是外部交易完全執(zhí)行完后再檢測。本方法的優(yōu)勢在于可以在攻擊過程中予以檢測和阻斷;如果等外部交易完全執(zhí)行后再檢測,則一次攻擊已經(jīng)完成,無法做到及時(shí)阻斷,且可能造成誤報(bào)。下面基于圖2描述本方案的調(diào)用環(huán)檢測過程。
圖3中,一個(gè)外部賬戶EOA調(diào)用了合約A,A在執(zhí)行過程中陸續(xù)調(diào)用了其他5個(gè)合約。本例涉及一個(gè)外部交易(1)和8個(gè)內(nèi)部交易(2~9),交易的由圖中數(shù)字按從小到大的順序執(zhí)行。如果在外部交易提交完成后檢測調(diào)用環(huán),將會(huì)得到圖中3的調(diào)用圖。從圖3可以發(fā)現(xiàn)3個(gè)調(diào)用環(huán),分別為2→3→7、5→6→7和8→9→7。但是,由于交易執(zhí)行存在順序,所以只有5→6→7是真正的調(diào)用環(huán),其余兩個(gè)為誤報(bào)。
本方法設(shè)計(jì)的檢測程序注冊了交易執(zhí)行的事件通知,而事件的獲取是通過虛擬機(jī)插樁實(shí)現(xiàn)的,所以事件通知的順序完全按照交易執(zhí)行的順序。因此,事件處理例程的執(zhí)行順序也是按照交易執(zhí)行的順序,則本文提出的方法能夠獲知交易執(zhí)行順序。本文設(shè)計(jì)了交易表用以檢測調(diào)用環(huán),如圖4所示。
發(fā)送者集合表示某外部交易執(zhí)行過程中所有出現(xiàn)的發(fā)送者;接收者表示當(dāng)前(外部或內(nèi)部)交易的接收者。交易表按照交易執(zhí)行順序從上到下排列。當(dāng)有新的交易產(chǎn)生時(shí),檢測當(dāng)前交易的接收者是否出現(xiàn)在發(fā)送者集合中。若出現(xiàn),說明合約執(zhí)行出現(xiàn)了調(diào)用環(huán),本方法繼而回溯到目前為止的交易,匹配交易的發(fā)送者和接收者,直到形成閉環(huán)。以圖3為例,當(dāng)交易7執(zhí)行時(shí),本方法檢測到調(diào)用環(huán),因此在交易8和交易9產(chǎn)生前即可實(shí)時(shí)采取應(yīng)對措施。
4.2 整數(shù)溢出攻擊檢測
4.2.1 威脅描述
整數(shù)溢出是智能合約的一類出現(xiàn)頻率很高的安全問題,可能導(dǎo)致嚴(yán)重的后果,尤其是各種代幣被盜。2018年4月的報(bào)道披露了8個(gè)存在整數(shù)溢出漏洞的代幣合約[4]。整數(shù)溢出是一類傳統(tǒng)的安全問題,在x86代碼中也普遍存在。但是,在區(qū)塊鏈智能合約領(lǐng)域中,整數(shù)溢出會(huì)帶來直接的經(jīng)濟(jì)損失,因此檢測整數(shù)溢出攻擊是保障區(qū)塊鏈安全的重要措施。
4.2.2 檢測思路
整數(shù)溢出由算數(shù)操作引起,所以檢測程序本應(yīng)注冊算數(shù)操作被執(zhí)行的事件ExeArith。當(dāng)事件處理例程被調(diào)用時(shí),將會(huì)收到算數(shù)操作的信息,包括算數(shù)操作類型和操作數(shù)。檢測算數(shù)操作是否會(huì)產(chǎn)生溢出是容易的,但只要溢出就認(rèn)為發(fā)生了整數(shù)溢出攻擊會(huì)帶來大量的誤報(bào),在實(shí)際應(yīng)用中是不能接受的。
圖5是一個(gè)算數(shù)運(yùn)算庫的代碼,作用是防止整數(shù)溢出。當(dāng)加法溢出時(shí)(語句2),中止執(zhí)行智能合約(語句3)。所以,如果智能合約調(diào)用該庫中的函數(shù),即使發(fā)生了整數(shù)溢出,也不會(huì)帶來安全問題。所以,認(rèn)為圖5的加法函數(shù)存在整數(shù)溢出漏洞是誤報(bào)。
為了解決整數(shù)溢出檢測的高誤報(bào)問題,本方案提出基于污點(diǎn)分析排除誤報(bào)。污點(diǎn)分析是安全領(lǐng)域常用的技術(shù),由污點(diǎn)源、污點(diǎn)傳播和污點(diǎn)槽(taint sink)3大組件組成。本方案將整數(shù)溢出的運(yùn)算結(jié)果和操作數(shù)標(biāo)記為污點(diǎn)源,如圖5中的a、b、c;監(jiān)控所有的EVM操作,追蹤污點(diǎn)傳播;如果污點(diǎn)傳播到污點(diǎn)槽即一些關(guān)鍵位置,則認(rèn)為發(fā)生了整數(shù)溢出攻擊。典型的污點(diǎn)槽包括倉庫、內(nèi)部交易的參數(shù)以及合約返回值。下面給出整數(shù)溢出攻擊檢測時(shí)用到的污點(diǎn)分析規(guī)則。
其中,為的操作結(jié)果;表示操作結(jié)果有溢出;表示任意操作本身是污點(diǎn);Arith表示算術(shù)運(yùn)算;表示所有操作數(shù)和結(jié)果都被標(biāo)記為污點(diǎn);
式(1)是算數(shù)運(yùn)算采用的污點(diǎn)分析規(guī)則,如果任意操作數(shù)本身就是污點(diǎn)或者算數(shù)運(yùn)算的結(jié)果溢出,那么算數(shù)運(yùn)算的所有操作數(shù)和結(jié)果都被標(biāo)記為污點(diǎn)。
其中,OP表示EVM操作;表示將操作結(jié)果標(biāo)記為污點(diǎn)。
式(2)是通用的污點(diǎn)分析規(guī)則,當(dāng)EVM操作不是算數(shù)操作也不是污點(diǎn)槽操作時(shí)匹配此規(guī)則。當(dāng)EVM操作的某個(gè)操作數(shù)是污點(diǎn),那么操作的結(jié)果也被標(biāo)記為污點(diǎn)。
其中,SSTORE/INVOKE/RET表示污點(diǎn)槽操作,分別對應(yīng)寫倉庫、內(nèi)部交易和合約返回值操作。
式(3)是污點(diǎn)槽采用的污點(diǎn)分析規(guī)則,如果污點(diǎn)槽操作(寫倉庫、內(nèi)部交易、合約返回值)的操作數(shù)是污點(diǎn),則檢測到了整數(shù)溢出攻擊。
采用污點(diǎn)分析后,由于圖5中的污點(diǎn)源沒有傳播到污點(diǎn)槽,所以本方案可以排除誤報(bào)。圖5是CVE-2018-13746披露的智能合約整數(shù)溢出漏洞,有漏洞的合約叫kBit。圖6中,語句2的加法運(yùn)算存在溢出漏洞,溢出后的結(jié)果將會(huì)存儲在balances[target]中,而balances是位于倉庫中的全局變量,所以語句2執(zhí)行時(shí),檢測程序認(rèn)為是整數(shù)溢出攻擊。
為了實(shí)現(xiàn)污點(diǎn)分析,檢測程序需要監(jiān)控每條EVM操作的執(zhí)行情況,因此檢測程序注冊字節(jié)碼執(zhí)行事件ExeOp。這樣每條字節(jié)碼執(zhí)行時(shí),事件處理例程都將得到通知,檢測程序在事件處理例程里實(shí)現(xiàn)對污點(diǎn)源的標(biāo)記與跟蹤。
5 結(jié)語
本文針對區(qū)塊鏈應(yīng)用層安全威脅,深入研究智能合約運(yùn)行時(shí)信息獲取、智能合約虛擬機(jī)插樁和安全威脅檢測技術(shù),提出了一種檢測算法可擴(kuò)展的區(qū)塊鏈安全威脅實(shí)時(shí)防御框架。該框架設(shè)計(jì)了基于虛擬機(jī)插樁智能合約運(yùn)行時(shí)信息全面采集方式,威脅檢測算法注冊、管理、調(diào)度機(jī)制以及檢測結(jié)果與處置方法聯(lián)動(dòng)機(jī)制,利用本文提出的實(shí)時(shí)防御框架,開展基于重入攻擊、整數(shù)溢出攻擊的防御邏輯討論,為該框架在區(qū)塊鏈安全威脅防護(hù)研究和實(shí)踐提供了參考思路。
作者簡介 >>>
白楊(1988—),女,碩士,工程師,主要研究方向?yàn)樾畔踩?shù)據(jù)安全、云計(jì)算安全。
選自《通信技術(shù)》2020年第六期 (為便于排版,已省去原文參考文獻(xiàn))
來源:信息安全與通信保密雜志社