Parity 錢包合約漏洞
還記得今年 7 月 Parity 錢包合約被找到漏洞,結(jié)果駭客偷走了將近 150,000 個(gè)以太幣,會(huì)發(fā)生是因?yàn)橹悄芎霞s的 callback 裡使用了 delegatecall(msg.data),這個(gè)函數(shù)會(huì)呼叫 data 中的函數(shù)並將 msg.sender 設(shè)為原呼叫函數(shù)的地址,駭客利用這一點(diǎn)呼叫了?initWallet,這時(shí)你們可能會(huì)以為 Parity 應(yīng)該有在 initWallet 設(shè)置條件阻擋駭客就不能呼叫,結(jié)果竟然是沒有!所以駭客就成功並改變合約的擁有者,最後再把以太幣轉(zhuǎn)走,細(xì)節(jié)的部分可以看這篇文章。
Parity 也在幾天後修復(fù)了這個(gè)問題,修復(fù)的方式就是在 init* 函數(shù)加上 only_uninitialized modifier 判斷,當(dāng) m_numOwners > 0 時(shí)這個(gè)函數(shù)就不能使用,這時(shí)應(yīng)該會(huì)想說不會(huì)再有漏洞了吧,畢竟智能合約能操作以太幣,誰知道……
就在前幾天有人發(fā)布了新?issue?說他不小心刪除了錢包的合約,因?yàn)橹挥泻霞s的擁有者可以刪除,那麼他到底怎麼刪除合約?可以看到錢包合約被刪除前共有兩筆交易,第一筆交易呼叫 initWallet 並將合約的擁有者設(shè)為自己。
function initWallet(address[] _owners, uint _required, uint _daylimit) only_uninitialized {initDaylimit(_daylimit);initMultiowned(_owners, _required); }交易結(jié)果:
Function: initWallet(address[] _owners, uint256 _required, uint256 _daylimit) MethodID: 0xe46dcfeb [0]:0000000000000000000000000000000000000000000000000000000000000060 [1]:0000000000000000000000000000000000000000000000000000000000000000 [2]:0000000000000000000000000000000000000000000000000000000000000000 [3]:0000000000000000000000000000000000000000000000000000000000000001 [4]:000000000000000000000000ae7168deb525862f4fee37d987a971b385b96952第二筆交易呼叫了 kill 函數(shù),而 kill 函數(shù)呼叫了 suicide (selfdestruct?函數(shù)的別稱,功能是將合約程式從區(qū)塊鏈移除,並將合約剩餘的以太幣轉(zhuǎn)給參數(shù)的位置),錢包的程式就從區(qū)塊鏈上移除了。
function kill(address _to) onlymanyowners(sha3(msg.data)) external {suicide(_to); }交易結(jié)果:
Function: kill(address _to) MethodID: 0xcbf0b0c0 [0]:000000000000000000000000ae7168deb525862f4fee37d987a971b385b96952因?yàn)楹芏嗍褂眠@個(gè)錢包的合約引入位置都寫死導(dǎo)致很多合約不能運(yùn)作,在?Polkadot?裡第 451 行就將錢包合約地址寫死:
address constant _walletLibrary = 0x863df6bfa4469f3ead0be8f9f2aae51c91a907b4;因?yàn)樗羞壿嬇袛喽荚阱X包合約中,所以其他相依於錢包合約的現(xiàn)在以太幣都被凍結(jié),且看起來像這樣 (無法提款):
contract Wallet {function () payable {Deposit(...)} }Parity 官方還在了解可行的解決方案,如果想查詢自己有沒有被影響可以到這個(gè)網(wǎng)站。
如何預(yù)防
這次的事件 Parity 說明有兩種預(yù)防方式。一種是智能合約不該有自殺的函數(shù),這樣即便黑客獲得了權(quán)限也無法把合約移除。一種是有新的建議及改善時(shí),要及時(shí)更新線上的合約或是找尋線上合約可能的漏洞,因?yàn)樵谶@問題發(fā)生前,就有網(wǎng)友提議在合約部屬時(shí)要自動(dòng)呼叫 initWallet(pr) 加強(qiáng)合約的安全。
如何取得凍結(jié)的資金
目前沒有其他方式可以取得凍結(jié)的資金,只能期待未來有相關(guān)的改善建議實(shí)作在以太坊,或是以太坊實(shí)行硬分叉回復(fù)狀態(tài)到錢包合約刪除之前。
參考
Security Alert - Parity TechnologiesWinter may be coming but the moment you've all been waiting for has finally arrived: Parity Tech is excited to announce…paritytech.io Parity Wallet Hack 2: Electric Boogaloo
Postmortem: The what, when, and how of the Nov 6th Parity Wallet Hackhackernoon.com
https://paritytech.io/blog/security-is-a-process-a-postmortem-on-the-parity-multi-sig-library-self-destruct.html
原文地址:https://medium.com/taipei-ethereum-meetup/parity-%E9%8C%A2%E5%8C%85%E5%90%88%E7%B4%84%E6%BC%8F%E6%B4%9E-43ed412ebcd2
總結(jié)
以上是生活随笔為你收集整理的Parity 錢包合約漏洞的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何避免无意义的区块链项目
- 下一篇: 在區塊鏈上建立可更新的智慧合約(一)