EPoD: 以太坊Geth客戶端拒絕服務漏洞 (CVE-2018-12018)

FLy_鵬程萬里發表於2018-07-15

迄今為止,PeckShield發現了很多嚴重的智慧合約漏洞。除了智慧合同外,以太坊生態系統還包括其他各種可能受到攻擊的元件。

顯然,一個這樣的元件是以太坊的核心,也就是每個以太坊節點上執行的底層客戶端軟體。

如果攻擊者使某個以太坊客戶端/節點崩潰,那麼此客戶端/節點提供的計算能力也隨之消失。如果大量以太坊的客戶/節點突然間斷線,他們相應的計算能力可能會立即失效,從而嚴重干擾以太坊的整個運營。

在撰寫本文時,我們將揭示流行的以太坊客戶中發現的一個嚴重漏洞,這些漏洞可能會被利用來對整個以太坊網路造成嚴重影響。

背景

在深入研究這些漏洞的細節之前,我們首先介紹以太坊客戶端。正如以太坊基金會網站所寫,以太坊客戶端有三個獨立的官方實施。這些客戶對維護共識具有幾乎相同的功能。三者之中的Go Ethereum,又名GETH,是用GO編寫的官方實現,它是完全開源的,並且在GNU LGPL v3下獲得許可。

而且,它也是最受歡迎的以太坊客戶端。根據Ethernodes的資料,geth擁有大約三分之二的份額,而Parity(Parity Technologies的Rust實現)佔有剩餘的三分之一(圖1)。


圖1:來自以太坊的各種以太坊客戶的市場份額

此外,來自Ethstats的資料顯示了類似的統計資料(圖2)。


圖2:Ethstats的不同以太坊客戶端

鑑於geth是以太坊網路中的大多數,它的任何關鍵脆弱點都可能對整個以太坊生態系統造成嚴重損害。PeckShield的研究人員發現了一系列可能導致系統崩潰或凍結任何節點的漏洞。這些錯誤可能會降低以太坊網路的大部分計算能力。

細節

在以太坊的核心,所有客戶端實施都應遵循相同的協議來維護共識。這些協議包括RLPx,ÐΞVp2p和許多子協議,如Ethereum Wire子協議或Light Ethereum子協議。


圖3:以太坊協議棧

圖3顯示了以太坊中使用的協議層。為了支援“輕量級”客戶端,Light Ethereum子協議(LES)允許以太坊節點只下載塊頭,並隨需獲取區塊鏈的其他部分。為了實現這一點,我們還需要一個充當LES伺服器的完整(或存檔)節點來為光節點提供服務。以下命令可以啟動具有LES支援的完整geth節點:

geth --lightserv 20

當LES客戶端從LES伺服器請求塊頭時,GetBlockHeaders訊息從客戶端傳送,伺服器端的訊息處理程式解析訊息。下圖顯示了GetBlockHeaders訊息處理程式的geth實現的程式碼片段:


圖4:geth中的GetBlockHeaders處理程式

在這裡,LES客戶端按以下格式傳送查詢:

// getBlockHeadersData represents a block header query.
type getBlockHeadersData struct {
    Origin  hashOrNumber	// Block from which to retrieve headers
    Amount  uint64		// Maximum number of headers to retrieve
    Skip    uint64		// Blocks to skip between consecutive headers
    Reverse bool		// Query direction
}

從第17行開始,非反向的情況由LES伺服器處理。在第19行中,LES伺服器在跳過query.Skip塊後檢查是否仍有可用的塊頭。如果檢查通過,則呼叫GetBlockHashesFromHash()(第20行),並返回一個塊標題陣列。

但是,輸入的查詢資料未經正確驗證。攻擊者可以使用query.Skip = -1(0xFFF ... F)製作惡意查詢。當query.Skip + 1傳入GetBlockHashesFromHash()時,將分配最大大小為0的陣列。然後,通過訪問索引為query.Skip = 0xFFF ... F的零大小陣列,LES伺服器崩潰。

時間線



圖5:CVE-2018-12018錯誤報告

這是該系列的第一部分,我們稍後會揭示其他發現。

關於我們

PeckShield Inc.是一家領先的區塊鏈安全公司,其目標是提升當前區塊鏈生態系統的安全性,隱私性和可用性。對於任何商業或媒體查詢,請通過電報Twitter電子郵件與我們聯絡。

相關文章