針對PoS加密貨幣的“偽造權益”攻擊,這些幣種已不幸中招
前言:我們知道,很多PoS加密貨幣,其實是比特幣程式碼庫的分叉(或者至少是其後代),關鍵的區別在於,它們用幣的所有權證明(PoS)取代了比特幣的工作量證明(PoW)。然而,一些設計思想被不安全地複製,導致這些幣種出現了一些新的漏洞,而它們在比特幣父程式碼庫中是不存在的。
本文公開了由Sanket Kanjalkar(sanket1729,[email protected])、Yunqi Li、Yuguang Chen、Joseph Kuo和Andrew Miller組成的學生小組在去中心化系統實驗室(Decentralized Systems Lab)調查的一系列資源耗盡漏洞。這些漏洞總共影響了26種以上的權益證明(PoS)加密貨幣,並允許持有少量權益的網路攻擊者破壞執行相應軟體的任何網路節點。這次研究是從2018年10月份開始的,並且研究人員已在文章公開之前通知了受影響的加密貨幣開發團隊,他們當中的大多數已部署了緩解措施。
(圖片來自:itradeico)
權益證明(PoS)加密貨幣,尤其是基於PoSv3(第三版本PoS)的那些幣種,它們和比特幣是很相似的,因為它們使用的是UTXO模型和最長鏈共識規則。關鍵的區別在於,它們用幣的所有權證明取代了工作量證明(PoW)。
PoS機制的潛在好處包括減少環境影響,以及更好地抵禦51%攻擊。事實上,很多PoS加密貨幣是比特幣程式碼庫的分叉(或者至少是其後代),然後植入了PoS機制。然而,一些設計思想被不安全地複製,導致這些幣種出現了一些新的漏洞,而它們在比特幣父程式碼庫中是不存在的。
我們將這些漏洞稱為“ 偽造權益 ”攻擊。本質上,它們之所以起作用,是因為PoSv3實現在提交寶貴的資源(磁碟和RAM)之前沒有充分驗證網路資料。其結果是,沒有太多權益(幣)的攻擊者(在某些情況下甚至不需要幣)可通過偽造資料填充受害者的磁碟或RAM,來導致其節點崩潰。我們認為,所有基於UTXO和最長鏈PoS模型的加密貨幣都很容易受到這種 “偽造權益”攻擊。本文的最後,列出了經研究人員調查並被認為會受影響的加密貨幣列表。
在本文的其餘部分,我們將詳細解釋漏洞和攻擊,因為它們有一些微妙的後果。雖然漏洞本身在事後看來是很簡單的,但要完全解決這一問題卻是很棘手的,迄今為止各專案方所採用的緩解措施,都是以鏈分裂風險為代價的(稍後將詳細介紹)。
背景
在深入研究這些漏洞的細節之前,我們先介紹一下基於PoS機制的鏈是如何工作的。
PoS挖礦:
與工作量證明(PoW)挖礦類似,PoS中的挖礦也包含比較區塊頭的雜湊值和難度目標。PoS的高層次目標是確保每個利益相關者挖掘下一個區塊的機會與他們持有的token數量成正比。為了實現這一點,在基於PoS的區塊鏈中,雜湊不僅取決於區塊頭,還取決於利益相關者插入區塊中的特殊“CoinShare”交易中包含的幣數量。關於PoS挖礦的完整細節,你可以在Earlz的 部落格文章中找到一個詳盡的解釋。對於這篇文章,重要的是檢查 PoS取決於
1) coinstake交易,2) 以及被coinstake交易所使用的UTXO。
工作量證明(PoW)在保護區塊驗證資源方面的作用:
眾所周知,PoW在比特幣共識中起著至關重要的作用。但是,PoW也起到了第二個不太被重視的作用:即保護對節點有限資源(如磁碟、頻寬、記憶體和CPU)的訪問。在無許可的加密貨幣網路中,對等節點不需要信任。因此,為了防止資源耗盡攻擊,比特幣節點在提交更多資源(如將區塊儲存在RAM或磁碟上)之前,首先會檢查 PoW是否有任何接收到的區塊。然而,事實證明,檢查PoS比驗證PoW要更復雜,其對環境也更加敏感。因此,很多基於PoS的鏈實現,忽略了適當的驗證。
為了理解這是如何導致資源耗盡漏洞的,我們必須在驗證之前提供一些關於如何儲存區塊的詳細資訊。一個節點不僅必須在當前時刻跟蹤最長鏈,還必須跟蹤鏈的分叉數(其中任何一個都可能會成為最長鏈,在這種情況下,節點需要“重新組合”才能切換到它)。這可能發生,例如,在一次拙劣升級、一次雙花攻擊(等51%攻擊)或在一次臨時網路分割槽期間。
驗證這些脫離主鏈的區塊是困難的。要完全驗證這些區塊,你需要前一區塊時間的一組未用幣(UTXO)。比特幣將UTXO集保留在了最佳鏈的當前尖端,而不是在過去的其他區塊。有兩種主要方法可以完全驗證分叉上的區塊:
- “回滾”當前檢視(UTXO集)到分叉開始前的點
- 或儲存所有早期區塊的UTXO集副本。
比特幣的程式碼庫不支援選項2,即使這樣做,也會增加儲存成本(比特幣節點效能依賴於大量刪減不需要的資料)。選項1正是比特幣程式碼庫當前處理reorg的方式。但是,這可能非常昂貴,因此回滾和完全驗證將延遲到最後一個可能的時刻,此時分叉中的工作量證明已經大於當前的主鏈。因此,當對等端第一次收到一個不是最長鏈的區塊或區塊頭時,將跳過完全驗證,並將該區塊儲存到本地儲存。
在將區塊儲存到磁碟之前,比特幣程式碼庫根據PoW執行一些初步驗證(但忽略交易)。此初步檢查僅依賴於前一個區塊頭和當前區塊頭,因此節點可以非常快速地執行此操作。這是一個有效的防禦,因為其生成有效的POW,通過它是非常昂貴的。也就是說,雖然我們可欺騙比特幣節點在磁碟上儲存一個無效的區塊,但進行這樣的資源耗盡攻擊,其代價是非常昂貴的。
PoS中類似的初步檢查,是驗證 coinstake
交易,並檢查與當前一個區塊的核心進行雜湊時,它是否通過難度目標。計算coinstake 交易的雜湊是很容易的,而困難的部分是檢查coinstake交易的輸入UTXO是否有效和未使用,因為這需要檢查UTXO集,正如前面提到的,該集對於過去的區塊是不可用的。由於完全驗證coinstake 交易是困難的,大多數基於PoS 機制的鏈提供了啟發式或近似檢查。結果表明,這些近似值往往不充分,可被加以利用。
漏洞#1: 不需要權益的攻擊
當我們第一次調查這個問題時,我們發現有5種加密貨幣:Qtum(量子鏈)、Particl、Navcoin、HTMLcoin以及Emercoin表現出這一漏洞的相當輕微的形式:即在將區塊提交到RAM或磁碟之前,它們根本沒有檢查任何coinshare交易。這五種加密貨幣的共同點是,它們採用了比特幣的“區塊頭優先”功能,其中,區塊傳播被分成兩條單獨的訊息,即區塊和區塊頭。節點只有在區塊頭通過PoW檢查才會請求區塊,而它是最長(或更長)鏈。由於coinstake交易只存在於區塊當中,而不存在區塊頭中,因此節點無法單獨驗證區塊頭。相反,它直接將區塊頭儲存到記憶體中的資料結構(mapBlockIndex)。 因此,任何網路攻擊者,即使他們不持有幣,也可以填滿受害者節點的RAM 。
這種攻擊的第二種變體,可針對相同的程式碼庫執行,儘管它的工作方式略有不同,且目標是不同的資源(即受害者的磁碟而非RAM)。有爭議的是,涉及磁碟的攻擊對受害者更有害:如果RAM已滿,節點崩潰,則只需重新啟動即可。但是,如果磁碟已滿,則需要手動干預(例如,執行外部指令碼以清除磁碟上的過時區塊)。
當接收區塊而不是接收區塊頭時,會執行不同的初步檢查。理想情況下,由於區塊確實包含coinstake交易,因此節點軟體應在將區塊提交到磁碟之前檢查這個coinstake交易。但是,如前所述,如果區塊位於分叉上,那麼節點無法輕鬆地訪問coinstake交易所使用的UTXO。也許正因為這個原因,這些程式碼庫並不能驗證coinstake交易。
這些漏洞中的任何一個,都可以在不持有幣的情況下對加密貨幣進行攻擊。RAM版本的攻擊相對微不足道,但出於技術原因,磁碟版本的攻擊需要稍微多加小心。這些細節將在2019年的《 金融密碼學 》上發表的一篇短文中加以解釋。
漏洞#2:偽造權益攻擊
通過跟蹤這些程式碼庫的“血統”,我們注意到,在將比特幣的“區塊頭優先”功能合併到PoSv3程式碼庫的情況下,漏洞#1就會被引入。攻擊不適用於早期版本的PoS幣(例如點點幣),因為在磁碟上儲存區塊之前,還需要進行兩次額外的初步檢查:
- 檢查正在使用的輸出是否存在於主鏈當中;
- 檢查PoS核心雜湊是否滿足難度目標;
檢查1是通過在交易資料庫(TxDB)中進行查詢來完成的,該資料庫跟蹤當前主鏈中迄今所有的交易。換言之,初步驗證優於不驗證,但仍然劣於完全驗證。如果你一直遵循這個解釋,兩個問題可能會突然出現在你身上:
關注點A:檢查1可確保幣存在,但不能確保它未被使用。這種洞察立即導致我們接下來會討論到的漏洞。
關注點B:即使我們在驗證主鏈分叉上的區塊,coinstake交易也會針對主鏈本身的TxDB進行驗證。
基於問題A,我們也找到了一種欺騙這類檢查的方法,我們將這種微妙的攻擊方法稱為“花費權益攻擊”。為了繞過檢查1,我們使用了一個輸出,該輸出由節點看到,但已被佔用。通常,為了繞過檢查2,我們需要挖掘一個通過難度目標的有效區塊,而這又需要大量的幣。然而,事實證明,我們可利用不完全驗證,使用我們稱之為“權益放大”的技術生成任意數量的表觀權益。
權益放大(Stake Amplification)技術
為了通過少量的權益實施攻擊,攻擊者必須放大其表觀權益。表觀權益是指總的候選權益輸出,甚至是已花費的權益輸出。如果攻擊者以數量為k的UTXO開始,那麼攻擊者可以建立多筆交易,將幣花回攻擊者,如下圖所示。只有UTXO(n+1)才允許進行權益增值(staking),但是由於上面的檢查2,我們可以從1到n+1的所有UTXO進行權益增值,從而使表觀權益增加為n*k。這增加了找到PoS區塊的機會,因為攻擊者可以繼續這樣做來增加其表觀權益。具體過程如下圖左側的“權益放大步驟”所示。
權益放大和花費權益攻擊
例如,即使在系統中只擁有0.01%的權益,攻擊者也只需要通過5000筆交易來挖掘具有50%的表觀權益權力的區塊。在攻擊者收集了大量表觀權益之後,他可使用新收集的表觀權益輸出繼續挖掘PoS區塊,最後,攻擊者用無效區塊填充受害者對等節點的磁碟,如上圖右側所示。例如,攻擊者可以從交易所購買一些PoS幣,如我們所描述的那樣通過自我花費擴大表觀權益,然後將這些幣賣給交易所,並在之後的任何時候執行攻擊。攻擊者唯一要付出的代價就是交易費用。
協調漏洞披露
我們首先在Particl和Qtum加密貨幣的背景下調查了漏洞#1,為了確定這種漏洞的影響,我們從coinmarketcap.com(2018年8月9日)按市值排序,收集了已知加密貨幣的列表,並選出了PoS共識型別的鏈。我們只研究了那些從比特幣程式碼庫分叉出去的PoS幣種,總共檢查的加密貨幣共有26種,其中只發現5種PoS幣受到該漏洞的影響,它們分別是Qtum, Navcoin, HTMLcoin, Emercoin和Particl,而我們的攻擊方式對其餘的PoS幣似乎都不起作用。為了確認漏洞,我們在五個受影響的程式碼庫中分別實施了攻擊。我們利用了比特幣軟體中現有的測試套件,特別是regtest模式,該模式支援模擬時間戳並易於建立區塊,以及基於python的測試節點(基於比特幣測試框架),該節點可通過攻擊者行為進行擴充套件。我們使用Docker容器將這些測試、它們的依賴項和受影響的特定提交雜湊,打包到一個再現性工具包中,而這個工具包,我們可以輕鬆地將其分享給五個受影響的開發團隊,以此作為漏洞公開的一部分。
然後,我們更深入地瞭解為什麼未受影響的加密貨幣不易受到漏洞#1的攻擊影響,然後認識到漏洞#2幾乎同樣嚴重(需要少量的權益),但它們是更普遍的。在計劃一項協調披露時,我們認為向經濟活動不活躍和開發團隊不活躍的加密貨幣披露該漏洞可能會適得其反(例如,風險在於,如果漏洞被洩露,在其他人有時間部署緩解措施之前,它可能會影響其他人)。最終,我們決定將注意力集中到15個最有可能受到攻擊的加密貨幣(前200名的加密貨幣)。
一個複雜的因素是,這些程式碼庫中的大多數沒有使用regtest模式,因此我們不能輕易地演示攻擊,也不能為每個程式碼庫提供一個再現性工具包。因此,我們只提供了stratisX的C++程式碼庫演示。基於程式碼庫中的相似性,我們通知了所有我們認為會受到影響的15個團隊。其中,有5個團隊承認了這一漏洞,有3個團隊仍在調查當中,3個團隊反駁了這一漏洞(指出其已實施了減輕影響的措施),另外有4個團隊沒有做出迴應。對於沒有響應的四個團隊,我們通過他們的網站找到的渠道聯絡他們。 這裡 可以找到我們的Github漏洞再現性工具包,以及關於漏洞#1的 簡短論文 。我們還為漏洞保留了CVE,其應該很快就會被公開。
緩解措施
我們看到有團隊針對我們的漏洞披露實施了一系列緩解措施。一些加密貨幣實現了檢測攻擊並斷開與攻擊對等體連線的緩解措施。簡單地說,節點監視其對等節點的異常行為(例如,在fork上傳送多個區塊頭)。這種啟發式方法的挑戰在於,很難區分實際攻擊和經歷合法重組的誠實節點,因此該方案存在錯誤禁止誠實節點的風險。到目前為止,我們看到的緩解措施看起來是合理的,但這是一個值得進一步調查的領域。
其他一些加密貨幣在固定長度範圍內添加了部分驗證。如果對等方接收到一個從主鏈分叉超過該長度的區塊,那麼該區塊就被丟棄了。例如,在BCH(比特幣現金)的ABC程式碼庫中也採用了這種方法,該程式碼庫使用一個10區塊的滾動檢查點。這種方法的缺點是它引入了“鏈分裂”的可能性。當誠實的節點最終位於區塊鏈的不同分叉上時,就會發生鏈分裂。例如,如果網路連線不良,導致節點彼此失去同步的時間足夠長,從而建立衝突的檢查點,則可能發生這種情況。即使節點重新獲得連線,它們也無法實現鏈的同步。我們注意到,即使沒有這種緩解措施,也存在鏈分裂的風險。回顧前面的關注點B,由於 coinstake交易是使用當前鏈中的交易輸出進行驗證的,因此,如果節點臨時發現自己在一個分叉上,則可能無法切換到實際的主鏈。
鏈分裂風險也為敵對礦工引入了新的攻擊手段。攻擊者可以嘗試祕密挖取一個長鏈,然後將其釋出到節點的一個子集,以導致鏈分裂。IBD(初始塊下載)中的節點,或長時間離線後剛重啟的節點特別易受這種攻擊。這種攻擊可以與Eclipse攻擊結合起來,將誠實的節點引入由攻擊者控制的鏈中。
所有這些緩解措施可使攻擊難以執行,但仍然無法替代完全驗證。一些加密貨幣,如量子鏈,計劃在未來版本中全面驗證非主鏈區塊。
應建議以下受影響加密貨幣的使用者將其節點更新為最新的補丁軟體,需要注意的是,未更新的節點,我們可利用此漏洞導致節點RAM或磁碟消耗增加,並最終導致其崩潰。
下表顯示了我們認為受上述兩大漏洞影響的加密貨幣。我們還沒有驗證所有的PoS幣,我們也沒有研究那些反駁我們的說法的幣種團隊為什麼沒有受到影響。
最後的想法
雖然“偽造權益”攻擊在原理上是很簡單的,但它們強調了一個困難的設計挑戰:在工作量證明(PoW)中有意義的一些想法,不能安全地轉換到權益證明(PoS)。考慮到Bitcoin Core作為PoSv3加密貨幣的“先輩”,它們的程式碼共享程度是很高的,我們認為這值得進一步審查。在調查這些漏洞時,我們發現了幾個針對各種緩解措施和特別防禦措施的在建工程程式碼庫。對我們來說,這表明PoS開發者意識到在這一設計空間中的權衡和需求,還沒有被完全理解。 挑戰在於,一方面,我們希望儘快拒絕無效的區塊,另一方面,我們不希望陷入鏈分裂或在處理實際的主鏈時被延遲 。處理這一問題的系統方法,仍然是未來需要探索的工作。
儘管我們看到最近的漏洞例子(例如比特幣中的CVE 2018–17144)至少影響了兩個加密貨幣的程式碼庫,但據我們所知,這是第一次跨如此多(20+)獨立加密貨幣的協調安全漏洞披露。考慮到不同加密貨幣之間思想的交叉傳播和程式碼重用的數量,我們預計將來會有更多這樣的漏洞。我們發現,這些程式碼庫的安全過程幾乎沒有一致性。例如,它們中的大多數沒有專門的安全聯絡人。為協調披露建立最佳實踐,可能有益於整個生態系統。
[1]這個漏洞的想法起源於2018年夏季,當時Andrew Miller正在與Unit-E開發人員合作。我們感謝Munto Sunbasz和Gil Danziger的有益討論和DTR基金會(HTTPS://DTR.OR/)的研究資助。
[2]Emercoin實現了一種啟發式對等檢測。https://github.com/emergoin/emergoin/commit/ec32762B99cc68fb9ab2909dda96bc7a13bd819
[3] 在Qtum 中的滾動檢查點 https://github.com/qtumproject/qtum/commit/8d208d0bee8449c1e4a3904f3fc97ed26156648
[4]PoS的特別檢查示例如下:https://github.com/peercoin/peercoin/blob/ebb4003ce8367501020181f7e734d52c4b1ab5ea/src/main.cpp l2564
[5]我們通過電子郵件聯絡了一些團隊,列出了他們的網頁或“傳送便條”功能。
[6]從11月開始,我們多次嘗試通過PIVX網站上的聯絡方式聯絡他們,截至撰寫這篇文章是,我們才意識到PIVX還啟動了一個名為Hacker One的專案,我們注意到,即使到今天,PIVX網站上的bug賞金頁面本身,也根本沒有提到Hacker One專案。
[**] StratisX已經從脆弱的C++程式碼庫轉移到C#程式碼庫。