PoS 加密貨幣存致命安全隱患,詳解最新“虛假權益”攻擊
Moni
2019-01-28 12:00
本文约8047字,阅读全文需要约32分钟
漏洞總共影響了超過26 個基於權益證明的加密貨幣,網絡攻擊者只需要利用非常少的的“權益”(stake)就能讓運行相應軟件的任何一個網絡節點崩潰。

本文來自Medium譯者| Moni

譯者| Moni

編輯| 盧曉明

編輯| 盧曉明

本文來自

譯者| Moni

譯者| Moni

編者按:本文是由伊利諾伊大學厄巴納-香檳分校(UIUC)旗下去中心化系統實驗室(Decentralized Systems Lab)調研團隊所撰寫的“資源枯竭漏洞”(resource exhaustion vulnerabilities)研究報告,該團隊成員包括Sanket Kanjalkar、Yunqi Li、Yuguang Chen、Joseph Kuo、以及顧問Andrew Miller。據悉,這些漏洞總共影響了超過26 個基於權益證明的加密貨幣,網絡攻擊者只需要利用非常少的的“權益”(stake)就能讓運行相應軟件的任何一個網絡節點崩潰。該研究團隊從2018年10月開始啟動調研工作的信息披露,旨在讓潛在受影響的加密貨幣開發人員了解此事,其中大部分加密貨幣現在已經部署了緩解措施。

二級標題

另外在本文的其他部分,我們將會詳細解釋漏洞和攻擊,以及他們會產生什麼樣的微妙後果。雖然事後看起來這個漏洞本身可能並不復雜,但是想要完全解決這個問題其實很棘手,而且目前所採取的緩解措施還存在導致區塊鏈分叉的風險(後面會詳細介紹)。

二級標題

二級標題

二級標題

  • 在深入了解“虛假權益”漏洞的細節之前,我們先介紹一下權益證明的運作方式。

  • 二級標題

二級標題

權益證明挖礦:

與工作量證明挖礦類似,權益證明挖礦業包括了區塊頭哈希值和難度目標(注:難度目標是使整個網絡的計算力大致每10 分鐘產生一個區塊所需要的難度數值)。權益證明的高級目標是確保每個利益相關者挖掘下一個區塊的機會,與他們持控制的加密貨幣數量成正比。為了實現這一點,在權益證明共識機制中,哈希值不僅取決於區塊頭,還取決於利益相關者在區塊中插入的包含在一個特殊“coinstake”交易中的代幣數量。

Coinstake 結構要求輸入數量大於等於1,且第一個輸入的Prevout 字段不能為空,即要求Kernel 必須存在,輸出數量大於等於2,且第一個輸出必須置空值。

二級標題

另外,這兩種特殊交易對於在區塊鏈中存放的位置也有特殊要求,中本聰規定每個區塊的第一筆交易必須放置Coinbase,這也意味著Coinbase 不能出現在區塊的其他位置。 Sunny King 顯然不想破壞這個規則,但他增加了一條規則,對於“權益證明”區塊第二筆交易必須放置Coinstake,這麼一來同樣意味著Coinstake 不能出現在區塊鏈上的其他地方。換言之,只要第二筆交易是Coinstake,那麼這個區塊就需要當做權益證明區塊來處理。

權益證明挖礦涉及的細節問題很多,在此就不一一贅述了,我們暫時把重點研究放在了以下兩方面:

2、Coinstake 交易所花費的UTXO(未消費交易輸出)。

二級標題

二級標題

在保護區塊驗證資源中工作量證明所扮演的角色

眾所周知,雖然工作量證明在比特幣共識中起到了至關重要的作用,但與磁盤、帶寬、內存和CPU相關的一系列問題也導致了它並不是非常受歡迎。在去中心化的加密貨幣網路中,交易的前提其實並不是基於信任的,因此為了防止資源耗盡攻擊(resource exhaustion attacks),比特幣節點在提交更多資源(比如將區塊存儲在RAM或磁盤上)之前首先要用工作量證明機制檢查所有交易接收區塊。然而事實證明,使用權益證明檢查區塊要比工作量證明復雜得多,而且這種共識機制對語義環境敏感(context-sensitive,或上下文敏感),因此很多權益證明在實施驗證的時候其實是非常“吝嗇”的。

