[block #18] 用一美元冻结一个亿

[block #18] 用一美元冻结一个亿

昨天以太坊钱包软件Parity又上头条了。七月爆出的安全漏洞让Parity用户损失了三千万美元,这回闹得更猛也更有戏剧性,直接冻结了超过50万个ETH,价值上亿美元。


事情还得从七月那次丑闻说起。在以太坊社区,Parity是普及率仅此于Geth的第二大钱包软件。Parity公司的共同创始人Gavin Wood名气不小。他是以太坊虚拟机EVM和合约开发语言Solidity的核心设计者。他们公司的多重签名钱包软件用智能合约实现了丰富的功能,尤其被不少组织机构青睐。


丰富的功能自然也伴随着复杂的代码和隐藏的错误。七月时,匿名黑客利用一个严重的安全漏洞,间接调用了初始化钱包软件的库函数,让自己成为多个Parity钱包的新主人,窃取了15万个ETH。幸好一群正义的白帽子黑客及时发现,抢先一步帮尚未被盗的钱包主人转移、保护了资产。Parity公司也紧急发布了安全补丁,暂时松了口气。


不料那匆忙发布的补丁中遗留了另一个漏洞,很久都没被人注意到。直到昨天,一个自称是以太坊新手的github用户devops199意外发现,自己能通过库函数成为库的主人,然后调用自杀函数报废整个合约库。他在github上报告的错误标题是“anyone can kill your contract”,起初似乎没意识到,他报废的库是Parity多重钱包共享的。也就是说,所有依赖这个库的Parity钱包都受到了波及。让人泪奔的后果是钱包的提款功能都失效了;让人哭笑不得的是收款功能还正常。


7月20日之后新部署的Parity多重签名钱包都遭了殃。150多个地址中超过50万个ETH被彻底冻结。损失最大的莫过于最近刚通过ICO成功融资1.4亿美元的Polkadot项目,他们约60%的以太币保存在受影响的Parity钱包中。而Polkadot的发起人不是别人,正是Parity公司的Gavin Wood。这种自食其bug的滋味真是难以想象。


devops199无意中闯下大祸,冻结了上亿美金。而他调用函数一共花了0.00285 ETH,按Parity事件后以太坊迅速下跌的币价算,折合美金约$0.84。


当然,这事完全是Parity疏于安全代码审阅造成的,不能赖在以太坊身上。只要不搞硬分叉赖账,不会对币价产生深远影响。


对程序员来说,这再次警醒我们:系统复杂性是安全性的大敌。另外,在开发以太坊智能合约时,用delegatecall把逻辑移至外部库合约是件高风险的事。虽然可以降低部署合约的燃料费用,还能动态升级代码,但一不小心就会像Parity那样把所有依赖库代码的合约全毁了。


至于Parity公司,这回真是颜面扫地,不知如何收场。也不知他们哪天有空,把主页上“The fastest and most secure way of interacting with the Ethereum blockchain”的标语改得符合事实一点。

编辑于 2017-11-08