OWASP 区块链安全 Top10

分析、整理2011年至2019年之间160个典型的区块链安全事件。

目录

一、高级可持续威胁

1、描述

2、危害

3、修复

二、失控的币值膨胀

1、描述

2、危害

3、修复

三、失效的权限控制

1、描述

2、利用方式

3、修复

四、不安全的共识协议

1、描述

2、利用方式

3、修复

五、考虑不充分的程序逻辑

1、描述

2、利用方式

3、修复

六、不严谨的业务策略

1、描述

2、利用方式

3、修复

七、校验不严格的交易逻辑

1、描述

2、利用方式

3、修复

八、脆弱的随机数机制

1、描述

2、利用方式

3、修复

九、存在缺陷的激励机制

1、描述

2、利用方式

3、修复

十、日志记录和监控不足

1、描述

2、利用方式

3、修复


一、高级可持续威胁

1、描述

高级可持续威胁问题往往出现在区块链领域的中心化团队中,如:交易所、钱包、矿池等。主要是因为区块链团队在基础安全建设和安全运行上的欠缺,导致基础设施出现安全漏洞,被攻击者利用,实施数字货币的盗窃和破坏。

2、危害

该漏洞会导致区块链系统被入侵,权限被控制,最终导致资金被窃取,敏感数据泄露等问题。

3、修复

重视基础设施、办公安全、内部风险管理等安全方面的建设。游戏开发者应该持续分析数据,评估存在的风险,及时作出防护。

 

二、失控的币值膨胀

1、描述

比特币等虚拟货币吸引人的一个主要原因是限定了铸币总数,从而使这些币有价值。但是如果铸币的程序设计和实现有漏洞,就可能导致铸币总数失控,导致币值失控膨胀。

2、危害

该漏洞占整个区块链安全事件损失的29.55%。其中智能合约层案件最为突出。主要是由于币值控制代码出现了整数溢出的漏洞,导致出现无限铸币的可能性。

3、修复

对于整数溢出漏洞,应该使用安全的的算术函数做加减乘除处理。

https://ethereumdev.io/safemath-protect-overflows/

 

三、失效的权限控制

1、描述

主要是由于在设计或编码的过程中,导致本该限制使用范围的重要函数或权限没有控制好范围,被攻击者利用,从而实施攻击。如以太坊钱包Parity的库权限没有控制好,被越权调用初始化函数,重置了钱包的所有者。

2、利用方式

(1)开发者将初始化函数设置为public,让其他合约可以调用,但这也导致攻击者可以利用这个漏洞进行修改;

(2)编译器漏洞,因为如果在编写构造函数时不注意也会导致越权调用。如小于0.4.22版本中,合约构造函数必须和合约名字相同,而在之后的版本中,需要constructor关键字作为构造函数的声明,如果没按照要求,构造函数就会被编译成一个普通函数,被任意调用。

(3)Call是最常用的调用方式,调用后内置变量 msg 的值会修改为调用者,但执行环境为被调用者的运行环境。,如果合约中有函数以 msg.sender为关键变量的代码逻辑(如向msg.sender转账),那么就有可能导致越权操作,引发安全问题。

3、修复

(1)对初始化等重要函数不要设置为pubic权限,以致可以被外部调用。

(2)要注意构造函数编写方式,以免被编译成普通函数,可以被任意调用。

(3)注意call等的调用对msg的改变,以免导致绕过验证环节,被越权执行函数。

 

四、不安全的共识协议

1、描述

主要是由于存在共识协议在设计之初未考虑的漏洞,被攻击者识别和利用,从而损害链上参与者的利益。

在共识类案例中,以51%攻击最为常见。而不同类型的共识协议在面对51%攻击的抵抗力又有所差别,虽然POW和POS两种共识协议在规模较小时都容易被攻击,但是POW类共识协议比POS类更容易被攻击。

2、利用方式

利用51%攻击导致出现双花交易。

51%算力攻击中还有一个重要概念:网络重组(block reorganization)

网络重组:网络中六到八个块甚至更长的块都已经被矿工挖出来了,但是这些块突然全部被移除,产生了一些新的块去代替这些已经被确认过的块。

3、修复

51%的攻击会让交易所等参与交易的机构损失惨重。针对交易所,建议提升提款前的确认次数。对于小规模的数字货币,根据具体业务谨慎选择共识协议。

 

五、考虑不充分的程序逻辑

1、描述

主要由于软件设计和编码的错误原因,存在没有考虑到的异常分支,导致程序逻辑被攻击者利用,陷入设计者未预期的流程,造成损失。如The Dao事件。

2、利用方式

以The Dao事件为例。

ETH智能合约中发送以太币,常见的两种方式:一是调用send函数,比如:msg.sender.send(100);二是使用message call,msg.sender.call.value(100)。两个方式不同的是发送的gas数量。当调用send方法时,只会发送一部分gas,一般是2300gas,一旦gas耗尽就可能抛出异常。而使用message call的时候,则是发送全部的gas,执行完之后剩余的gas会退还给发起调用的合约。

fallback函数,智能合约中可以有唯一的一个未命名函数,称为fallback函数。该函数不能有实参,不能返回任何值。如果其他函数都不能匹配给定的函数标识符,则执行fallback函数。当合约接收到以太币但是不调用任何函数的时候,就会执行fallback函数。

存在漏洞的合约Bank和攻击合约Attack

OWASP 区块链安全 Top10_第1张图片

OWASP 区块链安全 Top10_第2张图片

 

 

攻击实施流程:

(1)假设Bank合约中有100wei,攻击者Attack合约中有10wei;

(2)Attack合约先调用deposit方法向Bank合约发送10wei;