1、“回滾”當前視圖(未消費交易輸出集合)到分叉之前的點;或者,

二級標題

2、存儲所有早期區塊的未消費交易數據集合副本。

比特幣代碼庫不支持第二種方法,即使能這麼做也會增加額外的存儲成本(比特幣節點性能依賴於不斷“修剪”不需要的數據)。而第一種方式正是比特幣代碼庫當前處理重組的方式,但這種處理方法的成本可能非常昂貴,因此當分叉鏈中的工作量證明量大於當前主區塊鏈時,回滾和完全驗證就會被推遲到最後時刻執行。因此,當節點第一次接收到不屬於最長鏈的區塊或標頭時,就會跳過完整驗證並將區塊保存到本地存儲。

在權益證明中,類似的初步檢查時驗證coinstake 交易,並檢查它是否通過了前一個區塊內核的難度目標。計算coinstake 交易的算力很容易,真正困難的檢查coinstake 交易中輸入的未消費交易數據是否有效,而且還是沒有消費過的。如前所述,由於這個操作需要檢查未消費交易數據集合,因此不適用於此前的區塊。正是由於完全驗證coinstake 交易非常困難,所以大多數基於權益證明的區塊鏈只是使用了“啟發式”或是“近似”檢查,結果顯示,這些近似檢查通常是不充分、並且可以被利用的。

漏洞一:“我不相信它不是權益”

二級標題

當我們第一次調查這個問題的時候,就發現Qtum、Particl、Navcoin、HTMLcoin 和Emercoin 這五個加密貨幣存在相當簡單的漏洞形式——即,在區塊被提交到RAM 或磁盤之前,這些加密貨幣很可能根本就沒有檢查任何coinstake 交易。這五種加密貨幣的共同之處在於它們採用了比特幣的“區塊頭為先”(headers first)功能,其中區塊傳播被分成了兩個獨立的消息,一個是區塊,另一個是區塊頭。當區塊頭通過了工作量證明之後,節點僅詢問區塊是否是最長鏈。由於coinstake 交易僅出現在區塊、而不是區塊頭中,因此節點無法靠自己來驗證區塊頭。相反,它會將一個區塊頭存儲在一個內存數據結構(mapBlockIndex)。因此,任何網絡攻擊者,甚至是沒有任何權益的攻擊者,都可以填滿潛在受攻擊節點的RAM。

這種攻擊的第二種變體主要針對代碼庫,雖然它是以稍微不同的方式進行,而且針對的也是不同資源,但其攻擊目標並不是RAM,而是磁盤。可以說,涉及磁盤的攻擊對受害節點的危害更大,如果RAM 被填滿並導致節點崩潰,只需簡單重新啟動即可;但是,如果磁盤已滿,則需要手動幹預,比如運行外部腳本以清除磁盤中的過時區塊。

利用這些漏洞中的任何一個,都可以在沒有任何權益的情況下影響加密貨幣。相比之下,對RAM 的攻擊可能影響程度較低一些,而從技術角度來看,攻擊磁盤則需要稍微小心一點,而且也都沒有任何權益要求。

二級標題

  • 二級標題

  • 漏洞二:消費權益攻擊(Spent Stake Attack)

2、檢查權益證明Kernel Hash 是否符合難度目標要求。

二級標題

第一個檢查工作是通過交易數據庫(TxDB)中查找完成的,該數據庫可以追踪當前主鏈中到目前為止的所有交易。換句話說,初步驗證總比完全不驗證要好,但完全驗證仍然無法做到,只能做到“啟發式”和“近似”驗證。如果延續這一思路進行解釋的話,可能會衍生出另外兩個問題:

