對鏈式結構型 PoS 系統的 “虛假權益” 攻擊

漏洞 2 以及權益重用攻擊

通過跟蹤這些代碼庫的歷史版本,我們注意到漏洞 1 最初是在將比特幣的 “區塊頭優先” 功能合併到 PoSv3 代碼庫時引入的。更早期版本的密碼學貨幣(例如:peercoin)並不存在漏洞 1 ,因為在將區塊存儲到硬盤之前要先經過兩項初步驗證:

  1. 驗證將要花費的輸出是否存在於主鏈中;
  2. 驗證 PoS 區塊的 kernel 哈希值是否達到難度目標。

第一項驗證是通過查找交易數據庫(TxDB)來完成的。該數據庫保存了當前主鏈上的所有交易。換句話說,初步驗證確實有一定的效果,但是它相比完全驗證仍然不夠完整和嚴謹。如果你一直跟隨著這篇文章的思路,你可能會立刻發現兩個問題:問題 A :第一項驗證只能確保這個幣是存在的,但是不能確保它對應的 UTXO 沒有被花費過。由此引發了我們接下來要討論的漏洞。

問題 B :即使我們驗證的是一條分叉鏈上的區塊,也會基於主鏈的 TxDB 來驗證這個區塊內的 coinstake 交易。

基於問題 A ,我們找到了一種能夠騙過這些驗證的方法,那就是使用一種更微妙的攻擊手段,我們稱之為 “權益重用攻擊”。為了繞過第一項驗證,我們會使用一個已花費輸出冒充未花費輸出騙過節點。通常,為了繞過第二項驗證,我們需要挖出一個達到難度目標的有效區塊,這種操作需要投入一大筆權益。但是,事實證明,我們可以通過濫用不完全驗證來產生任意數量的 表觀權益 (apparent stake)。我們將這種技術稱為 “權益放大” 。

權益放大

要想使用少量權益達到攻擊的目的,攻擊者必須放大自己的表觀權益量。表觀權益指的是所有備用權益輸出的總量,包括已花費的權益。假設一個攻擊者一開始擁有 k 數額的 UTXO ,他可以發起多筆發送給自己的交易(造成自己所持權益量增加的假象),如下圖所示。原本應該只有 UTXO*(n+1)* 能算作權益,但是根據上文的驗證 2 ,從

1n+1 的 UTXO 都可以算入權益量之中,從而將表觀權益量增加到了 n*k 。由於攻擊者可以一直通過這種方式增加表觀權益量,也就增加了他挖到 PoS 塊的幾率。“權益放大的步驟” 參見圖左。

對鏈式結構型 PoS 系統的 “虛假權益” 攻擊

-權益放大和已權益重用攻擊-

假設攻擊者擁有的權益只佔整個系統的 0.01% ,他只需要通過交易將這些權益反覆發送給自己,5000 次後就可以獲得 50% 的表觀權益算力來挖取區塊。攻擊者累積得到大量表觀權益之後,就可以使用這些 表觀權益輸出 從過去的某個時間點開始重新挖 PoS 區塊。最終,如圖右所示,被攻擊節點的硬盤會被無效區塊填滿。舉個例子,攻擊者可以從交易所購買一些代幣,通過上文提到的自交易放大自己的表觀權益,然後將代幣重新在交易所賣掉,之後就可以隨時進行攻擊。對於攻擊者來說,攻擊成本僅僅是交易手續費。

協同漏洞披露

我們首先針對密碼學貨幣 Particl 和 Qtum 調查了關於漏洞 1 的情況 <1>。為了瞭解這個漏洞的危害程度,我們從 coinmarketcap.com(截至 2018 年 8 月 9 日)網站上篩選出了一些知名的 PoS 密碼學貨幣,根據市值降序列了一張表。我們只研究了那些從比特幣(或是從比特幣中衍生出來的密碼學貨幣)的 C++ 代碼庫中分叉出來的密碼學貨幣。我們總共審查了 26 種密碼學貨幣,其中只有 5 種(Qtum、Navcoin、HTMLcoin、Emercoin 以及 Particl)存在漏洞 1 ,剩餘 21 種似乎不受該攻擊的影響。為了確認漏洞 1 的危害程度,我們對那 5 種密碼學貨幣進行了攻擊。我們利用了比特幣現有的測試組件,特別是支持模擬時間戳和快捷建塊的

