TheDAO被攻击事件考察报告

段玺[Andy]   |     |   4001 次阅读

作者 ChinaLedge联盟 段玺(Andy Dan)

简介

北京时间2016年6月17日发生了在区块链历史上留下沉重一笔的攻击事件。由于 其编写的智能合约存在着重大缺陷,区块链业界最大的众筹项目TheDAO(被攻击前 拥有1亿美元左右资产)遭到攻击,目前已导致300多万以太币资产被分离出TheDAO 资产池。TheDAO编写的智能合约中有一个splitDAO函数,攻击者通过此函数中的漏 洞重复利用自己的DAO资产来不断从TheDAO项目的资产池中分离DAO资产给自己。

攻击方法

攻击者组合了2个漏洞攻击。攻击者利用的第一个漏洞是递归调用splitDAO函数。
也就是说splitDAO函数被第一次合法调用后会非法的再次调用自己,然后不断重复这 个自己非法调用自己的过程。这样的递归调用可以使得攻击者的DAO资产在被清零之 前,数十次的从TheDAO的资产池里重复分离出来理应被清零的攻击者的DAO资产。 攻击者利用的第二个漏洞是DAO资产分离后避免从TheDAO资产池中销毁。正常情况 下,攻击者的DAO资产被分离后,TheDAO资产池会销毁这部分DAO资产。但是攻击 者在递归调用结束前把自己的DAO资产转移到了其他账户,这样就可以避免这部分 DAO资产被销毁。在利用第一个漏洞进行攻击完后把安全转移走的DAO资产再转回原 账户。这样攻击者做到了只用2个同样的账户和同样DAO资产进行了200多次攻击。

事件经过

6月15日左右此次的攻击合约被创立,北京时间6月17日攻击开始。
Vitalik Buterin在知晓攻击后立刻通知了中国社区。
TheDAO监护人提议社区发送垃圾交易阻塞以太坊网络,以减缓DAO资产被分离 的出去的速度。
随后Vitalik在以太坊官方博客发布题为[紧急状态更新:关于DAO的漏洞]的文 章。该文章解释了被攻击的细节以及解决方案提议。提议方案为进行一次软分叉。不 会有回滚,不会有任何交易或者区块被撤销。软分叉将从块高度1760000开始把任何与 The DAO和child DAO相关的交易认做无效交易,以此阻止攻击者在27天之后提走被盗 的以太币。这之后会有一次硬分叉将以太币找回。
上述文章公布后攻击暂时停止。
以太坊社区的Ethcore团队发布了支持软分叉的Parity客户端。
北京时间6月19日自称攻击者的人通过网络匿名访谈宣布会通过智能合约的形式
奖励不支持软分叉的矿工100万以太币和100比特币,来对抗以太坊基金会提议的软分叉。
北京时间6月19日攻击再次开始,但是只有少量DAO被分离。
北京时间6月22日白帽黑客开展罗宾汉行动将TheDAO资产转移到安全的子DAO中。
随后黑帽黑客(攻击者)开始攻击白帽黑客所创建的为安全转移TheDAO资产的智能合约。

事前警告

