999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于字節碼關鍵路徑的智能合約漏洞檢測

2022-03-11 05:35:50印桂生高樂莊園李俊
哈爾濱工程大學學報 2022年2期
關鍵詞:指令關鍵規則

印桂生, 高樂, 莊園, 李俊

(1.哈爾濱工程大學 計算機科學與技術學院,黑龍江 哈爾濱 150001;2.國家工業信息安全發展研究中心, 北京 100040)

自2015年全球性去中心化應用平臺以太坊[1]成立,以智能合約為基礎的去中心化應用高速發展。智能合約被定義為一組具有特定規則的數字化協議[2],是運行在區塊鏈網絡上的應用程序,其主要編寫語言為Solidity,被編譯后以字節碼形式在以太坊虛擬機(ethereum virtual machine,EVM)[3]中存儲執行。隨著區塊鏈應用的廣泛普及,智能合約被發現存在多種漏洞,導致了多起因合約漏洞被攻擊的事件,造成數千萬美元的損失[4]。例如2016年的去中心化自治組織(decentralized autonomous organization,DAO)[5]安全漏洞事件,區塊鏈業界眾籌項目The DAO被攻擊,黑客利用合約代碼中的可重入漏洞盜取資金池中的資產,導致360萬以太幣流失,市值6 000萬美元。2017年,黑客利用Parity[6]多重簽名錢包合約中的委托調用漏洞,獲取錢包地址的所有權并轉移內部資產,導致價值上億美元資金被凍結。案例表明,智能合約若自身存在漏洞隱患,會嚴重威脅用戶信息和財產安全,甚至造成難以預估的損失。面對智能合約存在的安全問題,研究高效的合約漏洞檢測方法具有重要意義。

目前,智能合約漏洞檢測的主要方法有形式化驗證、符號執行、模糊測試、污點分析等[7]。形式化驗證是通過數學推理邏輯和證明,檢查代碼功能正確性和屬性的安全性[8],保證一定范圍內的絕對正確,但需要人工參與建模和推理過程,效率較低。符號執行的核心思想是使用符號值代替具體的執行程序[9],此方法能夠減少測試用例集達實現高覆蓋率,但也會出現路徑爆炸的情況。模糊測試是一種通過構造非預期的輸入數據并監視程序運行異常結果的軟件故障識別方法[10],其優點在于測試速度快,消耗低,缺點在于所能涵蓋的系統行為有限,無法達到理想的路徑覆蓋率。這些檢測方法各有優勢,但仍存在如下問題:1)目前近30%的智能合約沒有源碼[11], 而大部分智能合約漏洞檢測工具只支持合約源碼的檢測,面對沒有源碼或只有字節碼的合約無法實現漏洞檢測;2)現有靜態檢測[12]方法只針對單一函數調用行為進行建模,沒有構建和分析合約的整體執行流程;3)目前檢測方法多依賴于有限的專家規則,漏洞定義相對簡單,導致檢測結果的真陽性比例較低[13]。

針對上述問題,本文工作引入關鍵指令概念,提出一種基于關鍵路徑的漏洞檢測方法。該方法面向智能合約的二進制代碼,為不同漏洞定義關鍵指令及其檢測規則,通過構建合約控制流程圖,生成基于關鍵指令的執行路徑,采用規則匹配模型完成漏洞識別,有效地提高了智能合約安全檢測的準確度。

1 智能合約漏洞分析

隨著智能合約的廣泛應用,關于智能合約安全問題的研究也日益重要。NCC Group[14]總結出10種出現頻率較高的智能合約安全漏洞,分別為: 可重入、委托調用、時間戳依賴、Gas耗盡終止、訪問控制、未嚴格判斷不安全函數調用返回值、拒絕服務、可預測的隨機處理、短地址攻擊以及整數溢出。本文主要針對可重入、委托調用、時間戳依賴這3種最高頻的漏洞類型進行分析,將與其漏洞特征相關的EVM底層指令定義為關鍵指令,并根據不同漏洞的關鍵指令提出相應的檢測規則。

1.1 可重入漏洞

