TEETHER:發現以太坊的自動化漏洞

TEETHER:發現以太坊的自動化漏洞

1.1 引用

Krupp, Johannes, and Christian Rossow. "teether: Gnawing at ethereum to automatically exploit smart contracts." 27th {USENIX} Security Symposium ({USENIX} Security 18). 2018.

1.2 摘要

比特幣一類的加密貨幣不僅提供分散的貨幣,而且還提供了一種處理交易的程序化方式。以太幣是比特幣以外的第二大加密貨幣,它是第一個提供圖靈完備語言來指定交易處理的平臺,從而實現所謂的智能合約。這樣的交易方式為攻擊者提供了一個合適的環境,因為安全漏洞與經濟利益緊密相關。在本文中,我們考慮智能合約的自動漏洞識別和漏洞利用生成問題。 我們開發了易受攻擊合同的通用定義,並使用它來構建 TEETHER,這個工具允許僅在給定二進制字節碼的情況下為合同創建漏洞。我們對所有 38,757 個以太坊合同進行了大規模分析,在其中 815 個合約中我們的工具找到了完全自動化的工作漏洞。

1.3 技術介紹

加密貨幣被廣泛認為是過去幾年中最具破壞性的技術之一。他們的核心價值主張是提供分散的貨幣,不受銀行這種中心繫統的支持,而是建立在密碼學和分佈式計算的概念之上。這是通過使用區塊鏈來實現的,區塊鏈是一種可公開驗證的僅附加數據結構,其中記錄了 所有交易。該數據結構由對等網絡維護。該網絡的所有節點遵循協商一致協議,該協議管理事務處理並使區塊鏈保持一致狀態。此外,共識協議保證區塊鏈不能被攻擊者修改,除非它們控制整個網絡中的大部分計算能力。

雖然比特幣仍然是主要的加密貨幣, 但它也激發了許多衍生系統。其中最受歡迎的是以太坊,它是 2018 年中期按市場總體市值計算的第二大加密貨幣。 以太坊大大擴展了共識協議處理事務的方式:雖然比特幣允許指定在處理事務時要執行的簡單檢查, 但以太坊允許以圖靈完備語言指定這些規則。這使得以太坊成為所謂的智能合約的頭號平臺。 智能合約在字面上可以看作是在代碼中形式化的合同。在以太坊中,智能合約是用一種名為 Solidity的高級 JavaScript 語言定義的,然後被編譯成適合以太坊虛擬機(EVM)理解的字節碼錶示。締約方可以通過以太坊的交易與本合同互動。 共識協議保證了 EVM 中正確的合同執行。 當然,增加的複雜性是以增加風險為代價的,以太坊的圖靈完備穩定性比比特幣中指定的簡單檢查更容易出錯。更糟糕的是,一旦部署,智能合約就是不可變的,無法修補或更新。這導致了無與倫比的軟件漏洞和經濟損失的耦合。事實上,自 2015 年以太坊誕生以來,已經發現了幾起智能合約漏洞,導致數千萬美元的損失。隨著以太坊變得越來越受歡迎和有價值,智能合約漏洞的影響只會增加。 在這項工作中,我們解決了自動漏洞發現的問題, 更確切地說,是一般的自動漏洞。我們的攻擊者模型假設一個常規的沒有特殊功能的以太坊用戶,其目標是從給定的合同中抓住漏洞。為此,我們首先給出合同脆弱性的通 用定義。我們的定義基於以下觀察:從一個賬戶(合同)到另一個賬戶的價值轉移只能在少數明確的條件下進行。特別是,我們確定了價值轉移中必然涉及的四個關鍵的低級 EVM 指令:一個用於創建常規事務( CALL ),一個用於合同終止 ( SELFDESTRUCT ) , 兩 個 用 於 代 碼 注 入 (CALLCODE,DELEGATECALL)。 我們提出了一種方法,用於在合同中查找易受攻擊的命令進行跟蹤,並使用符號執行來自動創建漏洞利用。 我們的方法如下:我們在合同的控制流程圖中搜索某 些關鍵路徑。具體來說,我們確定了導致關鍵指令的 路徑,其中指令的參數可以由攻擊者控制。找到路徑 後,我們利用符號執行將此路徑轉換為一組約束。使 用約束求解,我們可以推斷出攻擊者必須執行的事務 才能觸發漏洞。智能合約的特殊執行環境使這成為一 項非常重要的任務。最值得注意的是,我們展示瞭如 何以符號方式處理哈希值,這些哈希值在智能合約中 廣泛使用。 為了證明我們的方法的實用性,我們最終對從區塊 鏈中提取的 38,757 個獨立的合同進行了大規模分析。 TEETHER發現了 815(2.10%)個合同的完全自動化的漏洞,無需人工干預或手動驗證,也不需要合同源代碼。由於代碼共享,這使得至少 1,731 個賬戶的資金面臨風險。此外,一個案例研究表明,許多潛在的漏洞是由 Solidity 的設計選擇和對 EVM 執行模型的誤解造成的。

1.3.1 智能合約漏洞

