每晚八點,我們在社區分享知識。

樂樂:sensus113 美果大冰:xj73226

備註入羣,謝謝!

智能合約中安全漏洞的符號分析,被證明對分析預定義的漏洞有價值。有些符號工具可以執行復雜的分析步驟 , 然後修復這些漏洞。然而,漏洞
總是在不斷的發展。以太坊上的合約數量自 2015 年 12 月以來就增加了 176 倍,如果這些符號工具無法隨時更新,他們可能會導致整個類別的漏洞未被發現,這會帶來很多意想不到的後果。在本文中,我們的目標是擁有不太容易受到新興威脅的智能合約,特別地,我們提出了一種新的智能合約漏洞的順序學習方法,使用機器學習的檢測合約的漏洞
(這個方法叫 long-short term memory,LSTM)- -隨着更多的合約使用這個方法,能進化出更安全的智能合約。我們的實驗研究通過一百萬個智能合約的訓練學習,顯示出令人鼓舞的結果,觀察到 97% 的合約脆弱性的檢測精度。此外,我們的機器學習的方法還正確地檢測到 76% 的合約漏洞
—否則會被視爲 false positive errors。考慮到抽樣的 10000 個合約的子集是從未標記的合約,所提出的方法要正確識別更廣泛的漏洞類別。

簡 介