智能合約的重要特點是調用外部合約函數,通過外部調用,合約完成轉賬(即發送以太幣給外部賬戶)。若外部調用操作不當,極其容易被攻擊者利用,通過回退函數或者回調攻擊合約自身來盜取以太幣,從而造成用戶的損失[15]。回退函數沒有參數和返回值,在合約的調用中,如果沒有其他函數與給定的函數標識符匹配,那么回退函數就會執行。此外,每當合約收到以太幣但沒有任何附帶數據時,回退函數也會執行。攻擊者可通過編寫攻擊合約,調用受害合約,利用攻擊合約的回退函數,循環調用受害合約的代碼。可重入漏洞攻擊往往是外部調用被攻擊者劫持,迫使合約進一步執行代碼,通過回退函數再次調用回退函數本身,最終實現單次或多次重入攻擊。DAO事件就是這類攻擊的典型例子。

可重入漏洞特點:在Solidity中一般有3種轉賬方法,分別是transfer()、send()、call()。由于以太坊執行交易需要收取一定數量的費用(簡稱Gas[16]),當合約調用call()函數進行轉賬時,所有可用Gas會被傳遞,這使得攻擊者能夠多次回調受害合約。當某函數通過一系列調用調回自身時,此時可能發生可重入漏洞。針對可重入漏洞,本文定義關鍵指令如表1所示。

表1 可重入漏洞關鍵指令Table 1 Key instructions for reentrancy

根據上述關鍵指令,可重入漏洞的檢測規則具體定義為:

1)對于一個函數A,檢查函數調用A是否在源自調用A的調用鏈中出現了不止一次。即檢查EVM底層的CALL指令調用鏈;

2)檢查函數中存在call()調用且滿足value>0且Gas足夠多。即檢查CALL指令的第1個堆棧參數Gas以及第3個堆棧參數value;

3)資產記錄的改變,在實際轉賬后。即檢查算數邏輯指令與CALL指令出現的先后順序。

1.2 委托調用漏洞

Solidity中有2個常用的內置變量msg.sender和msg.data,前者表示合約調用者的地址,后者表示調用者傳入的數據。此外,Solidity中調用其他合約的方法,除了call()外,通過委托調用delegatecall()方法也可以實現智能合約之間的交互。與call()調用不同,delegatecall調用會修改調用者的存儲,且在其調用后msg.sender的值一直為原調用者的地址[17]。攻擊者通過自身合約的上下文環境調用其他合約的代碼,當delegatecall的參數設置為msg.data時,攻擊者一般通過構造msg.data,實現調用受害合約的任何函數。正是由于這種委托漏洞,Parity合約損失了價值3 000萬美元的以太幣。

委托調用漏洞特點:當合約中存在委托調用,且委托調用的調用地址和調用字符序列由調用者傳入時(例如delegatecall的參數為msg.data),就會產生委托調用漏洞。針對委托調用漏洞,本文定義關鍵指令,如表2所示。

表2 委托調用漏洞關鍵指令Table 2 Key instructions for delegatecall

根據上述關鍵指令,委托調用漏洞的檢測規則具體定義如下:

1)檢查在當前合約的執行過程中是否存delegatecall()調用,即檢查是否存在DELEGATECALL和SELFDESTRUCT指令;

2)檢查delegatecall()的調用地用的字符序列是否由調用者傳入,即檢查DELEGATECALL指令的參數中是否存在CALLDATALOAD以及CALLVALUE。

1.3 時間戳依賴漏洞

時間戳是一個唯一標識某一刻的時間字符序列[18]。以太坊中,區塊時間戳有很多用途,例如生成隨機數或用于條件語句中作為時間變量的判斷條件。然而,當調用轉賬函數且函數中條件判斷中存在時間戳引用時,礦工通過修改時間戳,可以產生特定需求的隨機數,并且可通過對時間戳的控制,滿足有利于自身的條件,進而損害其他用戶的利益。

時間戳依賴漏洞特點:當調用轉賬函數時(transfer()、send()、call()),合約中的時間戳引用極易被惡意礦工所利用。為此,針對委托調用漏洞,本文定義關鍵指令如表3所示:

表3 時間戳依賴漏洞關鍵指令Table 3 Key instructions for timestamp

根據上述關鍵指令,時間戳依賴漏洞的檢測規則具體定義為:

1)檢查合約或函數中是否有block.number、now、block.timestamp等時間戳操作,即是否存在TIMESTAMP以及NUMBER指令;

2)檢查函數是否調用了send()或transfer()。即檢查是否存在CALL指令,且GAS≤2 300。

3)檢查函數存在call()調用且value>0。即檢查是否存在CALL指令,且第3個參數value>0。

2 基于關鍵路徑的合約字節碼漏洞檢測

