作者:Muneeb Ali BLockstack实验室联合创始人 普利斯顿在读博士

译者:几何级数 比特天空网

原文链接:

https://blog.blockstack.org/solar-storm-a-serious-security-exploit-with-ethereum-not-just-the-dao-a03d797d98fa#.la1s9v1gz

Solidity,以太坊用于开发智能合约的类java-script语言,被发现有一个安全漏洞,可以影响整个以太坊,而不仅仅是DAO

以太坊合约常规性的调用其他合约。这是社区鼓励采用的行为,愿景是智能合约在任何地方进行互动。

结果是,当一个以太坊合约与另一个合约交互时,它会丧失对自己的程序控制和状态。这个脆弱性由Joey KrugMartin Köppelmann发现,由 Cornell的博士生Philip Daian公开

如果你使用Solidity的调用功能(call),同时你自己的合约有一个可以被外部调用的函数可以修改状态,那么你无法对你的合约在调用外部函数之后的状态做任何假设

上述问题,在DAO攻击时并非公知的。搜索Solidity调用的相关文件.它没有针对这个大规模的安全漏洞作任何提示,误导了开发者错误的觉得使用这个架构很正常很安全。

非常重要的,应区分这个漏洞和可重入性——一个已知的漏洞,并被用于攻击DAO。我们把这个漏洞叫做太阳风暴吧(因为它冲击以太坊智能合约,就像太阳风暴冲击地球上的通讯基础设施)。Daian并未给它命名,但是喜欢太阳风暴这个名字。

 

太阳风暴vs可重入性:

可重入攻击在下述情况下可发生:

合约A,函数A调用合约B

合约调用合约A,函数A

Daian的关键洞见是甚至任何一个合约的一次外部调用都足以被攻击太阳风暴攻击会在以下情况发生

合约A调用任何外部合约

合约A有外部函数来修改状态(多数情况下都有)

所以一个太阳风暴攻击的例子是

合约A,函数A调用合约B

合约A有另外一个函数C,与函数A共享状态。

合约调用合约A,函数C

这意味着对于以太坊合约要么a不能使用外部调用b不能有外部函数与执行外部调用的函数共享状态

由于(b)实际操作很难,所以这意味着基本上合约就不能调用外部函数了。如果你一定要有外部调用,那么你只能在自己的逻辑都完成之后,当外部调用之后,你无法对你的合约在调用外部函数之后的状态做任何假设。

太阳风暴可以被理解为可重入性的一个变种但是这是比可重入性更广泛的漏洞而且容易被忽略

这意味着什么?

小结

1 这会冲击以太坊上的所有智能合约,不仅仅是DAO。这是以太坊用于开发智能合约的类java-script语言Solidity的问题。

2 可能在以太坊已经发布的合约中存在这种漏洞。开发者应当检查是否他们的合约具备脆弱性,并采取相应措施(转移资金,发布新合约)。

开发者在未来的合约中,应当对进行外部调用极度谨慎。避免外部调用,直到本问题被解决。

 

下一步:

需要对所有的已发布智能合约进行全面评估。我们也需要一个静态的分析器,来查找这些脆弱性,而且Solidity编译器应该能够发现这个问题。这个脆弱性并未被广泛知晓,Solidity文档应当提出警告。

 

译者评论:

这个漏洞是智能合约的开发陷阱,并不是以太坊系统的漏洞。也即,不用担心以太坊区块链和以太币的安全问题。

图灵完备的开发平台,程序开发中自然有许多陷阱,程序开发者应当对自身程序健壮性负责,不能程序崩溃了就怨开发平台。

以太坊团队存在未尽到告知义务的问题。相反,以太坊团队一直宣传开发智能合约是多么的简单。当然,以太坊团队可以辩解说他们没有意识到这个问题。但是,至少,进行笼统的安全提示是必要的,例如“智能合约程序可能存在漏洞,参与者可能损失部分甚至全部的资产。请在充分评估风险后再参与”。

基于墨菲定律,如果谨(bei)慎(guan)一点,可以认为当前已发布的所有智能合约都是不安全的。所有的智能合约都应当在修改后重新发布。那么我们可以认为当前的以太坊区块链数据已经是垃圾数据了。那么,以太坊被克隆或者山寨的可能性将付出水面,这是一个极度重要的话题,因为涉及到价值9亿美元的以太币。

智能合约的开发门槛并不像以太坊团队所描述的那样低,相反,其门槛甚至要高于区块链系统的开发门槛,因为区块链系统只能被数据攻击,而不能被代码攻击。所有的智能合约都应当像区块链系统一样,由开发团队进行全方位的攻击,确认安全后再发布。或者,在测试链(testnet)上先公开,由全网进行攻击,确认安全后再发布。

很显然,这个漏洞的公开对与以太币、智能合约,甚至整个区块链概念都是负面的。

一切客观的揭露风险和提示未来风险的行为,都可以被理解为以太黑。老猫发明了“反智”一词。