智能合約提供自動化的對等交易,同時擁有利用區塊鏈提供的權力下放的好處。
智能合約能夠使他們持有的價值數百美元的虛擬貨幣自動轉移貨幣價值或執行合約的邏輯,同時具有由共識協議管理保證執行的正確性。
在區塊鏈中包含的自動化技術,在各個領域都看能看到潛在的影響,比如金融,醫療保健,甚至保險。以太坊,最受歡迎的智能合約平臺,市值高達 210 億美元。由於智能合約的完全自主性,漏洞尤其具有破壞性,因爲區塊鏈的不變性使得它們在很大程度上是不可逆轉的。僅僅以太坊,在 2016 年 6 月,超過 360 萬以太(由以太網使用的分散投資基金被稱爲 The
DAO (Decentralized Autonomous Organization)被盜,造成高達 7000 萬美元的損失。
2017 年 11 月,3 億美元由於 Parity 的 MultiSig 錢包而凍結。兩個事件都是因爲黑客利用了智能合約本身的邏輯漏洞,這些事件強烈突出了保證智能合約的安全勢在必行。智能合約符號分析中使用的工具是主要基於正式的驗證方法。雖然大多數分析工具已應用靜態和動態分析自動檢測智能合約中的錯誤,但也有些是專注於通過新方法發現合約的漏洞。OYENTE 就是這樣一個自動 bug 檢測器的例子。有人提議通過分析智能合約字節碼級別的漏洞
,作爲一種 pre-deployment
mitigation 的形式,它使用符號執行跟蹤,捕獲與定義特徵匹配的漏洞。但是,它並不完整,因爲標記合約易受攻擊的確認只能在合約源代碼存在的情況下手動完成。

最近,Maian 是第一個展示精確地指定和推理跟蹤屬性的工具,採用程序間符號分析和驗證來實行檢測,能夠捕獲許多衆所周知的 bug。直接使用預定義的執行跟蹤以太坊智能合約上字節碼級別的漏洞,Maian 將易受損害的合約標註爲三類合約中的一種或兩種 .—suicidal,
prodigal, and greedy。
Maian 能夠檢測到可能僅僅在多次調用之後纔會出現的不同類別的漏洞,同時在私有的以太坊的分叉上驗證它。但是,它的準確度檢測可以受到其調用深度的限制。此外,僅對這種表徵進行分析,通過源代碼訪問來運行合約對 bug 進行具體的檢查。另一方面,在機器學習領域,遞歸神經網絡是特別富有表現力的強大模型,適用於順序數據。
LSTM 模型是循環網絡的一個引人注目的變體用來解決困難的連續問題,如語音識別,機器翻譯和自然語言處理。近年來,人們越來越關注智能合約和機器學習在安全方面的應用,關於自動化漏洞分析的論文,用於猜測密碼的神經網絡,開發利用字節碼漏洞的智能合約,以及常見編程陷阱的分類,有些甚至採用機器學習技術來提高性能和增加適應性。

在這項工作中,我們介紹了一個機器學習模型檢測操作碼級別的智能合約漏洞。

據我們所知,這是智能合約漏洞檢測的第一個機器學習方法。我們研究使用 LSTM 模型對任務的適用性,作爲一種簡單,高效但適應性強的智能合約漏洞探測器。隨着智能合約的出現按順序,它們可用於更新 LSTM 每個時間點的未來合約模型。僅限約 1%的智能合約(我們稱之爲 Etherscan
),有原始(Solidity)源代碼,它突出了實用程序 LSTM 學習模型作爲智能合約安全工具的作用。

我們在這項工作中的貢獻如下:

*我們證明 LSTM 學習算法能夠強化符號分析工具在檢測智能合約安全漏洞方面的表現
*我們通過實驗證明 LSTM 性能隨着新合約的不斷改進,實現了整體檢測精度
誤報率誤差爲 97%

*我們通過 Maian 分析了 10,000 個未標記合約的子集,但被 LSTM 列爲易受傷害的。
*通過另一個符號分析工具 SECURIFY 運行這些合約,我們確認多份合約確實很脆弱。 我們的 LSTM 工具可以檢測到更廣泛的安全問題
*通過證明 LSTM 工具是一種有競爭力符號分析工具之外,我們還爲機器學習模型的未來工作設置了一個檢測智能合約漏洞的基準。

2. 背景

2.1 智能合約

智能合約是基於狀態的自治可執行代碼,在區塊鏈上存儲,驗證和執行的內容。

以太坊智能合約主要寫在一個圖靈完備,基於堆棧的字節碼語言 -Solidity。智能合約部署在以太坊區塊鏈上以發件人的交易形式,其中有一個地址被分配給合約。每個智能合約都包含一個

state (帳戶餘額和私有存儲)和可執行文件碼。一旦部署,智能合約是不可變的,沒有可以對合約進行修改。但是,它可以被殺死只要執行合約中的 suicide 指令。一旦部署在區塊鏈上,可以調用合約通過將交易發送到合約地址,以及輸入數據和 gas
–智能合約執行的“燃料”。在以太坊中,gas 按比例分配給該數量其指令中每條指令所需的計算量設置。該 gas 在 POW 系統中用作執行合約的激勵。如果 gas 不足或在執行結束前用盡,不退還任何 gas 到調用者和事務(包括狀態)被還原。不能向被殺死的合約發送任何交易。在以太坊中,執行智能合約的調用通過網絡中的每個全節點達成共識輸入,考慮到區塊鏈的當前狀態和執行合約的狀態。然後合約更新合約狀態,將價值轉移到其他合約地址,並可能執行其他相反的功能

智能合約的執行跟蹤是在其生命週期內發生的一系列合約調用。在一系列合約調用中發生的漏洞

被歸類爲跟蹤漏洞。以太坊中的智能合約分爲三類類別 – suicidal, prodigal, and greedy.。

Suicidal Contracts。

可以被殺死的智能合約任意地址都歸類爲 suicidal。雖然有些合約可以選擇將自己作爲緩解攻擊的一種方法,如果執行不當,該功能允許任何其他用戶殺死該選項合約。這發生在 ParitySig 攻擊期間,任意用戶設法獲得程序合約的所有權並將其殺死,感染任何其他

依賴這個程序合約導致無效,從而有效地鎖定了他們的資金。

Prodigal Contracts (浪子合約)。

可以泄漏資金的智能合約,除了所有者之外的任意地址,或者從未在合約中存入以太網的類別被歸類爲 Prodigal。 合約通常有 internal calls
將資金髮送到其他合約或地址。但是,如果沒有足夠的機制來保護此類呼叫的可用性,攻擊者可能可以利用此呼叫將 Ether 漏到他們的自己的賬戶,耗盡了脆弱合約的資金。

Greedy Contracts (貪婪合約)

無法重新租賃以太網的智能合約被歸類爲 greedy。繼 ParitySig 攻擊之後,許多賬戶依賴於 parity 合約無法釋放資金,導致損失接近 3000 萬美元。在 greedy 的階級中,脆弱的合約又細分爲兩類
– (a)接受以太但完全缺乏指令的合約發送資金,以及(b)接受以太幣幷包含的合約發送資金的指示,但無法執行任務。

2.3 深度神經網絡

深度神經網絡(DNN)是極具表現力和強大的機器學習模型。遞歸神經網絡(RNN)是適用於序列數據的 DNN。這些模型可以學習並在許多硬序貫學習問題上實現出色的性能,例如語音識別,機器翻譯和自然語言處理。

2.3.1 遞歸神經網絡

RNN 具有使用僅兩個隱藏層來學習高度精確模型的顯着能力。雖然神經網絡與傳統的概率模型有關,這些網絡學習了更復雜的計算。

此外,每當標記數據集可用時,大型網絡利用稱爲反向傳播的監督學習技術來訓練網絡參數。
如果存在一組大型神經網絡可以參數的參數在問題上取得了良好的表現,監督反向傳播收斂於這些參數來解決任務。在 80 年代提出了 RNN 用於執行時間序列預測。
循環網絡的體系結構類似於標準神經網絡。 主要的區別在於它們被允許與時間延遲相關聯的隱藏單元之間的連接。
這些模型是能夠保留過去觀察到的輸入的記憶,使他們能夠發現數據中的時間關係。

2.4 Long Short-Term Memory RNN

爲了解決消失的梯度和長期問題標準 RNN 的依賴性問題,長期短期存儲器(LSTM)網絡被提出。在 LSTM 裏面,建議使用門功能控制任何給定的經常性單位的信息流
— input gate,forget gate 和 output gate。 input gate 用作門衛,允許相關信號通過進入隱藏的環境。另一方面,
gate 是用於確定先前信息的數量 –當前時間步長和輸出門功能作爲預測機制。在實際實現中,元素方式 sigmoid 函數輸出軟值
-通常選擇補間 0 和 1 作爲門的函數。

這允許易於凸優化。通過介紹 這樣的信息門控,LSTM 幾乎總是如此比標準 RNN 執行得更好。

RN 以序列{x1,x2,…,xT}作爲輸入,並構造相應的隱藏狀態(或表示){h1,h2,…,hT}序列。在最簡單的情況下,單層遞歸網絡使用隱藏表示{H1,H2,…,Ht}用於估計和預測。在另一個在深 RNNs 中,每個隱藏層使用隱藏狀態。前一層作爲輸入。也就是說,隱藏狀態層 (k-1) 被用作 k 層的輸入。在 RNNs 中,每個層中的每個隱藏狀態都執行基於內存的學習。重視以往任務的相關特徵輸入。將先前的隱藏狀態和電流 \\ 最近輸入轉換爲新的隱藏狀態,並通過遞歸算子(h(t-1),Xt),例如:

ht=tanh ((Wh)(h(t-1))+(Wx)x`t+B);

其中 Wh、Wx 和 b 是層和 tanh (·)的參數。表示標準雙曲正切函數。

至於 LSTM,該架構是專門設計來處理經常性操作。在體系結構中,一個存儲器細胞 ct.。當我們回憶隱藏狀態 ht, 是時間步長 t 的狀態的近似表示,ct 和通過三個門函數計算 ht 來保持這兩個函數。The
forget gate (ft) 通過一個元素化的產品,直接連接 ct 對記憶細胞 ct 。使用 forget gate 的 large values, 會使 cell 幾乎保留細胞所有的前值。此外,input gate (i), 和 output gate (ot), 控制自己內部的信息流動。每個門函數具有其自身的權重矩陣和偏置向量。我們用遺忘門表示下標 f 的參數函數,i 爲輸入門函數,o 爲輸出門函數 (例如,Wx f、Wh f 和 b`f 分別是 forget gate 的參數)。

3 學習智能合約漏洞

在本節中,我們建議使用順序機器學習方法來對智能合約漏洞進行建模,並解釋 LSTM 學習模型如何處理智能契約操作碼的語義表示。我們提出漏洞檢測目標,要求優化提高檢測模型精度和智能特性將操作碼排序爲一個序列。

3.1 合約脆弱性的分類

我們的 LSTM 學習模型的目標是執行一個 two-class 分類,以檢測是否有任何給定的智能合約包含安全漏洞。受優化過的概念激勵,LSTM 學習的目標就是最小化檢測損失函數,從而最大化分類精度。通過提供的損失每個培訓智能合約,我們理想地期待序列模型從錯誤中學習。

3.1.1 LSTM 預測損失的度量

學習模型的損失函數主要是應用具體並且基於它們如何影響分類器的性能來選擇。最常見的用於測量分類模型的性能是交叉熵損失(對數損失)、SOFTMAX 和平方損失。在我們的例子中,我們選擇了對數損失或二元交叉熵損失函數。當我們將智能合約漏洞檢測形式化爲二進制分類問題時,這是首選的。理解交叉熵讓我們仔細研究單個神經網絡中的神經元。假設我們嘗試使用智能合約操作碼作爲輸入來訓練網絡。在圖 4 中,神經元是用幾個輸入操作碼(x1,x2,x3)顯示,對應權重(w1,w2,w3)和偏倚項 x+
1:

3.1.2 最大化檢測精度

爲了最大化 LSTM 分類精度,我們採用最成功的最小化損失算法函數-反向傳播。反向傳播應用鏈式法則導出損失函數 L 的導數關於用於傳播脆弱性檢測的神經網絡中的局部權重和偏置參數返回到 LSTM 網絡的錯誤。這些參數是然後由用戶設置學習速率調整下降沿梯度達到最大檢測精度。同樣,我們使用 LSA 來訓練 LSTM 學習模型。小批量操作碼中基於梯度的方法。標準隨機梯度下降(SGD)更新具有以下形式:

                    w ← w+α∇W η(w)

其中α是學習率,而 ∇W η(w) 是梯度。從小批量訓練操作碼計算參數 w 的最大檢測目標(X,y)。

在我們的 LSTM 學習模型中,我們使用了有效的隨機梯度下降的亞當 Adam 優化器 . 提高收斂性和交叉驗證結果。Adam 是一種流行的啓發式基本 SGD 變體,用於通過自適應地調整每個的啓發式基本 SGD 的學習速率來加速學習。Adam 保持每個參數的學習率並根據最近的平均值來適應它們。梯度。我們發現它是一個優化器,導致快速收斂,並有助於解決非平穩問題作爲智能合約安全漏洞檢測任務提高性能。

3.2 智能合約的順序建模

在本節中,我們首先介紹由 LSTM 模型處理的 Ethereum 操作碼序列,然後使用智能合約操作碼序列作爲輸入來檢測智能契約漏洞。

3.2.1 Ethereum Opcode Sequence

與多序列相似的智能合約脆弱性檢測學習任務,包括處理順序操作碼數據。更準確地說,操作碼是由機器(虛擬或硅)解釋的一系列數字,它們表示要執行的操作類型。在 EthUM 環境中,操作碼是一種低級別的人類可讀字符串。《黃皮書》中規定的說明。機器指令語言由 Ethereum 虛擬機(EVM)處理,EVM 是基於堆棧的體系結構,字大小爲 256 位。每個指令用一個操作碼(值)定義,名稱(助記符)、δ值、α值和描述。爲了每個指令,α值是附加數。爲該指令放置在堆棧上的項。同樣,δ值是堆棧上所需的項目數。生成監督機器所需的標籤的學習過程中,合約是通過 Maian 傳遞字節碼來獲取漏洞分類。在過程中,操作碼也被檢索。由此產生的示例 EVM 操作碼,LSTM 模型如圖 6 所示那樣將其作爲輸出。合約的地址是保存了的,以及有效的對應 EVM 操作碼,和脆弱性分類(類別)到數據幀中 .

3.2.2 漏洞檢測的操作碼序列

具有順序輸入和 / 或順序輸出的許多任務可以用 RNNs 建模。對於我們的應用在操作碼智能合約漏洞檢測中,輸入由一系列操作碼組成,操作碼通常是在連續的時間步進網絡。最多的表示操作碼的簡單方法是使用二進制代碼。長度等於機器指令大小的向量列出目錄中的每個操作碼——一個熱編碼

4.1 智能合約標籤生成

我們使用了從谷歌 BigQuery 下載的 Ethunm 數據集。首先,我們使用 EVM 指令列表將契約字節碼解析爲操作碼。爲了獲得標籤對於 0 至 4799999 塊中的智能合約,我們通過 Maian 工具運行這些合約。共有 920179 份合約經過處理,產生了一些標記合約。使用 MAIAN 工具對我們的數據集進行預處理,我們收集順序操作碼,這是在 EVM 的執行代碼列表,作爲我們的 LSTM 學習模型的輸入。在數據類別中,字符串“1
0 0 0”表示陰性(Maian 沒有檢測到漏洞),“0 1 0 0”代表 suicidal,“0 0 1 1”代表 s prodigal,“0 0 0
1”代表 greedy。接下來,我們刪除了錯誤標記的合約(假)。在 Nikolic 等中確定陽性 . 作者慷慨地分享了浪子回頭和自殺的案例。以來沒有關於錯誤標記的貪婪合約的數據,我們假設所有合約都屬於貪婪(b)類根據 Nikolic 等人的研究結果,合約爲假陽性(從第 2.2 節召回)。我們刪除了它們來自我們的數據集。清洗和預處理後數據,我們報告的數量不同的合約,計算過比較合約操作碼。鑑於大量標記的合約,然後我們檢查重複。我們發現了 8640 種明顯的自殺行爲(1378),浪子(1632)和貪婪(5801)。從這個集合中,我們找到了 171 份合約,既有自殺又有浪蕩。50719 處理過的合約與先前報告的 970898 合約之間的差異和 920179 由我們處理是由於空合約。此外,我們認爲標記的數量不同。合約是由於 MAIAN 工具的更新版本 , 因爲這些數據是去年 2018 年 3 月公佈的。

4.2 預處理標記操作碼

我們收集了一個高度不平衡的中等規模的訓練集。這是一個分類問題,其中類差異很大,一個類大比例地超過其他類。

基於我們的數據集的分佈,99.03% 的合約被 Maian 標記爲不脆弱的,而僅 0.97% 的合約要麼 greedy,要麼 suicidal,要麼 r
prodigal。爲了處理不平衡集,我們將所有的脆弱的合約(8640 個樣本)分在一個類,未被分類到任何易受攻擊類別的樣本被分組到另一個類。

因此,示例被歸類爲“1 0 0 0”,沒有任何安全漏洞,以及其他未被歸類爲“1 0 0
0”的具有漏洞的樣本被分別標記爲具有整數 0 和 1 的類。接下來,我們重採樣數據集,以實現更平衡,其中 85% 的合約是從 class
0 開始,15% 的數據是由 class 1 組成的。我們在 class 0 中隨機抽取了 450000 份合約,並在 class
1 中創建了所有合約中的九個副本。執行之後重採樣,我們得到了一個更平衡的數據集 527760 個樣本,如圖 10 B 所示。MODE 激活函數。我們發現,淺 LSTM 可以很好地推廣到我們的再平衡數據集上,並且它不會過度擬合訓練樣本。

我們發現 LSTM 模型是相當容易訓練的。這個新的平衡數據集。淺層 LSTM 選擇 64 個單元和 128 維字嵌入,輸入詞彙 150 個操作碼指令。這個分類任務基於使用 sigmoid 激活函數的二進制輸出。我們發現,淺 LSTM 可以很好地推廣到我們的再平衡數據集上,並且它不會過度擬合訓練樣本。由此產生的 LSTM 有 177538 個參數 .

4.3 結果

LSTM 學習模型的實驗結果真陽性(TP)和假陽性(FP)智能合約由 MAIAN 工具標記的列於表 3 中。

4.3.1 平衡數據集

從結果來看,我們可以看到我們訓練的 LSTM 模型。性能優於 Maian 的整體性能工具。對於由 105552 個樣本組成的測試集乾淨的數據集,LSTM 模型達到了 of
97.22% 精度。

除了清理後的分類準確率爲 97.22% 之外,它還能夠正確識別 Maian 工具錯誤標記的合約。

綜上所述,在檢測智能合約的脆弱性上,LSTM 模型顯著優於 Maian,以及·LSTM 模型能夠正確分類 Maian 工具錯誤標記的合約,消除超過四分之三的假陽性錯誤。我們注意到符號分析器能夠執行智能合約屬性的深入分析,LSTM 模型能夠容易和準確檢測智能合約中的漏洞。此外,標記的合約中的具體驗證 Maian 的情況下需要創建一個私有的原始的 Etherum 塊鏈,並且它只能從合約仍然存在的特定塊高度分析活着的合約。這不僅是一項複雜而且耗時的任務,目前還不清楚如何選擇塊高度來包括所有有標記的合約。
鑑於 LSTM 模型是一種簡單的機器學習技術來實現,我們建議用學習代替具體的驗證模型。

4.3.2 通過 Maian 檢查 unflagged 合約

除了測試平衡數據集之外,我們現在提出不包括在平衡集中的合約的測試結果。考慮到這組額外的未標記合約中的大量合約,我們從中選擇 10000 個樣本的隨機子集來測試 LSTM 的分類精度。我們發現我們的學習工具已經實現 81.52% 的準確度。在測試的 10000 份樣品中,有 1848 份合約是被劃分爲弱勢羣體。LSTM 預測的分佈估計值如圖 12 所示。185 在 1848 是不同的合約,在 185 個合約集中,只有 35 個在 Etherum 上提供了 Solidity 源代碼。爲了驗證標記的 35 個合約,我們通過 Securify (一個基於網絡的安全掃描器)運行這些合約。在 35 份合約中,只有 31 份。能夠通過軟件工具進行分析。31 個契約中的 23 個被標記爲違反了若干安全問題,例如事務排序依賴性(TOD)、重入性、缺少輸入驗證以及無限制的寫到存儲。31 份合約中有 7 份被歸類爲“警告”,這意味着該工具不能保證安全性。違反合約,即使存在漏洞。

最後,在 31 個合約中只有 1 個被發現。沒有問題。這增強了我們對快速可靠的信念。識別脆弱智能合約的學習模型與標準語義 / 符號分析工具相比。我們的研究結果也揭示了一個工具的重要性。從最近持續學習新的安全漏洞智能合約,並快速產生準確的檢測結果,對廣泛的一類合約漏洞。

5 結論

我們提出了一種基於機器學習檢測智能合約漏洞的方法中,隨着時間的推移,越來越多的合約出現了新的威脅。我們的結果表明,智能契約漏洞的順序學習相對於符號分析工具提供了顯著的改進,並實現了檢測。105552 份合約的準確率爲 97%。最重要的是,76% 是辨別了合約中的洞,否則,它被認爲是一個假陽性的 Maian。我們的順序學習模型被正確地檢測到。此外,我們的方法檢測從未標記的合約中採樣的 10000 個合約的子集上的更廣泛的一類漏洞。這使得有可能建立一個普通的基於機器學習的智能合約漏洞檢測工具。並且這工具具有優越的檢測能力。

在以後的工作中,我們計劃研究最先進的序列建模技術對智能契約漏洞檢測的影響。Transformer——一個全新的簡單網絡架構,它完全消除了重複性,並且僅僅基於注意力機——已經顯示優於遞歸神經網絡。使用注意力模型的進一步實驗可能允許智能合約可以更有效地檢測漏洞。而我們基於針對給定標籤的分類正確性來測量檢測精度,剩下的挑戰是在訓練期間獲得更精確的標籤以提高模型的檢測能力。

原文鏈接請看⬇️“原文”

**
**

最後,感謝馬蹄先生的翻譯貢獻!

Nervosfans 社區正在整合資源爲想創建項目的朋友搭建平臺,

請感興趣的朋友加樂樂微信:sensus113,謝謝!

Nervos CKB 唯一官網:Nervos.org

歡迎關注 Nervos Fans

Nerovs CKB 愛好者社區

Nervos Fans 如下頻道:

NervosFans twitter:@nervosfans

NervosFans 微博:@NervosFans

NervosFans 微信公號:Nervosfans

入羣請加樂樂微信:sensus113

美果大冰微信:xj73226

備註入羣,謝謝!

長按識別二維碼

關注我們