博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Parity钱包漏洞全分析及区块链安全风险应对措施
阅读量:6267 次
发布时间:2019-06-22

本文共 1896 字,大约阅读时间需要 6 分钟。

作者:奚海峰

清华大学自动化系本科和硕士毕业,美国马里兰大学电气及计算机工程硕士。曾任IBM研究院工程师和高级咨询顾问,先后担任Sempra Commodities(全球大宗商品交易公司集团)主管架构师,Tudor Investment(美国排名前20的对冲基金)软件开发主管等职位。在美国12年期间,荣获了包括“IBM研究成就奖”在内的多次嘉奖,在一流国际会议和杂志上发表过多篇学术论文,并持有美国发明专利。

以下是正文:

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黑客事件的三倍!

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,它给开发人员提供了一个简单的界面,可以对输入的智能合约代码进行形式化验证,找出里面存在的漏洞。

本文首发于万云Wancloud微信公众号,未经授权不允许转载。

你可能感兴趣的文章
2016年收到的第一件礼物,被评上微软全球最有价值专家MVP(一)
查看>>
2016中国VR开发者论坛第一期
查看>>
Hyper-V 2016 系列教程5 Hyper-V 服务器基本属性
查看>>
北京、天津工厂自动监测数据爬取
查看>>
第一个python程序简单加法计算器
查看>>
在CentOS下安装Tomcat8
查看>>
Weblogic classloader分析
查看>>
做技术做软件-----如何才能拿到上万的月薪
查看>>
linux 查看当前路径命令:pwd
查看>>
At.js – 用于 Web 应用程序的自动完成库
查看>>
[Android Pro] Android权限设置android.permission完整列表
查看>>
如何对抗硬件断点--- 调试寄存器
查看>>
mybatis学习
查看>>
从不同层面看cocos2d-x
查看>>
Struts2技术详解
查看>>
MFC应用程序向导生成的文件
查看>>
Oracle体系结构之oracle密码文件管理
查看>>
【leetcode】Remove Element (easy)
查看>>
mysql多表查询及其 group by 组内排序
查看>>
alsa的snd_pcm_readi()函数和snd_pcm_writei()
查看>>