當(dāng)我們談?wù)搮^(qū)塊鏈時,總是離不開這些技術(shù):分布式存儲、P2P 網(wǎng)絡(luò)和共識機制,本次我們要談的問題就是出現(xiàn)在 P2P 對等網(wǎng)絡(luò)協(xié)議上。異形攻擊實
當(dāng)我們談?wù)搮^(qū)塊鏈時,總是離不開這些技術(shù):分布式存儲、P2P 網(wǎng)絡(luò)和共識機制,本次我們要談的問題就是出現(xiàn)在 P2P 對等網(wǎng)絡(luò)協(xié)議上。
異形攻擊實際上是一個所有公鏈都可能面臨的問題,我們用以太坊為例子說明。以太坊的 P2P 網(wǎng)絡(luò)主要采用了 Kademlia (簡稱 Kad ) 算法實現(xiàn),Kad 是一種分布式哈希表( DHT )技術(shù),使用該技術(shù),可以實現(xiàn)在分布式環(huán)境下快速而又準(zhǔn)確地路由、定位數(shù)據(jù)的問題。
什么是異形攻擊?
首先,我們先定義一個同類鏈的概念,是指使用了和其它區(qū)塊鏈相同或兼容協(xié)議的區(qū)塊鏈系統(tǒng)。
異形攻擊又稱地址池污染,是指誘使同類鏈的節(jié)點互相侵入和污染的一種攻擊手法,漏洞的主要原因是同類鏈系統(tǒng)在通信協(xié)議上沒有對非同類節(jié)點做識別。
以太坊異形攻擊是指,以太坊同類鏈(具體的說是使用以太坊 P2P discv4 節(jié)點發(fā)現(xiàn)協(xié)議的公鏈,包括以太坊、以太經(jīng)典)由于使用了兼容的握手協(xié)議,無法區(qū)分節(jié)點是否屬于同個鏈,導(dǎo)致地址池互相污染,節(jié)點通信性能下降,最終造成節(jié)點阻塞的一種攻擊方式。
1. 正常的節(jié)點發(fā)現(xiàn)過程
以太坊同類鏈節(jié)點間通過 4 個 UDP 通信協(xié)議來完成節(jié)點發(fā)現(xiàn),消息結(jié)構(gòu)如下:
[1] ping: 探測一個節(jié)點是否在線
[2] pong: 響應(yīng) Ping 命令
[3] findnode: 查找與 Target 節(jié)點異或距離最近的其他節(jié)點
[4] neighbors: 響應(yīng) FindNode 命令,會返回一或多個節(jié)點
2. 攻擊過程
準(zhǔn)備工作:收集以太坊節(jié)點地址
我們找到了社區(qū)制作的一個地址庫: https://github.com/smartheye/EthStaticNodesTool/blob/master/MainNet/static-nodes.txt
第一步:發(fā)起惡意握手。
攻擊者 A 模擬整個握手過程,主動發(fā)起 ping 操作,并利用協(xié)議的第 4 步 neighbors,將返回的鄰居表修改成我們收集到的以太坊節(jié)點地址,推送給受害節(jié)點 B(B 是一個以太坊同類鏈節(jié)點)。由于單次通信只能推送 16 個地址,我們需要多次推送以達(dá)到攻擊效果。
第二步:污染地址池。
B 收到大量 A 返回的鄰居表,嘗試跟這些節(jié)點握手,并將這些節(jié)點加入了自己的地址池(俗稱 K 桶)。
第三步:污染自動擴散。
讓人意外的是,不同鏈的節(jié)點居然互相握手成功了,更為可怕的是,它們把各自地址池里已知的節(jié)點推送給了對方,導(dǎo)致更多的節(jié)點互相污染,最終擴散致整個網(wǎng)絡(luò)。
漏洞危害
受異形攻擊的同類鏈節(jié)點無法找到真正可用的節(jié)點,無法建立 TCP 數(shù)據(jù)同步通道,導(dǎo)致節(jié)點被攻擊離線。
對于礦池或者出塊節(jié)點,異形攻擊可能導(dǎo)致廣播延遲甚至失敗,造成收益損失。
異形攻擊可以使所有以太坊同類鏈地址池相互污染,導(dǎo)致節(jié)點通信效率全面下降,對整個區(qū)塊鏈系統(tǒng)造成長久的傷害。
影響范圍
我們對某知名公鏈進(jìn)行安全審計時發(fā)現(xiàn),該公鏈的節(jié)點在遭受異形攻擊后,節(jié)點性能嚴(yán)重下降,外部節(jié)點需要很長時間才能與受害節(jié)點建立連接。該公鏈團(tuán)隊隨后修復(fù)了該問題。
理論上所有使用了以太坊 discv4 協(xié)議的區(qū)塊鏈都可能受此漏洞影響,在發(fā)起測試后的一段時間,我們觀測到 EtherNode 的監(jiān)測節(jié)點也已經(jīng)被污染了,污染的擴散速度似乎比想象中的要快。
也許,以太坊需要來一次清洗。
后記
1、 此漏洞對以太坊是否有影響? 以太坊的節(jié)點數(shù)量遠(yuǎn)大于其它同類鏈節(jié)點,并且節(jié)點間已經(jīng)建立了穩(wěn)定的連接,影響不明顯。但對于其它的同類鏈節(jié)點,卻會受到來自以太坊節(jié)點的強勢侵入,導(dǎo)致通信阻塞。
2、 很多朋友關(guān)心除了以太坊之外,其它的公鏈?zhǔn)欠裼写藛栴},比如比特幣和它的山寨幣,比如使用了 libp2p 協(xié)議的公鏈,這些問題我們將在后續(xù)文章中披露!