然而, 最令人遗憾的是早在5月份,以太坊团队成员Vlad Zamfir等人就呼吁由于 安全问题冻结The DAO项目,并给出了几种可能的攻击方案。
此外,本次攻击手法早在6月9日在网络上被提及过,智能合约语言Solidity的作者 Christian接着在6月10号也在以太坊官方博客上发表了文章提醒大家注意这个问题。6 月11号,以太坊上另外一个项目MakerDAO发现自己的合约中存在这样的问题, 所幸处 置及时,并未造成什么损失。而TheDAO的团队在收到同样的安全报告后作出了暂时 不会受到攻击的结论。
以太坊创始人,万向区块链实验室发起人,ChinaLedger联盟顾问Vitalik Buterin早 在几周前提交给R3的以太坊评价报告里,甚至在攻击发生的前一天的上海报告讲座中 都讨论了以太坊智能合约的安全性问题。Vitalik提出,为了解决程序员作恶和程序员 出错的问题,以太坊里将会提供两类,分别为低科技的和高科技的解决方案。高科技 解决方案在理论上能够提供更好的希望,不过会带来整合的难度,以及更依赖于复杂的工具。而针对作恶问题的低科技解决方案有两个层面。第一,在以太坊里,明确应用程序的 核心(纯粹由智能合约的集合构成)以及界面(HTML 和 Javascript 代码通过读取区块链及 发送交易的方式与核心通讯) 的区别。以太坊的目标是让核心变得可信,若要实现这点, 核心就必须尽量精简,并且经过深入的审计和审查;而用户界面可能包括大量的代码,可 以无需这么信任; 以太坊一个中期的设计目标是让以太坊用户界面去保护用户,以免他 们受到来自作恶的交易界面的损害,如通过强制性的弹出一个“你是否想将带有这些数 据的 一个交易发送到这个合约里?”对话框(或其他形式的通知方法)。以太坊希望会呈 现出一些专业事务所的市场空间,就如今天律师事务所创建标准化法律合约那样,这些专 业事务所会为不同的用例创建标准化的合约,并让这些合约接受来自第三方审计人员的 深入检查。审计和标准化可以减少代码错误带来的损害,不过在错误的特例里,已经有人 进行了数十年的研究,引入了一种强类型要求的编程语言,专门用于避免错误; 这类语言 让你可以更丰富地指定每一种数据的含义,并自动防止数据被以明显错误的方式组合起 来(如时间戳加上了一个货币价值,或由区块哈希值分割的地址)。
更高级的解决方案依赖于名为形式化验证(Formal Verification)的 技术。简单地说, 形式化验证就是使用计算机程序自动地在数学的层面上证明关 于其他计算机程序的语 句。
现在,以太坊的高级编程语言 Solidity的主导开发者 Christian Reitwiessner正在将形 式化证明引擎 Why3 整合到 Solidity 里面,让用户可以在 Solidity 程序里面插入与某种数 学论点有关的证据,并在编译的时候进行验证;还有一个项目在将形式化证明技术 imandra整合到以太坊虚拟机的代码里。
影响范围 此次攻击只针对编程中有漏洞的智能合约,因此以太坊系统本身(共识协议,虚
拟机,数据库)没有任何伤害。但是以太坊平台上应用层项目中的智能合约代码需要 重新进行谨慎的审计。TheDAO资产池中的DAO资产都是不安全的,所有的DAO资产 都有可能被攻击者分离到自己的账户。

各方反应

Vitalik个人支持软分叉的提议,也支持软分叉的开发工作,支持矿工到时候升级
客户端来支持软分叉。然而Vitalik也认识到大家对这个提议有激烈的争论,无论哪一 方的观点都有强力的反对。因为软分叉不需要回滚交易,不会对用户和交易所造成不 便,这更使Vitalik倾向于采取行动的一方。也有许多人,包括在基金会内部,倾向于 另外一方反对软分叉。Vitalik不会阻止也不会反对另一方在公开场合宣传他们的观 点,甚至是游说矿工来抵制这个软分叉。在这件事情上Vitalik会坚决的不与任何站在 相对他的另一方的人争辩。
以太坊的联合创始人Anthony Di Iorio在推特上发言认为不能因为一个应用而改变 以太坊。
EthFans社区在第一时间对事件的发展进行了及时的跟进,总结了中国社区对分叉 的看法,鼓励中国社区发出自己的声音。目前社区内部从公平,法律,道德,政治, 去中心化等不同角度对是否应该分叉正在进行大讨论。

反省与思考

