天天看點

基于VulDeePecker的智能合約檢測新方法

基于VulDeePecker的智能合約檢測新方法

(1)VulDeePecker是什麼?

VulDeePecker是基于深度學習的漏洞檢測系統,主要針對C/C++代碼的漏洞進行檢測。它提出使用code gadgets來表示程式,然後将code gadgets轉換成向量輸入神經網絡進行學習,利用學習後的模型進行漏洞檢測。

(2)VulDeePecker的方法

它提出了使用code gadgets的方法來表示程式,具體而言,是為了使深度學習适合于漏洞檢測。code gadgets是由一些代碼行組成的程式聲明,這些代碼行之間有語義相關。為了生成這些code gadgets,提出了一種key points的概念,某種程度上這些key points暗示代碼中漏洞的存在。對于由于庫/ API函數調用的不當使用而導緻的漏洞,key point是庫/ API函數調用;對于由不正确使用數組引起的漏洞,key point是數組。值得注意的是,一類漏洞可能有多種key point。例如,緩沖區錯誤漏洞可能對應于以下關鍵點:庫/ API函數調用,數組和指針。 此外,多種類型的漏洞中可能存在相同類型的關鍵點。例如,緩沖區錯誤和資源管理錯誤漏洞都可能包含庫/ API函數調用的關鍵點。

在VulDeePecker中,專注于使用庫/ API函數調用的特定key point來證明其在基于深度學習的漏洞檢測中的有用性。 而對于庫/ API函數調用這個key point,code gadgets可以通過資料流程或程式的控制流程分析生成。

而基于深度學習的VulDeePecker,它分為學習階段和檢測階段,如下圖:

基于VulDeePecker的智能合約檢測新方法

具體方法如下:

1. 從C/C++代碼中提取出庫/ API函數調用,然後對每個庫/ API函數調用提取一個或多個程式片,程式片之間是有語義相關的。

2. 将多個程式片組合成一個code gadget,然後對每個code gadget标注,有漏洞的标為“1”,沒有漏洞的标為“0”,作為ground truth。

3. 将code gadgets轉化為特定的符号表示,旨在儲存訓練代碼程式的語義資訊,然後将這些符号表示轉化為向量。

4. 向量和标注好的ground truth作為輸入,使用BLSTM進行訓練。

而對于特定的庫/ API函數調用,這裡使用了兩種程式切片的方式:前向切片和後向切片。前向:庫/ API函數調用是直接從外部輸入接收一個或多個輸入的函數調用,例如指令行,程式,套接字或檔案。後向:庫/ API函數調用是不直接從程式運作的環境接收任何外部輸入的函數調用。文中使用後向庫/ API函數調用strcpy(buf, str)為了例子進行了分析。

基于VulDeePecker的智能合約檢測新方法

使用者自定義的變量映射成符号名(“VAR1”,“VAR2”…),同時将使用者自定義的函數映射成符号名(“FUN1”,“FUN2”)。    

基于VulDeePecker的智能合約檢測新方法

每個code gadget通過其符号表示形式編碼為矢量。為此,通過詞法分析将符号表示中的code gadget劃分為一系列token,包括辨別符,關鍵字,運算符和符号。 例如:

“strcpy(VAR1, VAR2)”

表示一個包含7個token的序列,如下:

“strcpy”,“(”,“VAR1”,“,”,“VAR2”,“)”,“;”

為了将這些token轉化為向量,這裡使用了word2vec工具。而針對BSTLM隻能輸入固定等長向量的特性,需要做一些調整:

當向量小于固定長度時,有兩種情況:如果code gadget是從後向切片生成的,或者是通過組合多個後向切片生成的,在向量的開頭填充零;否則,将零填充到向量的末尾;

當向量長于固定長度時,也有兩種情況:如果code gadget是從後向切片生成的,或者是通過組合多個後向切片生成的,則删除向量的開始部分;否則,删除向量的結尾部分。

而在神經網絡的選擇方面,确定這行代碼是否存在漏洞需要依賴上下文環境。那些可以處理上下文環境的神經網絡可能适合用來做漏洞檢測。這條原則建議自然語言處理的神經網絡可能适合用作漏洞檢測。選擇了雙向的LSTM來進行漏洞檢測。

基于VulDeePecker的智能合約檢測新方法

(3)VulDeePecker的限制

VulDeePecker目前的設計,實施和評估有一些局限性。

首先,VulDeePecker的目前設計僅限于通過假設程式的源代碼可用來處理漏洞檢測。檢測可執行檔案中的漏洞是一個不同且更具挑戰性的問題。

其次,VulDeePecker的目前設計僅涉及C / C ++程式。未來的研究需要使其适應其他類型的程式設計語言。

第三,VulDeePecker的目前設計僅處理與庫/ API函數調用相關的漏洞。如何通過利用其他類型的key point來檢測其他類型的漏洞是未來需要研究的方向。

第四,VulDeePecker的目前設計僅适用資料流分析(即,資料依賴性),而不适用于控制流分析(即,控制依賴性)。

第五,VulDeePecker的目前實作僅限于BLSTM神經網絡。其他可用于漏洞檢測的神經網絡還在進行實驗。

VulDeePecker主要提出了使用深度學習來代碼審計的3個原則,code gadget概念以及VulDeePecker工具。VulDeePecker是第一個使用深度學習來進行代碼審計的工具,給傳統的靜态代碼審計提供了一個新的思路。但是同樣的,資料集的優劣直接關系了漏報率和誤報率,怎麼樣選好資料集是非常重要的一步。相對傳統的方法,這是一個難點。文章對VulDeePecker的實作主要通過資料流分析來進行code gadget的生成,進一步我覺得可以對控制流分析來研究所學生成code gadget,并且文章的漏洞種類不多,無法确定對于其他類型的漏洞是否同樣有效,需要進一步的研究。

(4)應用于solidity智能合約漏洞檢測的想法

基于VulDeePecker的想法,使用深度學習的方法對solidity智能合約的漏洞檢測也是有一定的可行性的。Solidity也是一種進階程式語言,也可以用類似的方法根據key point對智能合約代碼進行程式分片。

如何對智能合約代碼進行分片以及如何使用code gadget表示智能合約代碼?

在VulDeePecker中,主要檢測的漏洞是緩沖器錯誤和資源管理錯誤兩種漏洞,對應于兩種錯誤,分别有不同的key points來進行特定的程式分片和code表示,而目前VulDeePecker隻針對庫/API函數調用這個key point進行了實驗,基于此,有如下想法:

(1)首先,Solidity與/C++還是有差別的,并且智能合約代碼的漏洞與C/C++的漏洞也是不一樣的,是以考慮針對某幾個合約漏洞進行檢測,如:整數溢出、外部調用、敏感行為、異常、邏輯順序等,而引發這些漏洞的原因應該被仔細分析,用來作為key points對合約代碼進行資料流分析,然後實作程式代碼的分片和code gadget的組合。

問題:已有的solidity合約數量龐大,如何定義這些key points,使用什麼樣的方式進行代碼資料流分析,是需要思考的地方。

(2)第二,因為智能合約代碼的分析有不同之處,是以是否可以針對某一個特定漏洞(如重入漏洞)進行分析,找到有關重入漏洞的key point然後進行資料流分析。

如果是簡單的代碼處理,那經過深度學習後的結果肯定是不理想的,是以對于資料集的制作是至關重要的,并且資料集的選取和制作的工作量很大,需要針對特定的問題提出特定的方法。

VulDeePecker原文:https://arxiv.org/abs/1801.01681

繼續閱讀