約1.5億美圓被鎖!Parity錢包漏洞全分析及區塊鏈安全風險應對措施

(本文首發於微信公衆號「萬雲BaaS」,做者爲萬向區塊鏈旗下萬雲平臺CTO奚海峯。)安全

Parity是目前使用最普遍的以太坊錢包之一,其創始人兼CTO 是以太坊前CTO黃皮書做者Gavin Woods。在四個多月前的7月19號,Parity由於安全漏洞形成過以太幣損失;當時的狀況是:Parity 1.5版本及以後的版本存在一個漏洞,由一個名叫wallet.sol的多重簽名合約的bug致使。據Parity的報告,確認有15萬枚以太幣(當時大約價值 3000 萬美圓)被盜,後來,白帽黑客找回了大約37.7萬枚受影響的以太幣。微信

 

 

 

 

 

 

不幸的是,Parity團隊對bug的修復和測試不完全,11月7日Parity由於合約中的一個新bug再次被黑客攻擊,導致大約50萬枚以太幣被鎖在多籤智能合約裏面,當時價值大約1.5億美圓,包括Gavin Woods做爲創始人的新項目Polkadot公募得到的9000萬美圓(好在私募部分資金沒受影響,所以項目還能夠繼續進行)。單就涉及的美圓金額來看,此次攻擊是TheDAO黑客事件的三倍!app

 

Parity漏洞事件回放

11月7日,始做俑者在Github的Parity 項目網站上建了一條題爲 「anyone can kill your contract」的問題,說本身意外地殺死了Parity多籤庫合約,並貼出他執行的交易信息(以下圖)。他在問題的跟隨評論裏進一步解釋發生了什麼:他原本不是合約的全部者(owner),但因爲合約未初始化(漏洞所在),他把本身變成了owner,而後做爲owner他調用了合約的kill方法,把合約裏的代碼都抹去了。函數

 

Parity漏洞事件分析

Parity錢包提供了一個多籤合約的模板,用戶使用這個模板能夠很容易生成本身的多籤智能合約。(以下圖)第一段代碼是生成的多籤合約的一部分,它的代碼量不多,實際業務邏輯都是經過delegatecall內嵌式地調用了庫合約WalletLibrary。這樣作的一個主要好處是:多籤合約的主邏輯(代碼量較大)做爲庫合約只需在以太坊上部署一次,而不會做爲用戶多籤合約的一部分重複部署,所以能夠爲用戶節省部署多籤合約所耗費的大量Gas。工具

上面第二段代碼顯示的是庫合約的初始化函數。爲了修復7月份的那個bug,確保初始化邏輯只執行一次,這兩個函數增長了only_uninitialized限定條件(經過檢查n_numOwners變量值)。這裏要說明一個很重要的概念,當庫合約的函數被調用時,它是運行在調用方(即:用戶多籤合約)的上下文裏,像 m_numOwners 這樣的變量都來自於用戶多籤合約的上下文。另外,爲了能被用戶合約調用,這些庫合約的初始化函數都是public的。區塊鏈

此次的問題就出在黑客直接調用了庫合約的初始化方法:因爲庫合約本質上也不過是另一個智能合約,此次攻擊調用使用的是庫合約自己的上下文,對調用者而言這個庫合約是未經初始化的,而黑客經過初始化參數把本身設置成了owner!接下來黑客做爲owner調用了kill函數,抹除了庫合約的全部代碼;這樣一來,全部依賴這個庫合約的用戶多籤合約都沒法執行,其中的代幣所有被鎖在合約內沒法轉移。測試

 

如何應對合約安全風險

一是能夠經過以太坊的協議和EVM自己的升級來增強安全性,二是能夠應用代碼審計公司或者是本身編制嚴格的審計流程對本身的代碼進行審計。在代碼審計公司方面,發行MakerDAO的Dapphub團隊是一個不錯的選擇。他們在安全審計上作得很是早,當年也是他們發現了TheDAO的bug。而MakerDAO的ICO項目代碼則是由Trail of Bits審計的。因而可知,即便是大牛公司,對本身的代碼都作仔細的審計,相關的創業團隊也應該更爲嚴謹。網站

另外,能夠使用形式化驗證工具來增強安全性,如區塊鏈安全公司Zeppelin開發的工具,使得修改已部署的智能合約變得更方便。蘇黎士聯邦理工大學軟件可靠性實驗室開發了一鍵式安全審查工具Securify,它給開發人員提供了一個簡單的界面,能夠對輸入的智能合約代碼進行形式化驗證,找出裏面存在的漏洞。spa

相關文章
相關標籤/搜索