智能合約通常會強制控制允許誰與他們互動。一個特別重要的保證是合同只允許“授權”以太坊賬戶接收存儲在合同中的貨幣。在這種情況下,如果合同允許攻擊者將以太幣從合同轉移到攻擊者控制的地址,則合同很容易受到攻擊。從這些易受攻擊的合同中,攻擊者可以竊取存儲在其中的所有(或至少部分)以太幣,這可能導致合同所有者的全部價值損失。 我們現在描述如何識別以太坊合同中的此類漏洞。 我們的想法是靜態分析合同的代碼,以揭示可能被濫用以竊取合同中存儲的以太網的關鍵代碼部分。為此, 我們將描述上述漏洞如何映射到 EVM 指令。我們確定了四條關鍵的 EVM 指令,其中一條必須執行才能從合同中提取以太幣。這四條指令分為兩類:兩條指令導致直接傳輸,兩條指令允許在契約的上下文中執行任意以太網字節碼。

以太坊正式規範中描述的兩條 EVM 指令允許將值傳送到給定地址:CALL 和 SELFDESTRUCT。CALL 指令執行常規事務,如果攻擊者可以在使用非零第三堆棧參數執 行 CALL 指令時控制第二個堆棧參數(to),則它們可以使合同將值傳輸到其控制下的地址。 SELFDESTRUCT 指令用於終止合同,這將導致合同被刪除,不允許進一步調用此合同。SELFDESTRUCT 採用一個地址參數,該合同的所有剩餘資金將轉移到該地址。如果攻擊者在控制最頂層的堆棧元素時可以導致執行 SELFDESTRUCT 指令,他可以獲得所有合同的資金,並導致該合同的永久拒絕服務。

雖然 CALL 和 SELFDESTRUCT 是允許攻擊者直接將資金從合同轉移到給定地址的兩條指令,但這並不意味著缺少這兩條指令的合同不易受到攻擊。為了便於庫和代碼重用,EVM 提供 CALLCODE 和 DELEGATECALL 指令,允許在當前合同的上下文中執行第三方代碼。CALLCODE 非常類似於 CALL,唯一的例外是它不執行事務,而是當前合同本身就可以看做它的代碼。DELEGATECALL是同樣的,但保持發送者和值得原始值。

1.3.2 智能合約脆弱狀態

總而言之,對以太坊指令的系統分析使我們能夠精確定義合約何時處於脆弱狀態:

定義 1(關鍵路徑)。關鍵路徑也是潛在的執行跟蹤方式。

1. 導致執行帶有非零第三堆棧元素的 CALL 指令, 其中第二個堆棧參數可以在外部控制。

2. 導致執行 SELFDESTRUCT 指令,其中第一個堆棧參數可以在外部控制。

3. 導致執行 CALLCODE 或 DELEGATECALL 指令,其中第二個堆棧參數可以從外部控制。

定義 2(脆弱狀態)。

如果事務可以導致執行關鍵路徑,則合同處於易受攻擊狀態。 我們將通過其中一個關鍵指令作為關鍵事務來調用利用易受攻擊狀態的合同的事務。

1.3.3 TEETHER

下圖顯示了TEETHER的整體架構。首先,CFG回覆模塊反彙編EVM字節碼並重構建控制流圖(CFG)。接下里,掃描此CFG以獲取相關指令以及狀態變更指示。路徑生成模塊探索來自CFG根的路徑,這些路徑通向這些指令,約束生成模塊通過符號執行從中創建一組路徑約束。最後,漏洞利用生成模塊解決了關鍵路徑和狀態變化路徑的組合約束以產生可利用的漏洞。

TEETHER:發現以太坊的自動化漏洞

圖1 TEETHER整體架構

當我們開始搜索漏洞時,我們的評估會將合同的存儲初始化為空狀態。這使我們能夠結合共享相同代碼的合同分析,將工具運行次數從 784,344 減少到 38,757,並將整個運行時間減少了大約 20 倍。但是,這是以不精確的結果為代價的。 正如我們已經在 112 個案例中觀察到的那樣,針對具有空存儲的合同起作用的漏洞可能不會對具有已填充存儲的同一合同起作用。相反,我們當前的評估可能也會錯過僅在存儲包含某些條目時才有效的漏洞利用。然而,這不是 TEETHER 的基本限制,可以通過從真正的以太坊區塊鏈中檢索實際存儲狀態, 並將其重新應用到我們的本地測試平臺來解決。雖然它需要單獨處理所有摺疊的非唯一合同,因為每個地址都有自己的存儲狀態,所獲得的結果將是合理的。

1.4 本文主要貢獻

我們總結了我們的核心貢獻如下:

1. 我們基於低級 EVM 指令提供了易受攻擊合同的通用定義。

2. 我們開發了一個工具TEETHER,它僅從合同的字節碼提供端到端的可利用漏洞生成。為此,我們解決了幾個特定於 EVM 的挑戰,例如象徵性地處理哈希值的新方法。

3. 我們提供了從以太坊區塊鏈中提取的 38,757 個獨立的合同的大規模脆弱性分析。


分享到:


相關文章: