取消
加载中...
从The DAO黑客事件看区块链安全隐患
DorAemon 2018-07-11 10:28

出品|三言财经

情报员|明超

在软件行业,整体而言安全方面的考虑是重中之重。这一点对于区块链技术来说尤为如此。如果安全底线被突破,其他问题也就无从谈起。区块链技术被证明可以用于打造一个去中心化、去信任的交易系统,但区块链系统仍然不是百分之百的安全无虞。

安全漏洞存在于设计、架构、编程、运营等各个阶段,因此,区块链也是可能被黑客攻击的。

对于智能合约而言,只要被部署在区块链上,就会和该区块链共存。所以,所有的漏洞与安全缺陷也会和智能合约共存。

基本上每一个区块链都使用一套自己的编程语言来部署智能合约。我们来仔细研究一下。

智能合约语言

区块链环境包括开发智能合约所使用的语言。

例如,以太坊平台使用的是Solidity语言编写智能合约。Solidity语言的开发者将其设计成一种图灵完备的编程语言。所谓图灵完备,就是该语言允许编程者可以执行一切底层系统可以计算的问题。这就让编程者可以在代码中实现循环,但也潜在地为区块链带来了安全隐患。

图灵完备

图灵完备语言天然具有复杂性,而复杂性又会带来漏洞和安全隐患。

比特币网络使用了一个名为Script的编程语言,该语言并不是一种图灵完备语言,目的就是为了增强安全性。

编程人员的可选择性越少,那么区块链产生安全隐患的几率就越低。

为了减少释放错误代码带来的危害,编程人员需要了解智能合约开发过程中的陷阱和反模式(反模式是指错误的编程方式)。

The DAO黑客事件:一个可重入性问题

在编程人员开发智能合约给区块链带来的众多安全隐患中,可重入性问题危害最大。它会导致一个账户在同一交易中被重复支出。这问题经常会发生在退款处理的过程中,但实际上这一缺陷,如果在设计和编程阶段不被预先处理,就会影响到所有交易过程。

在迄今为止最臭名昭著的加密货币领域攻击事件中,黑客就是利用了the DAO在可重入性问题上的缺陷。The DAO的全称为Decentralized Autonomous Organization,意为“去中心化自治组织”,也就是说,没有一个机构化的领导者对其运营进行管理。The DAO本身提倡的是让用户自主投票,选择要进行投入的项目。在the DAO成立的首个月里,它就筹集了1.5亿美元的资金。2016年6月17日,黑客利用其可重入性缺陷,盗取了其中价值5000万美元的以太币资金。该问题直到后来以太经典与以太坊进行了硬分叉之后才得以解决。

反模式易受可重入性问题侵害

一个易受侵害的可重入性程序逻辑是如下这样的

function to process a payment () {

check the validity of the transaction, the recipient, and the account balance;

(2) process the transaction;

(3) update the state of the system to show the transaction has been processed;

}

一眼看上去,这个逻辑是完整且正确的,但问题隐藏在第二步之中。

对于该函数的第一个调用,会继续执行第二步,另一个对于同一交易的调用则会进入该函数。因为状态信息表明其仍在初始状态,且没有在第三步中被执行,那么第二次调用则会验证其为一次有效交易,并予以执行。

最终,系统因为同样的理由再次对货币进行消费。黑客们就会利用这一漏洞,在状态被调整正常前多次使用该函数进行交易。

解决可重入性问题的方法

解决该问题,可以对函数进行一个调整:

function to process a payment () {

check the validity of the transaction, the recipient, and the account balance;

(2) update the state of the system to show the transaction has been processed;

(3) process the transaction;

}

代码需要对所有可能的例外进行解释,同时也需要对所有的逻辑相关性进行解释。

溢出问题

溢出是另一个需要编程人员警惕的问题。

不同的编程语言提供的版式不同。例如,强版式语言不允许编程者向数值变量中添加串数据,而弱版式语言则允许。强版式语言对范围进行限制,如果一个数组包含是个元素,那编程人员就无法获取第是一个元素。弱版式语言则没有这样的限制,但因此也带来了崩溃的可能。如果最大允许值为一个值为99的变量,如果你赋值为100,运行的时候必然会崩溃!