二級標題

二級標題

二級標題

權益放大

你會發現,即使你只有系統0.01% 的權益,攻擊者也只需要5000 筆交易就能挖掘50%的明顯權益區塊。在攻擊者收集了大量明顯權益之後,就開始使用新收集的明顯權益輸出繼續挖掘權益證明區塊。最後,攻擊者使用無效區塊填充到受害節點的磁盤,如上圖右所示。實際上,攻擊者可以從加密貨幣交易所購買一些代幣,然後通過上述手段擴大權益,接著再把這些代幣賣回給交易所,並在之後執行攻擊,他們唯一承擔的成本就是一點點交易費用而已。

協調漏洞披露

二級標題

我們首先調查了Particl 和Qtum 兩個加密貨幣是否存在“漏洞一”,即這些加密貨幣在區塊被提交到RAM 或磁盤之前,到底有沒有檢查任何coinstake 交易。為了確定該漏洞的影響程度,我們在2018 年8 月9 日從CoinMarketCap.com 上收集了按市值排序的已知加密貨幣列表,並且通過基於區塊鏈權益證明共識類型進行了篩選。需要說明的是,我們只研究了代碼庫從比特幣衍生分叉出的加密貨幣,一共檢查了26 個加密貨幣,發現有五個加密貨幣受到了漏洞影響,分別是Qtum、Navcoin、HTMLcoin、Emercoin和Partickl,但我們的攻擊似乎並不適用於其他的加密貨幣。

為了進一步確認漏洞,我們又在五個受影響的代碼庫中實施了攻擊。我們利用比特幣軟件中現有的測試套件——特別是“ regtest ”模式,該模式支持模擬時間戳,而且很容易就能創建區塊。此外,我們還基於比特幣TestFramework 構建了一個基於Python 開發語言的測試節點,並允許它可以通過攻擊者行為進行擴展。我們使用了Docker 容器進行測試,同時還把之間的依存關係和受影響的特定提交算力(commit hash)打包到了一個可多次使用的工具包中,作為漏洞披露的一部分,我們可以輕鬆地把這些信息與所有五個受影響的開發團隊共享。

然而,這裡還存在了一個比較“麻煩”的問題,就是大多數代碼庫沒有使用“regtest”模式,因此我們無法直觀地演示攻擊、或是為每個代碼庫提供一個可多次使用的工具包。因此,我們只提供了stratisX 的C++ 代碼庫演示。基於代碼庫中的相似性,我們告知所有15 個潛在受影響的加密貨幣開發團隊——我們認為,他們的代幣會收到漏洞攻擊影響。其中,有5 個加密貨幣開發團隊承認了這個漏洞,3 個加密貨幣開發團隊仍在調查,另外3 個團隊並不承認該漏洞(並指出如果實施一些升級改變可以緩解問題),4 個團隊還沒有給予任何回應。對於沒有給予回复的4 個團隊,我們通過他們的網站找到了聯繫方式,並且在GitHub 代碼庫裡放了檢查漏洞的可重複性工具包。

二級標題

二級標題

緩解措施

“區塊鏈分裂”風險還會為敵對礦工引入新的攻擊媒介,攻擊者可能會嘗試秘密挖掘長鏈,然後將其發佈到節點子集(a subset of the nodes)以導致區塊鏈斷裂。初始區塊下載(Initial Block Download)中的節點、以及長時間離線剛剛重新啟動的節點特別容易受到此類攻擊,而且該攻擊還可以和eclipse攻擊相結合,將誠實節點“引入”到攻擊者控制的區塊鏈上。

二級標題

最後的想法

最後的想法

因此你會發現,所有這些緩解措施只是讓攻擊難以執行,但卻無法真正替代完全驗證。據悉,包括Qtum 在內的一些加密貨幣正計劃在未來版本中對非主區塊鏈上的區塊進行完全驗證。

二級標題

二級標題

Moni
作者文库