以太坊再现安全漏洞——太阳风暴“solar-storm”,或殃及全网智能合约

2016-06-21 15:46 来源:巴比特 阅读:5476
以太坊智能合约脚本语言Solidity又现一处漏洞,它不仅会对DAO产生影响,还会对整个以太坊生态系统产生影响。

以太坊智能合约脚本语言Solidity又现一处漏洞,它不仅会对DAO产生影响,还会对整个以太坊生态系统产生影响。

以太坊中的合约通常会相互进行call调用。社区鼓励这种行为是希望最终实现智能合约间的“互补”。

当以太坊合约进行相互调用时,它们自身的程序控制和状态功能会丢失。这个漏洞是由Augur核心开发人员Joey Krug 和Gnosis联合创始人Martin Köppelmann发现的,后来由康奈尔大学博士生Philip Daian和研究者Emin Gun Sirer共同发布。

以太坊漏洞

这个漏洞与DAO攻击者利用的可重入性(reentrancy)(注:可重入与递归概念相似,关于DAO攻击漏洞,官方用词是递归调用漏洞,这里的可重入性是作者个人观点)的漏洞不同。暂且称之为太阳风暴(solar-storm)吧(因为它能切断以太坊智能合约间的沟通,就像太阳风暴能切断地球的通讯设备一样)。Daian在发布这个漏洞时并未给出确切的名字,不过他挺喜欢“太阳风暴”的。

 

太阳风暴 VS 可重入性

 

可重入性(reentrancy)漏洞发生的前提:

  1. 1. 合约A,函数A call调用合约B

  2. 2. 合约B call调用合约A,函数A

Daian认为,合约间仅一次简单的调用也会暴露漏洞。

太阳风暴(solar-storm)漏洞发生的前提

  1. 1. 合约A call调用任意外部合约

  2. 2. 合约A状态经外部函数修改(这是经常会发生的情况)

因此太阳风暴(solar-storm)漏洞发生的例子有:

  1. 1. 合约A,函数A call调用合约B

  2. 2. 合约A的另一个函数C与函数A共享状态

  3. 3. 合约B call调用合约A,函数C

为了避免暴露这种漏洞,我们有两种选择:

(a)禁止合约进行外部调用
(b)禁止使用外部调用函数与发起外部调用的函数共享状态

在实际用例中完全禁止b是不可能的,因此我们必须不再进行合约外部调用。如果不得已必须进行外部调用,可以在编程完成之后进行,一旦外部调用开始执行,合约状态不要再做更改。

太阳风暴(solar-storm)漏洞比可重入性(reentrancy)漏洞涉及面更广。

这意味着什么呢?

 

总结

 

太阳风暴(solar-storm)漏洞不单会对DAO合约产生影响,还会对以太坊的所有合约产生影响。这是以太坊编程语言Solidity的漏洞。

已经发布的以太坊合约也可能存在漏洞。开发者需测试其合约的性能,采取相应措施(转移资金、发布新合约等)。

开发者对其即将发布的合约的外部调用要相当小心。尽量避免外部调用,直到这一漏洞彻底修复。

 

下一步该怎么做?

 

重新检查所有已发布的智能合约。用Solidity编译器检测漏洞。这一漏洞目前尚未广而告之,因此应编写Solidity文档向其他人发出通知。


声明:此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。本网站所提供的信息,只供参考之用。

点击阅读全文