约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

相关文章
相关标签/搜索