【回顾】区块链安全事件之Parity钱包被盗事件
摘要: 智能合约目前还在发展早期,没有像现有的传统金融领域一样有审核机构和环节。这个缺失的环节迟早要加入智能合约的建造过程,从制度上帮助智能合约行业提高发起门槛和安全水准、推动稳健推广和应用。
只有不忘历史才能展望未来,在接下来这段时间里我们将一起回顾区块链安全事件总结与区块链技术展望。
Parity 多重签名钱包被盗事件详细回顾:
arity 多重签名钱包被盗事件解析
时间:2017年7月
事件简介:
Parity 是一款多重签名钱包,是目前使用最广泛的以太坊钱包之一,创始人兼 CTO 是以 太坊前 CTO 黄皮书作者 Gavin Woods。
7 月 19 日,Parity发布安全警报,警告其钱包软件1. 5 版本及之后的版本存在一个漏洞。据该公司的报告,确认有153,000ETH(大约价值 3000 万美元)被盗。
据Parity所说,漏洞是由一种叫做wallet.sol的多重签名合约出现bug导致。后来,白帽黑客找回了大约377,000 受影响的ETH。
本次攻击造成了以太币价格的震荡,Coindesk的数据显示,事件曝光后以太币价格一度从235美元下跌至196美元左右。此次事件主要是由于合约代码不严谨导致的。我们可以从区块浏览器看到黑客的资金地址:
可以看到,一共盗取了153,037 个ETH,受到影响的合约代码均为Parity的创始人Gavin Wood写的Multi-Sig库代码:
事件起因:
Github用户devops199打开了#6995——“任何人都可以删除合约。”然后该用户声称他意外删除了合约。
漏洞原因:
因为initWallet函数是公开函数( public function) , 攻击者调用initWallet,重新初始化钱包会把之前合约钱包所有者覆盖, 即可改变钱包所有者。
漏洞代码:
攻击过程技术分析还原:
第一步:成为合约的owner
通过往这个合约地址转账一个value = 0 ,msg.data.length > 0 的交易, 执行到_walletLibrary.delegatecall的分支,该函数能无条件的调用合约内的任何一个函数,黑客调用了一个叫做 initWallet的函数:
这个函数再次调用initMultiowned函数:
不幸的是,initWallet没有检查以防止攻击者在合同初始化后调用到initMultiowned, 这个函数使得这个合约的所有者被改为攻击者,相当于从unix中获得了root权限。
第二步: 转账, 剩下的事情就很清晰了,通过调用execute函数转账到黑客的地址:
第一个参数: address to= 0xb3764761e297d6f121e79c32a65829cd1ddb4d32, 转账额度116779808c03e4140000是为以Wei为单位的的eth,即 82189000000000000000000,可以通过如下的代码获得具体数值。
总结:
通过分析代码可以确定核心问题在于越权的函数调用,合约接口必须精心设计和明确定义访问权限,或者更进一步说,合约的设计必须符合某种成熟的模式,或者标准,合约代码部署前最好交由专业的机构进行评审。否则,一个不起眼的代码就会让你丢掉所有的钱。
提示:以太坊被盗并不是以太坊区块链技术本身的问题,而是该项目的合约的技术安全问题。所以普通大众误会是区块链安全有问题,这个是不客观的。其次,安全问题是整个互联网金融一个重要命题,智能合约的漏洞近期被曝光比较频繁,社区和各公司一定要引起重视。智能合约目前还在发展早期,没有像现有的传统金融领域一样有审核机构和环节。这个缺失的环节迟早要加入智能合约的建造过程,从制度上帮助智能合约行业提高发起门槛和安全水准、推动稳健推广和应用。
(作者:WF曲速未来;本文仅代表作者观点,不代表链得得官方立场)
评论(0)
Oh! no
您是否确认要删除该条评论吗?