9.6 代码漏洞:智能合约之殇

9.6.1 说说TheDAO事件

提起TheDAO就不能不先说说以太坊,因为这个事件就是以太坊发展过程中发生的一个重大的安全事件。事实上这个事件到最后已经演变为两种价值观之争,而不再只是技术方面的争论了,以太坊也因为这个事件硬分叉为两个版本:以太坊经典(ETC)和以太坊(ETH)。

先来说下这个事件吧,以太坊属于区块链的二代技术,与比特币这种一代技术的应用比起来,支持更复杂的脚本编程,不 但本身实现了数字货币,而且还可以让开发人员通过使用以太坊支持的脚本语言自定义编写所需功能的智能合约,这是一个相当跨越的创新。通过智能合约的实现, 人们可以在以太坊上创建自己的数字货币(没错,你可以在以太坊上创建以你名字命名的数字货币)、众筹合约(类似于一个公开透明的基金账户)、自治管理组织 (比如创建一个融资租赁公司,创建一个合作翻译的组织等)。以太坊的这些能力引起了人们极大的兴趣,其中就有人通过这些技术特性创建了一份众筹合约,这便 是TheDAO事件的开始。

大家这里要注意区分一下DAO与TheDAO的区别,DAO是Decentralized Autonomous Organization的简称,也就是去中心自治组织或者叫分布式自治组织(两种说法有哲学意味上的差别,这里就不去展开了),DAO是以太坊智能合约 支持的一个功能,而TheDAO是通过这种技术创建并运行在以太坊上的一个智能合约,这是由德国初创公司Slock.it开发建立的,这份众筹合约一度融 资众筹达到1.5亿美元,每个参与众筹的人向众筹合约投资以太坊(其实以太坊本身支持的数字货币,也可以叫以太币),并且根据出资金额获得相应的DAO代 币,出资人具有审查项目和投票表决的权利。

然而,以太坊本身虽然是健壮的,跟比特币网络一样,通过一系列的区块链技术确保了安全,但是创建在其上的智能合约 却未必如此,比特币为什么没出现过这样的问题,因为比特币本身并不支持复杂的脚本编程,只有功能极其简单受限的堆栈指令,以太坊拓展了脚本的功能,使其成 为了功能完备的编程脚本。复杂带来了功能的强大,也带来了更多的危险。TheDAO合约的源码中存在着一个函数调用的漏洞,使得攻击者可以将TheDAO 资产池中的以太币非法转移给自己。这个问题被发现后,TheDAO监护人立即提议社区发送垃圾交易阻塞以太坊网络,减缓TheDAO资产被转移出去的速度 (这个其实本身就是属于一类问题了)。2016年7月,以太坊官方修改了以太坊的源码,在区块高度1920000强行把TheDAO及其子DAO的资金转 移到了另外一个合约地址,通过这种方式夺回被攻击者控制的DAO合约中的币,但是这样却导致以太坊发生了分叉,从而导致变成了两条链:一条为原始的区块链 (ETC),一条是分叉出来的新的链(ETH)。可能有朋友会奇怪,怎么原始的链还会一直存在呢?是的,这是因为以太坊作为区块链应用,是一个去中心分布 式的系统,软件升不升级不是创始人能控制的。事实上,ETC和ETH代表了社区的两种价值观,ETC一方认为无论资金发生了什么样的问题,这个是已经发生 的事实,而区块链应用的精神就是不可篡改,账本已经形成了就是形成了,这是必须坚持的原则,ETH一方认为这是一种违法行为,一种破坏行为,发生在软件系 统上的行为不能违法,不能忽略司法的意义,为了坚持一种信仰而任由破坏者攻击是不合适的。

无论如何,这个事件的影响是很大的,也让大家意识到,智能合约还处于发展的初始阶段,区块链应用有很好的创新,很 好的技术机制,但当复杂度提高以后,建立在上面的应用也会伴随着各种风险,同时与此相关的各种法律法规建设以及监管制度也亟待探讨建立。未来,相信随着相 关的技术标准的逐步建立,代码规范的建立以及底层基础设施的不断进化,很多技术上的问题会一一得以解决。很多时候,破坏性的事件充分暴露潜在的问题,反而 会促进技术的进步。

9.6.2 Parity多重签名漏洞

Parity是以太坊中使用很受欢迎的一类钱包客户端,它是使用Rust语言开发的,这是一种可以用来编写底层系 统的开发语言。Parity在性能上很卓越,运行速度快,系统资源占有少,区块数据的同步也很快。另外,虽然Parity是一个全节点钱包,但是同步区块 数据的时候对于较早期的区块只保留了区块头而去除了其他数据,因此减少了不少的数据体积,通过Parity也能很方便地编写部署智能合约。要详细了解 Parity,可以到这个网址查看:https://parity.io/parity.html。 然而,就在2017年7月19日,发生了一个很严重的BUG事故,问题出在Parity钱包的多重签名合约库代码。在库代码中存在一个漏洞,使得攻击者可 以越权调用合约函数,并将合约中的资产转入到自己的地址,虽然这个漏洞在发现后立即修补了,但是因此而带来的损失和影响却很大。说到这里,大家可能觉得以 太坊不是很不安全,又是TheDAO事件,又是Parity钱包,其实这两者的问题都是出在智能合约的编写上,而不是以太坊本身的问题。如果做个类比的 话,以太坊相当于Windows这样的操作系统,智能合约则是运行在上面的应用程序。这些事件的发生也告诉我们,当区块链应用支持越来越复杂的功能时,也 会放大各种可能的问题概率,大家在编写智能合约时,一定要进行专业的代码审核,任何一个小小的漏洞都有可能导致存入合约中的资产全部丢失。除了要小心合约 代码的编写外,站在发展的角度,我们也亟待建立智能合约的编写规范、测试规范等,通过标准化的编写流程来保证安全。

我们看下Parity官方发布的漏洞报告:

9.6 代码漏洞:智能合约之殇_第1张图片

来源:我是码农,转载请保留出处和链接!

本文链接:http://www.54manong.com/?id=60

'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646208", container: s }); })();
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646147", container: s }); })();

你可能感兴趣的:(9.6 代码漏洞:智能合约之殇)