所以,溢出也是一个黑客可能利用的漏洞。如果黑客将一个超出代码可运行范围的参数植入一个智能合约,那系统就会崩溃,而这一次崩溃就会导致一系列的漏洞。这样的崩溃可能引发“拒绝服务”攻击(DDoS attack),关于系统内部运行的关键信息有时候也可能会在错误信息页面中被暴露出来。

在网络应用中,黑客通常会用恶意代码去塞满内存,当程序崩溃、进入到内存的随机点时,恶意代码就会被释放。

弱版式语言提供能力和动态灵活性,但这也需要更灵活的设计和测试,以加强针对攻击的保护。

密码信息漏洞无法斩断

软件世界充斥着大量的安全问题。当一个新兴技术诞生,新的安全威胁也随之而来。除了上述问题以外,下面还有一些区块链安全方面的隐患值得注意。

坏的加密货币会带来很多问题。密码学方面的安全是隐私的保障,如果隐私问题被突破,那么一切安全问题就无从谈起。IOTA团队在他们的产品的首个版本开发过程中,在编写密码数据库时就犯了错误。编制密码时,有一个无法避免的问题在于,所有复杂的软件都存在漏洞,所以你的密码信息必然会有漏洞。

已有的密码数据库,经过了学术界的审核,也在经年累月的实践中经受住了考验。

在数字钱包的世界中,随机数据的生成必须真的是随机的。尤其是在加密货币早期阶段,有些钱包并没有达到这一要求。

加密货币地址要求必须是唯一的。这一唯一性来自于一个随机数值生成器,而这个生成器需要一个诱因才能触发。如果这个诱因不是随机的,那整个系统就会失效。

如果随机性失效,一个重大的后果就是有很多相同的地址会被生成。想象一下,如果同一钱包地址X被分配给不同的人,那如果一个款项被分配进X,究竟谁有资格领取这笔款项?

随机性失效带来的另一个问题是,黑客有可能破解制造诱因的算法,那么他就可以重复为自己制造诱因,从而控制整个系统。

问题源源不断

安全性问题是一场永无止境的战斗,就算是编程人员、架构师、测试人员解决了代码中的所有问题,运行过程中的问题仍然层出不穷。

在一个可信工作环境中,如果有坏人掌控了整个网络的51%,那么网络的完整性就被破坏掉了。博弈论为这种攻击提供了缓冲。一个新的加密货币,因为在网络中的暴露程度最低,可能遭受的攻击几率最大。但51%的网络攻击会损伤加密货币本身的价值,所以攻击者实际上是在攻击他们自己。

区块链因为存在于网络中,所以就像整个网络一样,暴露在黑客面前。例如,你要从一个网上交易所购买代币,植入攻击、跨站脚本、钓鱼攻击,还有其他各种传统黑客攻击方式就会接踵而至。

结语

在编程人员努力对抗各种漏洞的时候,也需要思考如何将对安全问题的防范嵌入到整个开发过程中。市面上有一些辅助性的工具,但编程人员需要首先理解他们自己在面对此类问题时的脆弱之处。

去中心化应用安全计划(DASP,The Decentralized Application Security Project)致力于成为区块链安全信息和资源的知识库。他们在开源Web应用安全计划(OWASP,the Open Web Application Security Project)上进行建模。年度OWASP名单会将现有的10个主要网络应用隐患列入其中。而DASP希望在区块链领域发布同类榜单。

不是所有的网络攻击都可以被预先估计到。所谓“零日攻击”就是指在一次攻击中,黑客先于所有人知道相关情况。因此,编程人员需要在设计和部署软件的过程中,模仿黑客的思维进行思考。如果你不能在代码中找到软肋,那就等着黑客前来攻击吧。

(此文章为三言财经原创编译,转载请注明来源)

DorAemon
文章总数
8122