在被攻击后以太坊基金会的问题处理对策也值得关注和借鉴。
1. 确认问题的现状:TheDAO的资产被不断分离到某个子DAO里。
2. 为研究问题对策争取必要的时间,减缓问题带来的损失:号召社区利用垃圾交
易等阻断后续的资金转移。
3. 对问题原因的推断:判定函数的递归调用是根本原因,并将问题公布于官方博
客上让大众知晓现状。
4. 制定临时对策:为了控制问题的外流,给予社区充分的时间来研究和讨论最终
对策。组织核心开发团队开发补救版本,拟通过“软分叉”方式部署上线,以此来达 到事实上废除发生在TheDAO及其子合同之间的以太币转移交易的目的。攻击者也 因此受到震撼,暂停了攻击。
5. 提案最终对策:提出不排除通过“硬分叉”方式实现全网的版本升级。以太坊基 金会只能提出修改系统的选项,经过社区对此次问题的原因和影响充分了解,深思 熟虑后,这些选项最终是否被采纳则取决由以太坊网络的维护者——矿工。
6. 制定预防复发的对策:为了防止同样的问题同时爆发,排除类似的潜在问题, 发动整个社区审核复查现有的智能合约,呼吁社区共同研究智能合约编程缺陷的解 决方案,预防此类问题再次发生。
以下几个安全设计思想可以帮助我们反省如何设计一个更安全更健壮的适合联盟
链的智能合约平台。
InterLock
必须在确定安全后才能让智能合约运行,或者是在危险察觉时让智能合约自动停止。
比如在智能合约中设立触发条件,由多人签名后可触发合约的执行停止。亦或者是占有一定比率的节点投票后可触发智能合约的运行停止。
这次TheDAO在设计的时候允许个人对自己的DAO资产进行分离,但是必须等待 27天才可以提取以太币。这个设计使的这次TheDAO被攻击仍然让攻击者需要27天才 能提走被盗的以太币。虽然这个设计并未阻止攻击的行为,但是却给TheDAO团队和 以太坊基金会,以及社区充足的时间来研讨对策,评估对策带来的风险。值得注意的 是,无论社区最后是否支持分叉,以太坊作为一个生态整体在面对这次攻击时没有被 打的措手不及,而是在经过充分讨论,合理提案,达成共识进行选择之后从容冷静的 进行了处理。
Fool-Proof
无论是谁编写智能合约都不会让问题产生。这种设计思想的目的是减少带无意识
错误的智能合约。有以下的提案:
改进现有的智能合约语言的标准,使之可以升级在链上运行中的合约的安全性,
使之无法有隐藏的动作,言行一致,使之确保状态变化的时机,使之确保状态机的任
何状态都可以被恢复。
将尽可能多的模块标准化。这些标准化的模块将会得到足够充分的审计,从而保
证安全性供开发者使用。
准备一个更好的开发环境,可以更简单的对智能合约进行调试和检查。
与安全研究专家共同合作,用各种验证工具测试智能合约。
研发探索形式化验证技术,对智能合约进行自动化验证。
然后对于区块链上的纠错机制,目前为止似乎只有分叉这一方式。以怎么样的程序来决定是否分叉,甚至除了分叉是否有其他的方法来纠正区块链上的错误需要继续研究。
互联网的应用可以在底层不怎么稳定的时候进行开发,因为很多互联网应用对系 统的可用性要求不高,即便发生错误所带来的损失并非不可接受。但是区块链上或者 说价值网络上的应用直接关系到金钱,信用,所有权,认证,资产,控制权等,远比 互联网承载的的信息更有价值,一旦发生错误带来的损失也是不可同日而语的。在目 前区块链技术发展早期的阶段,不应该在没有稳定健壮的底层技术的基础上直接去做 应用。正如这次TheDAO出现了问题一样,多亏了控制底层技术的以太坊基金会迅速 的提出了解决方案。也多亏了以太坊底层数据结构设计与比特币的不同,即使发生硬 分叉与TheDAO无关的交易也不受任何影响。如果我们在没掌握基础技术的前提下就 去贸然的直接开发应用,特别是在金融系统中动则涉及到大额资产资金的应用的时候, 一旦发生问题,如何迅速对问题进行定性定量分析,如何迅速的确定解决方案,如何 评估解决方案的风险等一系列的流程根本无从谈起。此次TheDAO被攻击虽然是因为 应用层的智能合约编写问题,但是无论是形式化证明,智能合约编程语言,合约调试 检查工具等解决方案都属于中间层,如果说要对执行智能合约的EVM(以太坊虚拟 机)进行修改的话,那更是要修改底层设施。万丈高楼平地起,只有把健壮安全的底 层,中间层脚踏实地的建设好才能让工业级的应用百花齐放。ChinaLedger项目亦志在于此。

参考信息

1.https://en.wikipedia.org/wiki/The_DAO_organization)(
2.https://m.reddit.com/r/ethereum/comments/4os7l5/the_big_thedao_heist_faq/
3.http://vessenes.com/deconstructing-thedao-attack-a-brief-code-tour/
4.http://ethfans.org/posts/116
5.http://ethfans.org/posts/117
6.http://aestheticintegration.com/imandra/
7.http://ethfans.org/topics/356
8.http://hackingdistributed.com/2016/05/27/dao-call-for-moratorium/
9.https://blog.ethereum.org/2016/06/10/smart-contract-security/
10.http://ethfans.org/topics/369
11.https://twitter.com/diiorioanthony
12.http://ethfans.org/topics/361
13.http://ethfans.org/posts/114

 
1 人喜欢