本發(fā)明涉及區(qū)塊鏈重入攻擊檢測,具體為一種erc777合約重入攻擊檢測方法及系統(tǒng)。
背景技術(shù):
1、erc777標(biāo)準(zhǔn)是對erc20標(biāo)準(zhǔn)的改進(jìn)和拓展,它引入了更高級的功能和安全性措施。其中,erc777標(biāo)準(zhǔn)中提出了一種名為hook的回調(diào)函數(shù),使得合約能夠滿足更復(fù)雜的需求和場景。然而,由于hook函數(shù)的功能具有不確定性,取決于外部調(diào)用者的實現(xiàn)以及調(diào)用時機,這使得erc777合約能夠針對具有特定結(jié)構(gòu)的鏈上智能合約發(fā)起重入攻擊。
2、傳統(tǒng)的智能合約漏洞檢測方法主要基于靜態(tài)分析或動態(tài)測試,然而這些方法存在一定的局限性,首先靜態(tài)分析方法存在路徑不可達(dá)以及路徑爆炸兩大難題,而動態(tài)測試雖然能夠保證足夠低的誤報率,但是該方法無法保證合約執(zhí)行路徑的覆蓋率,導(dǎo)致漏報率較高?,F(xiàn)有基于動態(tài)執(zhí)行信息分析的智能合約重入缺陷檢測方法無法保證隨機生成測試用例的路徑覆蓋率,具有較低的漏報率,并且該方法采用的是隨機生成的方法進(jìn)行測試用例生成,隨機生成方法僅適用于一些簡單的場景,對于重入漏洞檢測這種復(fù)雜的場景而言,可能會導(dǎo)致漏報率的增加?;诨旌夏:郎y試的區(qū)塊鏈智能合約漏洞檢測方法雖然結(jié)合使用了靜態(tài)分析與動態(tài)測試方法,但是從方法執(zhí)行步驟可以看到,其無法適用于重入漏洞的檢測。首先,重入攻擊需要進(jìn)行合約之間的交互,而該方法并沒有進(jìn)行攻擊合約的部署,此外合約部署之間存在一定的依賴關(guān)系,這些都是該方法沒有考慮到的,因此該方法無法進(jìn)行重入漏洞的檢測,為此我們提出一種erc777合約重入攻擊檢測方法及系統(tǒng)用于解決上述問題。
技術(shù)實現(xiàn)思路
1、背景技術(shù)中提到的三種方法僅是針對具有重入漏洞的目標(biāo)合約進(jìn)行漏洞檢測,當(dāng)前區(qū)塊鏈上已經(jīng)部署了大量具有重入漏洞的智能合約,以上方法無法檢測新部署合約是否能夠?qū)σ延泻霞s發(fā)起重入攻擊;因此鏈上目標(biāo)合約的擁有者無法針對性地采取防御措施,如構(gòu)建合約調(diào)用黑名單等。針對以上問題,本發(fā)明提出了一種erc777合約重入攻擊檢測方法及系統(tǒng),使用靜態(tài)分析獲取能夠發(fā)起重入攻擊的erc777合約作為待部署合約以及鏈上具有特定結(jié)構(gòu)的目標(biāo)合約,隨后根據(jù)合約依賴關(guān)系部署待部署合約以及目標(biāo)合約,最后使用模糊測試生成測試用例,執(zhí)行測試用例并分析執(zhí)行過程中的信息以判斷重入攻擊是否成功以及攻擊是否有害,以此判斷待部署合約是否能夠發(fā)起有害的重入攻擊。
2、為實現(xiàn)上述目的,本發(fā)明提供如下技術(shù)方案:一種erc777合約重入攻擊檢測方法及系統(tǒng),包括待測合約和目標(biāo)合約,待測合約即為待部署合約中的包含hook函數(shù)的erc777合約,目標(biāo)合約即為與待測合約存在交互且可能具有重入漏洞的合約,所述方法包括如下步驟:
3、步驟s1、構(gòu)建待部署合約的抽象語法樹,根據(jù)語法樹中的函數(shù)定義節(jié)點識別包含hook函數(shù)的erc777合約,將對應(yīng)合約加載到待測合約池中,并將合約中對應(yīng)hook函數(shù)加入到第一函數(shù)候選池,同時根據(jù)抽象語法樹構(gòu)建待測合約與鏈上已部署合約的依賴關(guān)系,并構(gòu)建目標(biāo)合約集合,對該集合中被調(diào)函數(shù)的代碼進(jìn)行靜態(tài)分析判斷是否存在遭受重入攻擊的可能,以及確定該合約不存在防止攻擊的機制,將同時滿足兩個條件的函數(shù)加入到第二函數(shù)候選池;
4、步驟s2、根據(jù)待測合約與鏈上已部署合約的依賴關(guān)系判斷待測合約以及目標(biāo)合約的部署順序,在測試網(wǎng)絡(luò)中分別部署待測合約和目標(biāo)合約,使用自動化腳本或自動化部署工具來生成合約部署交易,分別從第一函數(shù)候選池和第二函數(shù)候選池中各隨機選取一個候選函數(shù),根據(jù)候選函數(shù)的參數(shù)類型隨機生成測試用例,根據(jù)測試用例執(zhí)行對應(yīng)交易并記錄執(zhí)行過程中產(chǎn)生的地址信息,收集以太坊虛擬機中操作碼的執(zhí)行信息,記錄每個操作碼執(zhí)行接收后的對應(yīng)合約狀態(tài)變量信息;
5、步驟s3、分析步驟s2交易執(zhí)行是否成功,根據(jù)以太坊虛擬機中的操作碼信息生成調(diào)用圖分析是否發(fā)生重入攻擊,結(jié)合對應(yīng)合約狀態(tài)變量的變化分析待測合約對目標(biāo)合約是否具有攻擊性。
6、優(yōu)選的,步驟s1的具體操作如下:
7、步驟s11、構(gòu)建待部署合約的抽象語法樹,并且使用正則表達(dá)式刪除待測合約代碼中的無關(guān)信息;
8、步驟s12、遍歷待部署合約的抽象語法樹,識別包含hook函數(shù)的erc777合約,將對應(yīng)合約加載到待測合約池中,以及合約中對應(yīng)hook函數(shù)加入到第一函數(shù)候選池;
9、步驟s12、遍歷待測合約的抽象語法樹,構(gòu)建待測合約與鏈上已部署合約的依賴關(guān)系集合;
10、步驟s13,將鏈上已部署合約中與hook函數(shù)進(jìn)行交互的合約標(biāo)記為目標(biāo)合約,并以此構(gòu)建目標(biāo)合約集合;
11、步驟s14,對目標(biāo)合約中的被調(diào)函數(shù)的代碼進(jìn)行靜態(tài)分析判斷其是否存在遭受重入攻擊的風(fēng)險,以及確定該合約不存在防止攻擊的機制,將同時滿足兩個條件的函數(shù)加入到第二函數(shù)候選池。
12、優(yōu)選的,步驟s13還包括對目標(biāo)合約的篩查具體步驟如下,過濾private、view、pure和constant修飾符的函數(shù),當(dāng)目標(biāo)合約中沒有可調(diào)用函數(shù)時,將其從目標(biāo)合約集合中移除,并取消目標(biāo)合約的標(biāo)記。
13、優(yōu)選的,所述步驟s2的具體操作如下;
14、步驟s21、根據(jù)依賴關(guān)系集合判斷待測合約以及目標(biāo)合約的部署順序,編寫自動化腳本或使用自動化部署工具來生成合約部署交易,在測試網(wǎng)絡(luò)中分別部署待測合約和目標(biāo)合約,通過交易回執(zhí)或交易哈希獲取待測合約地址以及目標(biāo)合約地址;
15、步驟s22、從第一函數(shù)候選池中選取第一函數(shù),從第二函數(shù)候選池中選取第二函數(shù),根據(jù)候選函數(shù)的參數(shù)類型隨機生成測試用例。
16、步驟s23、根據(jù)測試用例執(zhí)行對應(yīng)交易并記錄執(zhí)行過程中產(chǎn)生的地址信息,收集以太坊虛擬機中操作碼的執(zhí)行信息,記錄每個操作碼執(zhí)行接收后的對應(yīng)合約狀態(tài)變量信息。
17、優(yōu)選的,地址信息包括調(diào)用合約地址以及被調(diào)用合約地址;
18、執(zhí)行信息包括算術(shù)運算、邏輯運算、i/o操作;
19、狀態(tài)變量信息包括以太坊智能合約中聲明的持久化數(shù)據(jù),這些數(shù)據(jù)會被保存在區(qū)塊鏈上,并在合約的不同函數(shù)調(diào)用之間保持不變。
20、優(yōu)選的,每當(dāng)在以太坊網(wǎng)絡(luò)上發(fā)送一筆交易,區(qū)塊鏈會執(zhí)行該交易,并生成一個交易回執(zhí),用于提供對交易執(zhí)行結(jié)果的詳細(xì)信息,所述步驟s3的具體操作如下:
21、步驟s31、通過檢查交易回執(zhí)中的狀態(tài)字段判斷交易執(zhí)行是否成功;
22、步驟s32、根據(jù)步驟s2執(zhí)行過程中產(chǎn)生的地址信息生成調(diào)用圖;
23、步驟s33、通過調(diào)用圖判斷執(zhí)行過程中是否多次重復(fù)出現(xiàn)調(diào)用合約的地址和被調(diào)合約的地址;
24、步驟s34、通過步驟s2操作碼的執(zhí)行信息,判斷是否重復(fù)多次出現(xiàn)轉(zhuǎn)賬操作,且轉(zhuǎn)賬過程中調(diào)用合約地址與被調(diào)用合約地址相同,若出現(xiàn)多次轉(zhuǎn)賬操作,分析對應(yīng)合約狀態(tài)變量信息是否出現(xiàn)異常,如發(fā)生狀態(tài)變量的變化,則可以判定該重入攻擊是有害的,即待測合約對目標(biāo)合約具有攻擊的能力。
25、一種erc777合約重入攻擊檢測系統(tǒng),所述系統(tǒng)包括如下模塊;
26、合約靜態(tài)分析模塊:構(gòu)建待部署合約的抽象語法樹,根據(jù)語法樹中的函數(shù)定義節(jié)點識別包含hook函數(shù)的erc777合約,將對應(yīng)合約加載到待測合約池中,并將合約中對應(yīng)hook函數(shù)加入到第一函數(shù)候選池,同時根據(jù)抽象語法樹構(gòu)建待測合約與鏈上已部署合約的依賴關(guān)系,并構(gòu)建目標(biāo)合約集合,對該集合中被調(diào)函數(shù)的代碼進(jìn)行靜態(tài)分析判斷是否存在遭受重入攻擊的可能,以及確定該合約不存在防止攻擊的機制,將同時滿足兩個條件的函數(shù)加入到第二函數(shù)候選池;
27、模糊測試模塊:根據(jù)待測合約與鏈上已部署合約的依賴關(guān)系判斷待測合約以及目標(biāo)合約的部署順序,在測試網(wǎng)絡(luò)中分別部署待測合約和目標(biāo)合約,使用自動化腳本或自動化部署工具來生成合約部署交易,分別從第一函數(shù)候選池和第二函數(shù)候選池中各隨機選取一個候選函數(shù),根據(jù)候選函數(shù)的參數(shù)類型隨機生成測試用例,根據(jù)測試用例執(zhí)行對應(yīng)交易并記錄執(zhí)行過程中產(chǎn)生的地址信息,收集以太坊虛擬機中操作碼的執(zhí)行信息,記錄每個操作碼執(zhí)行接收后的對應(yīng)合約狀態(tài)變量信息;
28、漏洞檢測模塊:交易執(zhí)行是否成功,根據(jù)以太坊虛擬機中的操作碼信息生成調(diào)用圖分析是否發(fā)生重入攻擊,結(jié)合對應(yīng)合約狀態(tài)變量的變化分析待測合約對目標(biāo)合約是否具有攻擊性。
29、與現(xiàn)有技術(shù)相比,本發(fā)明的有益效果是:
30、第一、本發(fā)明使用靜態(tài)分析檢測具有攻擊能力的erc777合約及其相關(guān)鏈上合約,減小動態(tài)測試的檢測集合。
31、第二、本發(fā)明通過合約依賴關(guān)系進(jìn)行合約自動化部署減小人力成本的同時,保證合約的正常執(zhí)行。
32、第三、本發(fā)明使用模糊測試對靜態(tài)分析的結(jié)果進(jìn)行測試,確保對應(yīng)erc777合約具有發(fā)起有害性重入攻擊的能力,以此目標(biāo)合約用戶可以針對性地采取防御措施。