Cosmos的解綁定漏洞分析

今天早上,Cosmos發(fā)布v0.34.6補丁,緊急修復(fù)了可能導(dǎo)致嚴(yán)重后果的漏洞。現(xiàn)在來分析一下問題所在和可能導(dǎo)致的后果。

導(dǎo)致漏洞的原因

和其他DPOS共識的鏈一樣,Cosmos中參與共識出塊的節(jié)點有限,只有股權(quán)排名前100的驗證人節(jié)點才是有效驗證人。持幣用戶可以將atom(CosmosHub主網(wǎng)代幣)委托給驗證人節(jié)點,稱作委托人。驗證人或委托人都可以將委托的幣取回,不過這需要一個21天的周期,也就是說我的抵押股權(quán)變?yōu)榭闪魍ù鷰判枰?jīng)過一定的鎖定期。DPOS區(qū)塊鏈通常都會這樣設(shè)計,這是為了維系網(wǎng)絡(luò)的穩(wěn)定性,避免抵押代幣在外部市場價格劇烈波動時,網(wǎng)絡(luò)的總抵押量也隨之短期內(nèi)大幅波動,畢竟DPOS區(qū)塊鏈的價值是需要用作共識依據(jù)的抵押代幣來背書的。但由于Cosmos的三處看似合理的設(shè)計,組合在一塊卻產(chǎn)生了嚴(yán)重的漏洞。

1. 不一致的解綁鎖定期

Cosmos中,一個驗證人如果因為掉線,雙簽或者取回過多的自抵押代幣(數(shù)量低于設(shè)定的min_self_bond),便會從活躍的Bonded狀態(tài),經(jīng)過一段時間的UnBonding狀態(tài),最后變?yōu)閁nBonded狀態(tài)。非Bonded狀態(tài)的驗證人,無論抵押池還有多少token,都不再參與共識。當(dāng)委托人從一個驗證人解綁委托的token時,會進行判斷:

  1. 如果驗證人此時是Bonded狀態(tài),解綁需要經(jīng)歷21天的時間。
  2. 如果驗證人處于UnBonding狀態(tài),委托人從該驗證人解綁定需要的鎖定期等于該驗證人的鎖定期(小于或等于21天)。
  3. 如果驗證人處于UnBonded狀態(tài),則不需要鎖定期,委托人抵押的股權(quán)可立即變回代幣。
    這樣設(shè)計的本意的是,當(dāng)驗證人節(jié)點因作惡或意外被Jail(關(guān)小黑屋)后,委托人可以盡快取回抵押的股權(quán),避免造成損失。

2. 立即生效的轉(zhuǎn)委托

委托人在將代幣抵押給一個驗證人后,如果想要抵押給另一個驗證人,可使用轉(zhuǎn)委托功能,不必先從源驗證人上解綁,然后再委托給目標(biāo)驗證人。這樣的設(shè)定是為了方便委托人可隨時在不同驗證人之間做選擇,如發(fā)現(xiàn)某個驗證人傭金更低,或是當(dāng)前驗證人頻繁掉線,可以盡快轉(zhuǎn)移股權(quán),避免損失。

3. 轉(zhuǎn)委托不限制目標(biāo)驗證人狀態(tài)

轉(zhuǎn)委托操作不限制目標(biāo)驗證人節(jié)點的狀態(tài),也就是說,你不光可以轉(zhuǎn)委托給一個Bonded狀態(tài)的驗證人,也能轉(zhuǎn)委托給UnBonding和UnBonded狀態(tài)的委托人。這樣的設(shè)計是讓驗證人節(jié)點在出現(xiàn)異常時,還能接受到委托人的抵押。

如何利用漏洞

一個將股權(quán)委托給Bonded狀態(tài)的委托人,可以找到Cosmos網(wǎng)絡(luò)中的狀態(tài)為UnBonded的驗證人(這樣的節(jié)點并不少),將股權(quán)轉(zhuǎn)委托給它,然后再解綁,即可立即完成解綁。操作很簡單,只用多耗費一點手續(xù)費便能讓21天的鎖定期形同虛設(shè)。

漏洞造成的影響

利用該漏洞本身不會造成資金的數(shù)量,但該漏洞的存在會讓網(wǎng)絡(luò)變得不穩(wěn)定,更容易被攻擊,最極端的情況的是共識失敗,不再出塊。Cosmos使用的BFT共識算法,最多能容忍三分之一的股權(quán)作惡。Cosmos期望atom總量的67%長期處于抵押狀態(tài),假設(shè)現(xiàn)在atom總量是1000,全網(wǎng)抵押的atom一共是670,作惡節(jié)點只擁有67,只占到10%,是不可能導(dǎo)致共識失敗的。然后,作惡節(jié)點在交易所引起劇烈的價格波動,因為該漏洞的存在,委托人可以立刻解綁atom,轉(zhuǎn)移至交易所交易。只要全網(wǎng)抵押的atom降到201以下,作惡節(jié)點的67個便超過了三分之一,最壞的可能便是宕機,由于Tendermint的最終一致性設(shè)計,只要作惡節(jié)點不上線,網(wǎng)絡(luò)將不再出塊,且目前沒有很好的修復(fù)方法。先不論攻擊者會不會有這樣的企圖(攻擊成本和攻擊收益),沒有解綁鎖定期,外部市場的價格波動必然會引起短期網(wǎng)絡(luò)的穩(wěn)定性,所以任何情況下都要確保解綁鎖定期的有效。

漏洞修復(fù)

漏洞修復(fù)很簡單,解綁時不再判斷驗證人節(jié)點的狀態(tài),無論怎樣都要經(jīng)過21天的解綁鎖定期。

Cosmos熱升級過程

Comos在漏洞造成嚴(yán)重影響前立即發(fā)布了修復(fù)后新版本,迅速聯(lián)系各個驗證人更新,上午大多數(shù)節(jié)點已經(jīng)切換至新版本,出塊也正常。由于Tendemrint的最終一致性,Cosmos Hub的新老版本在不兼容(某一個塊高度后,新老版本的狀態(tài)機數(shù)據(jù)不同)的情況下,部分驗證人節(jié)點已經(jīng)切換至新版本,部分仍使用老版本。如果熱升級沒有溝通好,在出現(xiàn)導(dǎo)致狀態(tài)不一致的交易后,如果抵押股權(quán)中的三分之二的驗證人已經(jīng)升級到新版本,則共識以新版本的塊為準(zhǔn),運行老版本的節(jié)點則會因為共識不一致停止出塊。但如果三分之二的驗證人仍使用老版本,共識以老版本為準(zhǔn),反而是新版本的節(jié)點停止共識。還有種情況則是兩邊都未達到三分之二,則都停止共識。這樣熱升級時,必須要協(xié)調(diào)大多數(shù)節(jié)點到位。

Polkadot因為有runtime機制的存在,將更新的代碼寫入?yún)^(qū)塊,節(jié)點同步后實時更新運行邏輯,這樣優(yōu)雅的熱更新機制,避免了共識失敗的情況,節(jié)約了升級過程中協(xié)調(diào)驗證人節(jié)點產(chǎn)生的成本。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。