目前,現有漏洞檢測方法主要面向智能合約的源代碼,僅有少數工作支持二進制代碼的安全檢測[19],這些方法沒有深入挖掘漏洞與EVM底層指令間的關系,導致真陽性比例較低。為解決此問題,本文提出一種基于關鍵路徑的智能合約漏洞檢測方法,根據漏洞特征為不同漏洞定義相應的關鍵指令,生成可用于規則匹配的關鍵路徑,實現對智能合約字節碼高效的漏洞檢測。具體方案流程如圖1所示。首先,將合約二進制代碼反編譯生成合約控制流圖(control flow graph,CFG);其次,根據關鍵指令生成關鍵執行路徑;最后,采用匹配規則方法對關鍵路徑進行漏洞判斷。

圖1 工作流程Fig.1 The overall workflow graph

2.1 合約控制流圖構建

為了更好地表示智能合約的二進制代碼,采用由數據依賴關系和控制關系組成的控制流程圖對其進行表示。構建CFG首先反編譯合約的字節碼,生成EVM指令及參數,EVM中常用指令如表4所示。

表4 EVM常用指令舉例Table 4 Examples of common instructions

CFG是由指令及其參數構成的基礎塊組成,其中每個基礎塊以非跳轉指令開頭,以跳轉或終止指令(如STOP、JUMP、JUMPI、RETURN、REVERT、SELFDESTRUCT等)作為結束。合約二進制代碼先反編譯生成基礎塊,再根據各個基礎塊的跳轉關系,即解析基礎塊中的跳轉指令(JUMP和JUMPI)指令,將基礎塊連接起來,形成目標合約的控制流程圖。

如圖2所示,構建CFG首先找到基礎塊間明顯的跳轉關系,例如,在基礎塊162和基礎塊694中找到2組跳轉指令PUSH2 0x2f2和JUMP,表示跳轉到地址0x2f2,即基礎塊754,它將基礎塊162、基礎塊694、基礎塊754構成一個CFG子圖。同時,尚未計算的跳轉指令(JUMP和JUMPI)被標記為未解析狀態。其次,選擇一個CFG子圖中未解析的跳轉指令,推斷其跳轉目標的逆向指令集,執行該指令以計算跳轉目標,并將該指令標記為已解析狀態,最后添加到CFG中。由于新引入的跳轉關系可能導致構建的CFG子圖出現新的跳轉指令,所以該子圖中跳轉指令都需再次標記為未解析狀態,重復此過程,直到所有跳轉指令都被標記為已解析狀態。

圖2 CFG構建Fig.2 The CFG construction phase

如圖2所示,基礎塊162、基礎塊694、基礎塊754構成一個CFG子圖,當執行到基礎塊754中最后一行的JUMP指令,出現2個逆向指令,分別為基礎塊694和基礎塊162中的2個PUSH2指令,說明此時基礎塊754引入2個新的跳轉關系:基礎塊754→基礎塊1435、基礎塊754→基礎塊1456,最終形成新控制流程圖。

2.2 關鍵路徑生成

對智能合約而言,其漏洞特點可以通過EVM關鍵指令體現,如果攻擊者利用漏洞進行合約攻擊,那么會執行一條或多條含有關鍵指令的路徑來完成。將關鍵路徑定義為包含關鍵指令的執行路徑,若關鍵路徑與給定的某種漏洞規則匹配,則表明存在此漏洞風險。

對CFG的路徑探索是典型的靜態路網中求解路徑的問題,本文采用A*算法探索路徑[20],其中路徑代價定義為該路徑在CFG中遍歷的分支數。基本思路是從每類漏洞的關鍵指令集選擇一個指令,利用A*算法進行路徑探索,每一步執行后,檢查是否仍然可以從當前路徑訪問關鍵指令集中至少一個其他剩余的指令,如果無法訪問,則放棄對該路徑的進一步探索,路徑生成示意圖如圖3所示。

圖3 路徑生成示意Fig.3 The critical-path generation phase

2.3 規則匹配

給定關鍵路徑后,即生成初步執行路徑集合,將每條路徑進行規則匹配。此過程需要解析路徑中每個指令及其參數,通過匹配相應的漏洞規則,給出最終檢測結果。

1)可重入漏洞規則匹配。

依據可重入漏洞檢測規則,若要對初步生成的路徑進行規則匹配,需要解析路徑中的CALL以及算數運算指令。其次,檢查路徑中CALL指令調用鏈,并檢查CALL指令的第1個堆棧參數Gas是否大于2 300以及第3個堆棧參數value是否大于0。同時,檢查算數邏輯指令是否出現在CALL指令之后。若滿足以上規則,則提取該路徑作為關鍵路徑。