regtest 測試 ,以及一個(基於比特幣測試框架)用 Python 編寫的測試節點,該節點可以隨著攻擊者的攻擊行為進行擴展。作為漏洞披露的一部分,我們使用 Docker 容器引擎將這些測試、它們的依賴包和特定 commit 的哈希值打包成了一個可再現工具包,以便分享給相關密碼學貨幣的開發團隊。我們又進一步深挖了其餘密碼學貨幣能夠抵禦漏洞 1 攻擊的原因,發現了同樣嚴重且更為普遍的漏洞 2 (只需要少量權益)。在準備披露這兩個漏洞的過程中,我們考慮到有些密碼學貨幣流動性不強,開發團隊的活躍度又較低,向他們披露這些漏洞可能會適得其反(其中一種風險是,如果存在漏洞的事情被洩露,在相關開發團隊部署解決方案之前可能會造成用戶的損失)。最終,我們(從市值在前 200 名的密碼學貨幣中)選出了最可能受到攻擊以及團隊應對積極性最強(在 2018 年提交過一些 commit )的 15 種密碼學貨幣,並與它們的開發團隊進行了交流。

其中一個比較複雜的因素是,大多數團隊的代碼庫都沒有使用 regtest 測試模式,因此我們很難向他們演示攻擊方式或是為針對每個密碼學貨幣提供一個可再現工具包。因此,我們只能通過一個 C++ 版本的 stratisX 代碼庫進行演示 <7>。基於代碼庫的相似性,我們將存在漏洞的事告知了上述 15 支開發團隊。其中有 5 支團隊確認了漏洞的存在, 3 支團隊還在調查中, 3 支團隊認為漏洞的影響不大(並指出一些程序上的改動可以抵禦其影響),還有 4 支團隊尚未回覆。對於那 4 支未回覆的團隊,我們通過他們網站上提供的渠道進行了聯繫 <5> <6>。我們在 這裡 提供了兩個漏洞的 Github 可再現工具包,這裡 是我們關於漏洞 1 的一篇小論文。我們還將漏洞保存在了 CVE 上,將於近日公佈。

解決措施

我們看到一些團隊針對這些漏洞採取了一定的解決措施。一些密碼學貨幣團隊採取的措施是監測這類攻擊並斷開與攻擊節點的連接 <2>。簡單來說,節點會監測其他節點的異常行為(例如,發送大量區塊頭到分叉鏈上)。這種方案的問題在於很難將真的攻擊行為與誠實節點的合法重組區分開來——存在誤禁誠實節點的風險。截止到目前的情況來看,我們認為這類解決措施是合理的,但還是需要進一步調查。另一些密碼學貨幣團隊採取的措施是增加一個部分驗證機制,每積累一定數量的區塊就會觸發這個機制,使觸發點以前的區塊鏈不再接受分叉區塊 <3>。如果節點接收到的分叉區塊過於久遠(即比最新的觸發點要更為久遠),節點是不會認可的,只會將它丟棄。例如,BCH (比特幣現金)的 ABC 代碼庫就使用了這種方法,設置了深度為 10 個區塊的滾動檢查點。這種方法的缺點在於會造成 “鏈分裂” 的可能性。“鏈分裂”指的是誠實節點分散在主鏈的不同分叉鏈上。例如,在一個網絡不佳的環境下,節點之間長時間不同步,產生了有衝突的檢查點。即使節點重新上線,也無法對這條鏈達成共識。我們注意到,即使不採用這種方案,鏈分裂的問題也是存在的。再說回上文的問題 B ,由於 coinstake 交易是基於當前主鏈上的交易輸出進行驗證的,如果一個節點突然發現自己處在一條分叉鏈上,可能無法切換到真正的主鏈上。

