被锁1.5亿美元!Parity钱包安全漏洞分析及区块链安全风险应对措施 [复制链接]

发表于 2017-12-20 13:09:58 | 显示全部楼层
(本文首发于微信公众号“万云BaaS”,作者为万向区块链旗下万云CTO奚海峰)

Parity是目前使用最广泛的以太坊钱包之一,其创始人兼CTO 是以太坊前CTO黄皮书作者Gavin Woods。在四个多月前的7月19号,Parity因为安全漏洞造成过以太币损失;当时的情况是:Parity 1.5版本及之后的版本存在一个漏洞,由一个名叫wallet.sol的多重签名合约的bug导致。据Parity的报告,确认有15万枚以太币(当时大约价值 3000 万美元)被盗,后来,白帽黑客找回了大约37.7万枚受影响的以太币。

1.jpg

不幸的是,Parity团队对bug的修复和测试不彻底,11月7日Parity因为合约中的一个新bug再次被黑客攻击,致使大约50万枚以太币被锁在多签智能合约里面,当时价值大约1.5亿美元,包括Gavin Woods作为创始人的新项目Polkadot公募获得的9000万美元(好在私募部分资金没受影响,因此项目还可以继续进行)。单就涉及的美元金额来看,这次攻击是TheDAO黑客事件的三倍!


Parity漏洞事件回放

11月7日,始作俑者在Github的Parity 项目网站上建了一条题为 “anyone can kill your contract”的问题,说自己意外地杀死了Parity多签库合约,并贴出他执行的交易信息(如下图)。他在问题的跟随评论里进一步解释发生了什么:他本来不是合约的所有者(owner),但由于合约未初始化(漏洞所在),他把自己变成了owner,然后作为owner他调用了合约的kill方法,把合约里的代码都抹去了。

2.jpg

Parity漏洞事件分析

Parity钱包提供了一个多签合约的模板,用户使用这个模板可以很容易生成自己的多签智能合约。(如下图)第一段代码是生成的多签合约的一部分,它的代码量很少,实际业务逻辑都是通过delegatecall内嵌式地调用了库合约WalletLibrary。这样做的一个主要好处是:多签合约的主逻辑(代码量较大)作为库合约只需在以太坊上部署一次,而不会作为用户多签合约的一部分重复部署,因此可以为用户节省部署多签合约所耗费的大量Gas。

3.jpg
4.jpg
5.jpg

上面第二段代码显示的是库合约的初始化函数。为了修复7月份的那个bug,确保初始化逻辑只执行一次,这两个函数增加了only_uninitialized限定条件(通过检查n_numOwners变量值)。这里要说明一个很重要的概念,当库合约的函数被调用时,它是运行在调用方(即:用户多签合约)的上下文里,像 m_numOwners 这样的变量都来自于用户多签合约的上下文。另外,为了能被用户合约调用,这些库合约的初始化函数都是public的。

这次的问题就出在黑客直接调用了库合约的初始化方法:由于库合约本质上也不过是另外一个智能合约,这次攻击调用使用的是库合约本身的上下文,对调用者而言这个库合约是未经初始化的,而黑客通过初始化参数把自己设置成了owner!接下来黑客作为owner调用了kill函数,抹除了库合约的所有代码;这样一来,所有依赖这个库合约的用户多签合约都无法执行,其中的代币全部被锁在合约内无法转移。

如何应对合约安全风险

一是可以通过以太坊的协议和EVM本身的升级来加强安全性,二是可以应用代码审计公司或者是自己编制严格的审计流程对自己的代码进行审计。在代码审计公司方面,发行MakerDAO的Dapphub团队是一个不错的选择。他们在安全审计上做得非常早,当年也是他们发现了TheDAO的bug。而MakerDAO的ICO项目代码则是由Trail of Bits审计的。由此可见,即使是大牛公司,对自己的代码都做仔细的审计,相关的创业团队也应该更为严谨。

另外,可以使用形式化验证工具来加强安全性,如区块链安全公司Zeppelin开发的工具,使得修改已部署的智能合约变得更方便。苏黎士联邦理工大学软件可靠性实验室开发了一键式安全审查工具Securify,它给开发人员提供了一个简单的界面,可以对输入的智能合约代码进行形式化验证,找出里面存在的漏洞。

本篇分享结束。关注本号或微信公众号“万向区块链”,你将随时获取区块链最前沿技术和干货,以及高质量的区块链活动。

0条回复 跳转到指定楼层

高级模式
您需要登录后才可以发帖 登录 | 立即注册 用新浪微博登录

本版积分规则

返回顶部 返回列表
分享 发帖