2)委托調用漏洞規則匹配。

對委托調用漏洞進行規則匹配,需要解析路徑中的DELEGATECALL等指令,即檢查路徑中是否存在DELEGATECALL指令且DELEGATECALL指令的參數中是否存在CALLDATALOAD以及CALLVALUE讀取的數據。若滿足以上規則,則提取該路徑作為關鍵路徑。

3)時間戳依賴漏洞規則匹配。

對時間戳依賴漏洞進行規則匹配,需要解析路徑中的TIMESTAMP等指令。即檢查路徑中是否存在TIMESTAMP以及NUMBER指令;同時檢查檢查是否存在CALL指令,且GAS≤2 300。最后檢查是否存在CALL指令,且第3個參數value>0。若滿足以上規則,則提取該路徑作為關鍵路徑。

對漏洞進行規則匹配需要解析指令及參數,即對EVM指令進行符號化建模,完成EVM指令到符號表達式的轉換。EVM中有2類指令,一類是數據長度是固定值的指令,例如CALL等;另一類是長度可變的指令,例如CALLDATACOPY等。使用Z3[21]約束求解器對指令進行建模,具體過程如下:

1)對固定數據長度的指令建模,通過Z3的位向量為:

α′m[retOffset+i]←BitVector('instruction_name+i',8)

(1)

式中:αm表示內存存儲;BitVector即Z3的位向量表達式;retOffset為指令返回數據的內存地址;instruction_name是指令的名稱;i為數據長度,從0一直循環到需讀取的數據的總長度。每一次循環,從內存中讀取固定8 bit的數據,直到循環結束。

2)對可變數據長度指令建模,通過Z3的If表達式來表示:

α′m[destoffset+i]←If(i

i],αm[destoffset+i])

(2)

式中:EI為當前指令執行的符號環境;destOffset、offset、length為可變長指令的數據地址,源數據地址,數據長度。If即Z3的If表達式,i為復制數據的長度,從0循環到length。

綜上,本文提出了基于關鍵路徑的智能合約漏洞檢測方法,在僅給定字節碼的情況下檢測合約是否存在可重入漏洞、委托調用漏洞以及時間戳依賴漏洞,依據漏洞特點為不同類別的漏洞定義關鍵指令及規則,構建CFG分析合約執行路徑,通過規則匹配完成漏洞檢測。

3 實驗結果

本文使用PC作為實驗環境,使用python語言實現提出的方法,具體操作系統及軟件配置見表5。從以太坊網站上獲取8 000份真實智能合約及其字節碼進行驗證,實驗結果表明本文方法具有高效的漏洞檢測能力。如表6所示,在294個真實漏洞中成功檢測到244個漏洞,包括15個可重入漏洞,9個委托調用漏洞以及220個時間戳依賴漏洞。

表5 實驗環境Table 5 Experimental environment configuration

表6 漏洞檢測結果Table 6 Vulnerability detection results

1)可重入漏洞。

在可重入漏洞方面,本文方法充分挖掘了可重入漏洞的底層特點,在8 000個合約中成功檢測到15個可重入漏洞(共有16個可重入漏洞),人工檢測證明僅有1個假陰性結果(即1份可重入漏洞合約沒有檢測到),檢測準確率高達93.75%。

2)委托調用漏洞。

在委托調用漏洞方面,本文方法成功檢測到9個漏洞(共有11個漏洞),其中8個真陽性結果和1個假陽性結果。此外,出現3個假陰性結果,檢測準確率為72.72%。存在假陰性結果是因為在委托調用過程中,有些合約的調用鏈過長,本文方法沒有捕捉到這種過長的調用關系。

3)時間戳依賴漏洞。

在時間戳依賴漏洞方面,本文方法成功檢測到220個漏洞(共有267個漏洞),其中218個真陽性結果和2個假陽性結果,檢測準確率為81.65%。此外,出現49個假陰性結果,原因在于本文定義時間戳依賴漏洞的檢測規則時,沒能充分考慮與時間戳有關數據調用鏈,會在后續工作中進一步改進。

最后,與2種現有方法進行比較:模糊測試方法ContractFuzzer[22]和靜態符號執行方法Oyente[23],本文方法整體表現更優,如表7所示,由于Oyente不支持對委托調用漏洞的檢測,所以相應結果用“—”表示。

