OWASP 区块链安全 Top10
分析、整理2011年至2019年之间160个典型的区块链安全事件。
目录
一、高级可持续威胁
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
攻击实施流程:
(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、修复
要确保所有登录、访问控制失败、输入验证失败都能够被记录到日志中去,并保留足够的用户上下文信息,以识别可疑或恶意帐户,并为后期取证预留足够时间;
确保高额交易有完整性控制的审计信息,以防止篡改或删除,例如审计信息保存在只能进行记录增加的数据库表中;
建立有效的监控和告警机制,使可疑活动在可接受的时间内被发现和应对,或采取一个应急响应机制和恢复计划。