区块链安全漏洞隐患,DAO黑客可重入性

2019-05-18 11:54

在区块链领域中,安全方面的考虑压倒了软件中所有其他要考虑因素。如果实现不了安全, 其他任何方面做得再好也于事无补。

区块链被证明分散的, 可信任的事务工作, 但许多区块链的安全漏洞仍然存在。

安全漏洞存在于设计阶段、编码阶段和操作阶段。同样,区块链有可能受到黑客的攻击。

区块链安全漏洞隐患,DAO黑客可重入性

区块链安全漏洞

智能合约的存在就像钻石一样是永恒存在的,只要它们被部署的区块链继续被使用。因此,所有的漏洞和区块链安全漏洞也会像智能合约一样存在。

通常, 每个区块链提供其自己的编程语言来实现智能合约。

智能合约的编程语言

区块链会利用他们自己的语言来开发智能合约。

例如,以太坊平台包含了编写智能合约的可靠语言。创作者设计的是一种坚固的图灵机完整语言。

图灵机完整的语言实质上允许程序员实现底层系统所能做到的任何事情。因此, 这就给程序员提供了代码中实现循环的能力, 这可能会导致区块链引发安全漏洞。

图灵机完整语言

图灵机完整语言非常的复杂, 但正是这种复杂性往往会招致 bug 和漏洞。

比特币网络也有一种编程语言,它称之为脚本。脚本的目的不是为了增强安全性。

给程序员的选项越少,区块链安全漏洞进入系统的可能性就越小。

为了尽量减少将错误代码发布到链外的风险, 程序员必须了解智能合约编程中固有的常见缺陷和反模式。(反模式表示错误的编程实践)。

DAO黑客:可重入性问题

区块链安全漏洞隐患,DAO黑客可重入性

可重入性问题在被编写到智能合约中的区块链安全漏洞中可能排在最高的位置。可重入性通过对同一事务的多个支出来消耗一个帐户。处理退款的用例适合这种利用,但是如果不在设计和编码阶段解决,这种缺陷就会影响到所有事务。

在迄今为止最臭名昭著的加密货币攻击之一中,DAO黑客就利用了可重入性。没有组织领导决定如何运行DAO(分散的自治组织),使他们能够对投资的项目进行投票。

它在第一个月筹集了超过1.5亿美元的资金。2016年6月17日,黑客从该组织的“重入性”漏洞中抽走了5000万美元。从以太经典(ETC)到以太币(ETH)的硬叉导致了解决这次黑客攻击所产生问题的所有努力。

反模式易陷入可重入性

代码脆弱的可重入性逻辑看起来是这样的:

处理支付()的函数

(1) 检查交易的有效性、收款人和账户余额;

(2) 处理交易;

(3) 更新系统状态,以显示已处理了事务;

乍一看,逻辑看起来是正确和完整的,但缺陷在于步骤3之前执行步骤2的顺序。

对函数的第一次调用将继续处理步骤2,而对同一事务的另一次调用则可以输入该函数。由于状态信息仍处于初始状态,尚未在步骤3中处理,因此第二个调用将检查为要处理的有效事务。

因此,该系统第二次为同一义务支出货币。黑客在状态正确设置之前,将多个事务快速地发送到函数中。

治疗可重入性

对算法的这一修改纠正了上面的问题:

处理支付()的函数

(1) 检查交易的有效性、收款人和账户余额;

(2) 更新系统状态以显示已处理了事务;

(3) 处理交易;

代码必须说明所有必要的异常处理,并且它还必须说明所有逻辑依赖项。

Overflow

Overflow是程序员需要注意的另一个常见的安全缺陷。

一些编程语言提供了强类型,而其他语言提供了弱类型。例如,强类型语言不允许程序员将字符串数据分配给数值变量,弱类型语言允许执行此类操作。

强类型语言实施范围有很大的限制。如果一个数组是十个元素,程序员就不能尝试访问第十一个元素。弱类型语言允许这样的行为,但会导致崩溃。如果一个变量所允许的最大值是99,并且为它赋值100,那么运行它时就会看到它崩溃!

因此,Overflow是黑客常使用的手段。如果黑客向智能合约提供了一个超出代码处理范围的参数,就会产生崩溃结果。这样的崩溃助长了多重攻击。崩溃可能触发拒绝服务攻击(DDoS攻击),这时,关于系统内部的重要信息有时会在错误消息中显示出来。

在web应用程序中,黑客经常用自己的恶意代码填充内存,因此,当程序崩溃并进入内存中的一个随机点时,恶意代码就会执行。

弱类型语言提供了强大的功能和动态灵活性,但它们也需要更严格的设计和测试来抵抗攻击。

大量的安全问题困扰着软件世界。随着新技术的出现,出现了新的威胁。除了上面提到的漏洞外,这些明显的缺陷只是许多其他区块链安全漏洞中的一些。

糟糕的密码系统制造了很多麻烦。密码学确保隐私,当隐私被破坏时,一切都会被破坏。IOTA团队犯了一个错误,在产品的初始版本中从头编写自己的密码库。滚动自己来加密所固有的问题是,所有复杂的软件都包含错误。

建立的密码库在经过学术界的审查后仍然存在,并且随着时间的推移,证明它是可靠的。

在钱包的世界里,随机数生成必须是真正随机的。特别是在加密货币出现的初期,一些钱包就不能满足这一要求。

加密货币要求地址必须是唯一的。唯一性来自一个随机数生成器,并且随机数生成器需要一个种子来开始这个过程。如果种子不是真正随机的,系统就会失败。

一个坏的随机性的结果意味着同一地址被多次创建。想象一下,钱包将地址X分配给某人A,然后稍后某个时候将地址X分配给某人B。当付款到达地址X时它只适用于一个人。那么到底哪个人会得到钱?

当黑客找出用于创建种子的算法时,会出现另一个随机性不好的问题。黑客为自己重新生成种子,并拥有系统。

安全永无止境

安全是一场永无止境的战斗,即使程序员、架构师和测试人员从代码中删除了所有漏洞,操作漏洞依然存在。

在一个工作环境的证明中,如果坏的参与者控制了网络的51%,那么完整性就会被破坏。博弈论为这种攻击提供了缓解。但是51%的攻击摧毁了货币的价值,所以攻击者只是伤害了他们自己。

区块链生活在互联网上,和互联网一样,也和黑客有同样的接触。例如,假设您从一个网站上的交换器中购买代币。注射式攻击、跨站点编写脚本、网络钓鱼攻击以及所有其他传统网站攻击都占上风。

结语

正如程序员要防范错误一样,程序员也必须在开发中考虑到安全性。虽然存在一些帮助程序员完成任务的工具,但是程序员必须首先了解他们自己的漏洞以防止它们。

分散式应用安全项目(DASP)希望成为区块链安全性信息和资源的存储库。他们在开放的Web应用安全项目(OWASP)上对自己进行了一些建模。年度OWASP前10名明确列出了目前存在的主要网页应用程序漏洞。DASP前10名希望为区块链提供同等的资源。

并非所有的攻击都是事先知道的。零日攻击定义了黑客在其他人之前就知道的漏洞。所以程序员在设计和实现软件时必须像攻击者一样去思考。如果您没有在代码中找到漏洞,那么希望寻找利润的黑客来替你找到它们。

分享到:
收藏