表7 與ContractFuzzer和Oyente對比結果Table 7 Comparison with ContractFuzzer and Oyente

由表7可知,針對可重入漏洞和時間戳依賴漏洞,本文方法的準確度明顯高于對比方法,原因在于這兩類漏洞的特點比較明顯,且調用鏈數量小,相對于ContractFuzzer與Oyente定義的復雜檢測規則,基于關鍵路徑的檢測方法具備更高效的漏洞定位能力。

4 結論

1)定義與漏洞相關的關鍵指令及檢測規則,通過反編譯字節碼構建控制流圖,基于符號表達式建模,對關鍵執行路徑進行規則匹配并完成漏洞檢測。

2)本文采用以太坊上真實智能合約數據進行實驗,結果表明本文方法優于智能合約現有漏洞檢測工具,準確度提升近10%。

未來的研究主要考慮結合動靜態方法的漏洞檢測技術,例如形式化驗證與模糊匹配方法相結合,亦可使用機器學習或深度學習實現智能合約的漏洞檢測。

猜你喜歡
指令關鍵規則
聽我指令:大催眠術
撐竿跳規則的制定
高考考好是關鍵
數獨的規則和演變
ARINC661顯控指令快速驗證方法
測控技術(2018年5期)2018-12-09 09:04:26
LED照明產品歐盟ErP指令要求解讀
電子測試(2018年18期)2018-11-14 02:30:34
讓規則不規則
Coco薇(2017年11期)2018-01-03 20:59:57
TPP反腐敗規則對我國的啟示
獲勝關鍵
NBA特刊(2014年7期)2014-04-29 00:44:03
坐標系旋轉指令數控編程應用
機電信息(2014年27期)2014-02-27 15:53:56
主站蜘蛛池模板: 欧美日本一区二区三区免费| 欧美不卡在线视频| 亚洲成人高清在线观看| 国产免费高清无需播放器| 欧美一级特黄aaaaaa在线看片| 激情网址在线观看| 999国内精品视频免费| 国产日韩欧美黄色片免费观看| 日韩成人在线网站| 国产精品福利在线观看无码卡| 亚洲va在线观看| 国产精品开放后亚洲| 国产一级片网址| 69综合网| 丰满的少妇人妻无码区| 久青草网站| jizz在线免费播放| 国模在线视频一区二区三区| 精品国产www| 久久久久亚洲av成人网人人软件 | 97免费在线观看视频| 欧美亚洲激情| 一级毛片在线免费看| a级毛片在线免费| 亚洲成av人无码综合在线观看| 国内99精品激情视频精品| 无码AV动漫| 中文字幕在线看视频一区二区三区| 视频二区国产精品职场同事| 亚洲精品国产自在现线最新| 欧美成在线视频| 无遮挡国产高潮视频免费观看| 亚洲免费毛片| 99国产在线视频| 亚洲第一极品精品无码| 精品福利网| 久久精品亚洲中文字幕乱码| 久久久久无码精品| 日韩欧美色综合| 国产在线第二页| 欧美日韩高清| 成人午夜视频网站| 欧美日韩一区二区在线播放| 人妻丰满熟妇αv无码| 五月婷婷综合在线视频| 国产欧美视频综合二区| 国产综合在线观看视频| 黄色a一级视频| 亚洲精品动漫| 国产在线97| 啪啪永久免费av| 国产精品短篇二区| 欧美a在线| 欧美综合区自拍亚洲综合绿色 | 欧美午夜理伦三级在线观看| 999精品视频在线| 日本久久网站| 国产成人喷潮在线观看| 女人毛片a级大学毛片免费| 潮喷在线无码白浆| 欧美日韩福利| 免费激情网站| 久久婷婷色综合老司机| 日韩免费毛片视频| 国语少妇高潮| 在线看AV天堂| 中文精品久久久久国产网址| 中文成人在线视频| 国产精品自在拍首页视频8| 99久久婷婷国产综合精| 国产69精品久久久久孕妇大杂乱 | 久久精品人人做人人爽| 正在播放久久| 国产99在线观看| 91精品啪在线观看国产91九色| 国产精品无码AⅤ在线观看播放| 亚洲欧美不卡中文字幕| 国产精品嫩草影院av| a毛片基地免费大全| 精品伊人久久久大香线蕉欧美 | 国产视频一区二区在线观看| 国产成人综合在线观看|