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