(3)之后Attack合约调用withdraw方法,从而调用Bank的withdrawBalance;

(4)Bank的withdrawBalance方法发送给了Attack合约10wei;

(5)Attack收到10wei之后,又会触发调用fallback函数;

(6)这时,fallback函数又调用了两次Bank的withdrawBalance,从而转走了20wei;

(7)之后Bank合约才修改Attack合约的balance,将其置为0。

出问题的地方在4-7这几个步骤,开发者原本预期步骤4完成后就会到步骤7,没有预料到中间还有5-6的fallback处理这个流程,以至于攻击者可以构造编写fallback代码,让处理流程走入异常分支,实现递归调用,直到gas耗尽。

3、修复

注意代码中向fallback一类的隐形函数,避免出现逻辑异常错误。在编写智能合约进行以太币发送时,使用send或transfer,不要使用message call方式。

 

六、不严谨的业务策略

1、描述

该威胁主要是利用高额的以太费用和技术手段让以太坊堵塞,从而获得游戏中的大奖。这根据场景不一样,也会有不一样的业务问题。

2、利用方式

目前区块链游戏比较火,因为去中心化特性,确保了游戏公平,但如果业务策略设计存在漏洞,就会导致游戏奖励被特定的人利用漏洞来获得。

以FOMO3D游戏为例,游戏规则如下:

(1)规则1:最后一个购买KEY的人获得奖池中的大奖;

(2)规则2:每有人购买一个KEY,倒计时时间会增加30秒;

(3)规则3:游戏启动后从24小时开始倒计时。

曾经,大部分都认为这是一个不可能结束的游戏,因为一旦快到倒计时就会很多人去购买KEY。

最终这个游戏结束是因为有一个黑客在自己购买KEY后,使用高额的以太费用和技术手段让以太坊堵塞了3分钟,进而使得其他玩家无法打包购买KEY的交易,最终等到倒计时结束,获得了最后的大奖。

这就是业务策略没有考虑到以太坊网络是有可能被人为堵塞的后果。

3、修复

目前的几个公链性能都较差,使用很少的成本就能让交易网络堵塞,因此在设计业务策略时要考虑这个因素,攻击可以让交易出现阻塞和回滚。

 

七、校验不严格的交易逻辑

1、描述

交易校验不严格,攻击者伪造假的交易行为,但被校验方验证通过,误认为真的交易;或者提交了真交易,但是通过时间差、黑名单等,让交易发生回滚,实际交易并没有发生,而商家只验证是否有交易行为的话,就会发生损失。

2、利用方式

主要是假转账类问题和回滚类问题。主要是因为校验方的校验逻辑存在问题,从而被攻击者绕过,以假的充值行为却获得真实的数字货币入账;;或者通过时间差,黑名单等因素让之前的交易操作回滚,从而欺骗商户获得商品。

3、修复

(1)关键逻辑不仅要校验是否真实的转账消息,还需要校验转账的目标账户是否正确。

(2)不仅要确认支付是否成功提交,还需要等待一定时间,看支付是否回滚,再确认支付是否成功。

(3)游戏的奖励机制应该同下注机制紧密相关。一旦发现下注交易产生问题发生回滚,则奖励交易也应该一起回滚。

 

八、脆弱的随机数机制

1、描述

这里不仅仅指伪随机函数的问题,而是整个伪随机数生成机制不够安全,导致可以被攻击者提前获取或猜测到随机数的结果,以实施攻击。

2、利用方式

随机数威胁一般出现在智能合约类游戏中,随机数保证了游戏的公平

随机数seed由timestamp、difficulty、coinbase、gaslimit、msg、sender、number构成。因此,只要知道这几个数据,我们就可以预测出是否可以获得空投奖励。其中msg.sender是可以由用户或攻击者控制,因此攻击者可以不断尝试构造出满足空投奖励条件的msg.sender以获得比正常用户高很多的空投奖励。

3、修复

1) 一般来说随机数的构成元素不应该可以被用户控制;

2) 不应该在开奖前让用户可以预测到开奖结果。

 

九、存在缺陷的激励机制

1、描述

激励机制是区块链的重要环节,但若开发者设计的激励机制存在可以被利用的漏洞,就可能会给开发者或用户带来损失。

2、利用方式

攻击方利用了矿池激励机制的漏洞,参与分红,但是不做贡献,挖到了矿就自己藏起来,给一起挖矿的矿工和矿池都带来了损害。

3、修复

在设计激励机制时千万不要假设所有的参与者都是诚实的,一定要防范恶意者的攻击,以保护大家的利益。

 

十、日志记录和监控不足

1、描述

日志记录和监控的问题对区块链团队和公司来说非常很重要。如果没有足够的日志记录和监控,被攻击的过程中,你会不知道。当发生安全事件后,你没有办法调查,也没有办法改进以避免再犯同样的错误。所以日志记录和监控不足的问题也很严重。

2、利用方式

缺少日志和监控会让黑客攻击变得更肆无忌惮,因为你无法发现攻击行为,无法知道是哪里存在安全漏洞,也就没有办法找到修复的方案,整体的安全风险处于失控的状态。

3、修复

要确保所有登录、访问控制失败、输入验证失败都能够被记录到日志中去,并保留足够的用户上下文信息,以识别可疑或恶意帐户,并为后期取证预留足够时间;

确保高额交易有完整性控制的审计信息,以防止篡改或删除,例如审计信息保存在只能进行记录增加的数据库表中;

建立有效的监控和告警机制,使可疑活动在可接受的时间内被发现和应对,或采取一个应急响应机制和恢复计划。

你可能感兴趣的:(区块链)