當我們談論區塊鏈時,總是離不開這些技術:分佈式存儲、P2P 網絡和共識機制,本次我們要談的問題就是出現在 P2P 對等網絡協議上。

異形攻擊實際上是一個所有公鏈都可能面臨的問題,我們用以太坊爲例子說明。以太坊的 P2P 網絡主要採用了 Kademlia (簡稱 Kad ) 算法實現,Kad 是一種分佈式哈希表 ( DHT ) 技術,使用該技術,可以實現在分佈式環境下快速而又準確地路由、定位數據的問題。

原文標題:《衝突的公鏈!來自 P2P 協議的異形攻擊漏洞》
作者:慢霧安全團隊

什麼是異形攻擊?

首先,我們先定義一個同類鏈的概念,是指使用了和其它區塊鏈相同或兼容協議的區塊鏈系統。

異形攻擊又稱地址池污染,是指誘使同類鏈的節點互相侵入和污染的一種攻擊手法,漏洞的主要原因是同類鏈系統在通信協議上沒有對非同類節點做識別。

以太坊異形攻擊是指,以太坊同類鏈(具體的說是使用以太坊 P2P discv4 節點發現協議的公鏈,包括以太坊、以太經典)由於使用了兼容的握手協議,無法區分節點是否屬於同個鏈,導致地址池互相污染,節點通信性能下降,最終造成節點阻塞的一種攻擊方式。

##### 1、正常的節點發現過程

以太坊同類鏈節點間通過 4 個 UDP 通信協議來完成節點發現,消息結構如下:

[1] ping: 探測一個節點是否在線

硬核:異形攻擊 —— 讓兩條不同公鏈無法區分彼此

[2] pong: 響應 Ping 命令

硬核:異形攻擊 —— 讓兩條不同公鏈無法區分彼此

[3] findnode: 查找與 Target 節點異或距離最近的其他節點

硬核:異形攻擊 —— 讓兩條不同公鏈無法區分彼此

[4] neighbors: 響應 FindNode 命令,會返回一或多個節點

硬核:異形攻擊 —— 讓兩條不同公鏈無法區分彼此

2、攻擊過程

準備工作:收集以太坊節點地址

我們找到了社區製作的一個地址庫:
https://github.com/smartheye/EthStaticNodesTool/blob/master/MainNet/static-nodes.txt

第一步:發起惡意握手。

攻擊者 A 模擬整個握手過程,主動發起 ping 操作,並利用協議的第 4 步 neighbors,將返回的鄰居表修改成我們收集到的以太坊節點地址,推送給受害節點 B (B 是一個以太坊同類鏈節點)。由於單次通信只能推送 16 個地址,我們需要多次推送以達到攻擊效果。

第二步:污染地址池。

B 收到大量 A 返回的鄰居表,嘗試跟這些節點握手,並將這些節點加入了自己的地址池(俗稱 K 桶)。

第三步:污染自動擴散。

讓人意外的是,不同鏈的節點居然互相握手成功了,更爲可怕的是,它們把各自地址池裏已知的節點推送給了對方,導致更多的節點互相污染,最終擴散致整個網絡。

## 漏洞危害

  • 受異形攻擊的同類鏈節點無法找到真正可用的節點,無法建立 TCP 數據同步通道,導致節點被攻擊離線;
  • 對於礦池或者出塊節點,異形攻擊可能導致廣播延遲甚至失敗,造成收益損失;
  • 異形攻擊可以使所有以太坊同類鏈地址池相互污染,導致節點通信效率全面下降,對整個區塊鏈系統造成長久的傷害。

## 影響範圍

我們對知名公鏈 QuarkChain 進行安全審計時發現,QuarkChain 的節點在遭受異形攻擊後,節點性能嚴重下降,外部節點需要很長時間才能與受害節點建立連接。QuarkChain 團隊隨後修復了該問題。

理論上所有使用了以太坊 discv4 協議的區塊鏈都可能受此漏洞影響,在發起測試後的一段時間,我們觀測到 EtherNode 的監測節點也已經被污染了,污染的擴散速度似乎比想象中的要快。

硬核:異形攻擊 —— 讓兩條不同公鏈無法區分彼此

也許,以太坊需要來一次清洗。

## 後記

1、 此漏洞對以太坊是否有影響?

以太坊的節點數量遠大於其它同類鏈節點,並且節點間已經建立了穩定的連接,影響不明顯。但對於其它的同類鏈節點,卻會受到來自以太坊節點的強勢侵入,導致通信阻塞。

2、 很多朋友關心除了以太坊之外,其它的公鏈是否有此問題,比如比特幣和它的山寨幣,比如使用了 libp2p 協議的公鏈,這些問題我們將在後續文章中披露!

十分感謝 QuarkChain 團隊大力協助本次測試!