鏈分裂的風險同樣為惡意礦工創造了新的攻擊手段。攻擊者可以秘密挖取一條長鏈,並將它廣播至部分節點,從而造成鏈分裂的情況。處於 IBD(初始塊同步)狀態的節點或者是長時間離線後重新同步的節點特別容易受到這樣的攻擊。這類攻擊能夠和 eclipse 攻擊結合,將誠實節點引入由攻擊者控制的分叉鏈中。

所有這些解決措施都能有效抵禦虛假權益攻擊,但是依舊無法代替完全驗證。包括 Qtum 在內的一些密碼學貨幣計劃在未來的版本中對非主鏈區塊實行完全驗證。

我們建議所有這些存在漏洞的密碼學貨幣的用戶將自己的節點軟件進行升級,打上最新的補丁,未升級的節點有可能遭受攻擊,RAM 或者磁盤資源消耗過大,最終造成程序崩潰。

最終感想

雖然 “虛假權益” 攻擊本質上很簡單,但是突顯了設計上的難點:將一些適用於工作量證明的思路挪用到權益證明中會引發安全性問題。鑑於在 PoSv3 密碼學貨幣的代碼與 Bitcoin Core 高度重合,我們認為應該更加重視代碼檢查。在調查這些漏洞的時候,我們在不同的項目代碼庫 <4>(或是一些被註釋掉的代碼)發現了一些解決措施和有針對性的防禦措施。我們認為,這表明當前 PoS 項目的開發者們已經意識到了自己在設計過程中對於權衡關係和需求上考慮不足。難點在於,一方面,我們想要儘快抵禦無效區塊攻擊,但是另一方面,我們不希望因此發生鏈分裂或是延遲的情況。在未來的研究中,我們依舊要思考如何找到一個系統化的解決方案。儘管我們已經看到了至少兩個代碼庫受到影響(例如,在 BTC 中的 CVE 2018–17144),但是據我們所知,這次協同安全漏洞披露涉及的密碼學貨幣數量之多(20+),絕對是史無前例的。考慮到這些密碼學貨幣的設計思路和代碼庫重合度較高,我們預計在未來會發現更多這樣的漏洞。我們還發現這些代碼庫幾乎沒有統一的安全性處理。比如,大多數團隊都沒有專設安全聯絡人。類似我們這種協同漏洞披露是一種最佳做法,同時也對整個生態有益。

注 1:本漏洞背後的觀念起於 2018 年夏天,當時 Andrew Miller 還在跟 Unit-E 開發者一起工作。感謝 Matteo Sumberaz 和 Gil Danziger 充滿教益的探討,以及 DTR Foundation 提供的獎金。

注 2:Emercoin 實現的一種啟發式節點發現方法 https://github.com/emercoin/emercoin/commit/ec32762b99cc68fb9abb2909dda96bc7a13bd819

注 3:Qtum 中的滾動檢查點 https://github.com/qtumproject/qtum/commit/8d208d0bee8449c1e4a3904ff3fc97ed26156648

注 4:一個 PoS 中的 ad-hoc 檢查案例:https://github.com/peercoin/peercoin/blob/ebb4003ce8367501020181f7e734d52c4b1ab5ea/src/main.cpp#L2564

注 5:我們通過電子郵件以及 "發送備忘錄" 功能聯繫上了一些團隊

注 6:我們從 11 月開始多次通過網頁上的聯繫功能聯繫 PIVX 團隊。直到我們寫作本文期間才發現,PIVX 團隊也啟動了一個 hackerone 項目。而且我們也發現,直到今天,PIVX 網頁上的 bug 懸賞頁都沒有列出這個 hackerone 項目。

注 7:注 7:StratisX 已經從有漏洞的 C++ 代碼庫遷移到了 C# 實現。

原文鏈接: https://medium.com/@dsl_uiuc/fake-stake-attacks-on-chain-based-proof-of-stake-cryptocurrencies-b8b05723f806


分享到:


相關文章: