EPoD: 以太坊Geth客戶端拒絕服務漏洞 (CVE-2018-12018)
迄今為止,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或電子郵件與我們聯絡。
相關文章
- 第六課 以太坊客戶端Geth命令用法-引數詳解客戶端
- 以太坊客戶端 Geth 出漏洞,超過 2000 萬美元的數字貨幣被盜客戶端
- 以太坊Geth安裝
- Linux 曝出 TCP 拒絕服務漏洞LinuxTCP
- 以太坊連載(六):以太坊客戶端的選擇與安裝客戶端
- 以太坊學習筆記————6、以太坊客戶端選擇與介紹筆記客戶端
- Linux 核心曝出 TCP 拒絕服務漏洞LinuxTCP
- 服務端,客戶端服務端客戶端
- 客戶端,服務端客戶端服務端
- VNC拒絕服務漏洞(CVE-2015-5239)分析VNC
- 以太坊客戶端go-thereum本地編譯及使用客戶端Go編譯
- ETH官方客戶端Geth的使用(一)客戶端
- 通過Geth搭建私有以太坊網路
- 升級openssl - OpenSSL 拒絕服務漏洞 (CVE-2020-1971)
- 通過命令列在 Python 中測試以太坊 RPC 客戶端命令列PythonRPC客戶端
- 通過命令列在Python中測試以太坊RPC客戶端命令列PythonRPC客戶端
- 透過命令列在 Python 中測試以太坊 RPC 客戶端命令列PythonRPC客戶端
- 服務端渲染和客戶端渲染服務端客戶端
- Geth簡介及如何執行以太坊節點
- 以太坊原始碼分析(39)geth啟動流程分析原始碼
- 以太坊學習記錄+geth配置+私有鏈搭建
- python建立tcp服務端和客戶端PythonTCP服務端客戶端
- 以太坊客戶端Parity在重大升級中丟棄錢包技術客戶端
- 以太坊學習筆記————7、以太坊賬戶管理筆記
- OSSEC服務端配置客戶端批次部署方案服務端客戶端
- golang實現tcp客戶端服務端程式GolangTCP客戶端服務端
- 以太坊之賬戶管理
- macOS 自帶的ftp服務端&vnc客戶端MacFTP服務端VNC客戶端
- rsync備份【基於客戶端與服務端】客戶端服務端
- 埃森哲:端到端客戶服務報告
- MQTT伺服器搭建服務端和客戶端MQQT伺服器服務端客戶端
- CRLF注入 URL重定向 WEB拒絕服務Web
- 客戶服務CRM系統,提供優質客戶服務
- Geth命令用法-引數詳解 and 以太坊原始碼檔案目錄原始碼
- 微服務架構,客戶端如何catch服務端的異常?微服務架構客戶端服務端
- 使用Apollo Server搭建GraphQL的服務端和客戶端Server服務端客戶端
- 服務端如何獲取客戶端請求IP地址服務端客戶端
- 實現客戶端與服務端的HTTP通訊客戶端服務端HTTP