区块链攻击对象分析——共识层和合约层

共识层

短距离攻击

主要影响POS机制。攻击示例如下:

  • 攻击者购买某个商品或服务
  • 商户开始等待网络确认这笔交易
  • 此时,攻击者开始在网络中首次宣称,对目前相对最长的不包含这次交易的主链进行奖励
  • 当主链足够长时,攻击者开始放出更大的奖励,奖励那些包含此次交易链条中挖矿的矿工
  • 六次确认达成后,放弃奖励
  • 货物到手,同时放弃攻击者选中的链条
  • 只要此次贿赂攻击的成本小于货物或者服务费用,攻击成功
  • 相比之下,POW机制中贿赂机制就需要贿赂大多数矿工,成本极高

长距离攻击

攻击依赖于POS中缺乏对算力的约束,此类攻击比较典型的是51%攻击,POW中达到51%的算力比较困难

币龄累积攻击

在最早的Peercoin中,挖矿难度不仅与当前账户余额有关,也与个人持币时间挂钩,部分节点在等待足够长的时间后,有能力利用持币时间的增加来控制整个网络。

预计算攻击

针对POS机制。当POS中某一节点占有了一定量的算力后,就有能力控制Hprev来使自己所在算力范围内有能力计算Hnext

女巫攻击

对等网络基础

  • 对等网络上的实体是能够访问本地资源的一块软件,实体通过身份在网络上通告自身
  • 对等网络中身份到实体的映射是多对一的,为了冗余、资源共享、可靠性和完整性。
  • 许多身份可以对应于相同的本地实体

攻击案例

攻击者通过创建大量的假名标识来破坏对等网络的信誉系统,使用它们获得不成比例的大的影响。如向对等网络呈现多个身份,以便出现并充当多个不同的节点,由此获得对网络不成比例的控制水平,例如影响投票结果

合约层

合约虚拟机

合约虚拟机运行在区块链的各个节点上,接收并部署来自节点的智能合约代码,若虚拟机存在漏洞或者相关的机制不完善,和可能遭受恶意攻击

逃逸漏洞

虚拟机在运行字节码时会提供一个沙盒环境,此类型漏洞会使攻击者退出沙盒环境,执行本不能执行的代码

逻辑漏洞

虚拟机在发现数据或代码不符合规范时,可能会对数据做一些“容错处理”,可能导致出现逻辑问题,如“以太坊短地址攻击”

堆栈溢出漏洞

攻击者可以通过编写恶意代码让虚拟机解释执行,最终导致栈的深度超过虚拟机允许的最大深度,或不断占用系统内存导致内存溢出。此种攻击可引发多种威胁,最严重的是造成命令执行漏洞

资源滥用漏洞

攻击者可以通过在虚拟机上部署恶意代码来消耗系统的网络、存储、计算和内存资源。虚拟机中必须要有防止资源滥用的机制,如以太坊中的’gas’

智能合约

智能合约本质上是一份代码程序,在智能合约应用前,做到以下几点

  • 拥有100%测试覆盖率的完整测试套件
  • 在自己的测试网上部署
  • 在公告测试网上部署大量测试和错误奖励
  • 允许各种玩家与合约进行大规模互动
  • 在主网上部署测试版以限制风险总额

可重入攻击

当智能合约A调用智能合约B时,智能合约B可以在被调用的函数中写入“使A调用B的代码”(回调),造成可重入攻击:

  • 智能合约A向B发起提现请求
  • B向A转账,并使用A的回调函数
  • A的回调函数操作为“A向B发起提现请求”
  • 循环以上步骤直到不满足循环条件
  • 提现结束

调用深度攻击

合约虚拟机中,会对智能合约的互相调用的深度设定阀值,超过这个深度会调用失败。攻击者可以通过控制调用深度,来使某些操作无法进行,如转账、余额清零等

交易顺序依赖攻击

智能合约的执行会随着当前交易的处理顺序不同而产生不同的结果。

  • 攻击者发布一个解题合约,在合约中给出丰厚的奖励
  • 等有人提交正确答案后,攻击者提交一个将奖励额度调低的交易,并将交易费(如gas)值设高
  • 验证节点会先执行这笔交易,最终导致答题者奖励降低,攻击者以一个较低的成本买到了正确答案

时间戳依赖攻击

如果智能合约在敏感操作中依赖时间戳,可能会导致执行结果被预测。如:发布一个抽奖合约,抽奖结果由当前区块的时间戳和其他因素组合而来。攻击者可以通过修改时间戳来计算结果

误操作异常攻击

当合约A调用合约B的操作的时候,B的执行可能会失败,退回到未执行前的状态。若A不检查B执行的结果继续往下执行,会导致误操作异常攻击。如:A调用B提现操作,A的余额增加,B的余额减少。如果没有检查B的返回值,可能会导致B的余额没有减少,A的余额却增加了

整数溢出攻击

合约中的整数会有受编程语言限制的最大最小值,在计算、转换等过程中可能会发生整数的上溢或下溢。典型案例:ERC20智能合约漏洞