本地模拟复现51%攻击,实现双花交易


最近由BCH革新派所领导的BitcoinABC和BCH守旧派所领导的BitcoinSV在币圈链圈掀起了一场”腥风血雨“,两派由于理念不同而导致了一场空前的算力之战。
然而很多人并不是很理解算力战的攻击性,本文便是介绍如何本地模拟一次"51%算力攻击"。

0x1 明确概念

最常见的一种算力攻击方式是”51%算力攻击”,顾名思义,就是在控制的算力超过整个网络的50%的时候才能大概率完成的一种攻击。

在发动51%算力攻击时,攻击者需要从主链的某一区块开始分出来一条私链,在私链的区块高度超过主链时将私链与主链合并,由于共识机制会选择最长且难度最高的链作为主链,所以攻击者可以用自己的私链覆盖主链,以完成某种目的。

这里需要明确的一点是:攻击者从主链中分出一条私链不等于分叉。

很多人将两者的概念混淆了,他们最大的区别是:前者的两条链是共识相同的两条链,是可以互相合并的,而分叉的两条链是共识不相同的两条链,不可以相互合并。


0x2 攻击场景以及大致流程

51%攻击复现需要自己搭建一条私链,这里采用ETH来搭建,不会搭建的可以看上一篇文章《初探以太坊私链搭建》

场景:攻击者对某交易所利用51%攻击发起双花交易

双花交易:即双重支付,指的是在数字货币系统中,由于数据的可复制性,使得系统可能存在同一笔数字资产因不当操作被重复使用的情况。

大致流程:

  1. 本地模拟一个主网环境,由这几个节点组成,节点 A(单核CPU)、节点 B(双核CPU) 为诚实矿工,节点C(四核CPU) 是受攻击者控制的高算力恶意矿工。
  2. 节点A、节点B、节点C相连,形成一个主网。
  3. 攻击者控制节点C,脱离主网,形成一个私网(私网算力比主网算力高)。
  4. 攻击者在主网上发起向交易所充值100 ETH的交易
  5. 攻击者在私网上发起向自己转账100 ETH的交易
  6. 交易所在主网上查询余额确认是否收款成功,并给攻击者标记充值余额
  7. 攻击者在交易所低价抛售100 ETH套现
  8. 攻击者抛售完ETH后将其所控制的恶意矿工并入主网,向交易所充值的交易被攻击者向自己转账的交易覆盖
  9. 攻击者重新获得之前所充值的100 ETH
  10. 攻击者完成双花交易
  11. 攻击者钱包余额为100ETH和大量套现现金,交易所损失100ETH


0x3 环境模拟

首先建立三个节点模拟主网环境

节点相连: 节点C(四核CPU)  —> 节点B(双核CPU) —> 节点A(单核CPU) 形成主网,节点C的算力大于节点A、节点B的总和,掌控整个网络50%以上的算力。

节点B中生成两个账号,账号1为矿工账户,账户2为模拟交易所账户

B节点上的两个账号余额都为0

我们通过在节点B和节点C中挖矿然后转到模拟账户

节点B的B2账户已经有了450个ETH,此为模拟的交易所账户

节点C的C2账户已经有了100个ETH,此为模拟的攻击者账户


0x4 攻击模拟

攻击者在主网上发起向交易所充值100 ETH的交易

交易所地址:B节点的B2账户,余额450ETH

“0x1f516e2f519a6f31653486ab16450cff2ea836ce”

攻击者地址:C节点的C2账户,余额100ETH

“0xbcfa293865c39b95711429c6a9b6b182c5b22466”

攻击者生成一个攻击者向交易所转账100ETH的交易签名

攻击者脱离主网,形成自己的私网(可以删除所有节点也可以拔网线断网,不与主网相连即可)

然后在主网上广播交易

攻击者在私网中生成一个攻击者向自己钱包转账100ETH的交易签名

然后在自己的私网上进行广播

由于主网上是有矿工在挖矿的,所以我们刚刚在主网上广播的交易,会很快被确认。

交易所查询自己钱包余额是否增加了100个ETH

可以看到,交易所的钱包里面已经增加了100个eth,而攻击者的账号减少了100个ETH

,所以攻击者的这笔交易是有效被承认的。

交易所在其交易平台网站上标记充值成功

攻击者在交易所上面抛售刚刚所充值的100个ETH假如当前价格为1000 人民币一枚攻击者抛售100个ETH后获得10万人民币。

抛售完毕后攻击者便可以将自己的控制的大算力恶意节点并入主网了

此时攻击者的私网的区块高度已经达到了661块

而主网的区块高度才635块

攻击者并入主网

由于区块链共识机制:谁的链长且难度高就承认谁是有效的,并同步最长的链。可以看到,当攻击者控制的高算力节点并入主网后,主网上的节点都自动同步了攻击者的恶意节点的区块高度

同时,攻击者向交易所转账的交易也被攻击者向自己转账的交易给覆盖了。

此时在主网上查询攻击者的钱包余额和交易所的钱包余额会发现攻击者的ETH没有减少且交易所的ETH也没有增加,一切都和原来一样。但是黑客在交易所上确确实实抛售了100个ETH,成功套现了10万人民币,而黑客的ETH却没有减少,也就是说黑客的ETH被他花了两次,形成了双花攻击。

在这次模拟攻击事件中,被黑客的攻击的交易所,损失了100ETH,而黑客在交易所中套现了自己所充值的100ETH获得10万人民币,并且自己的钱包的ETH余额没有减少。


转载自:DVP去中心化漏洞平台公众号

原文地址:https://mp.weixin.qq.com/s/sTZ-W5ICaFVd0NqMW1hCsQ

1 thought on “本地模拟复现51%攻击,实现双花交易”

发表评论

电子邮件地址不会被公开。 必填项已用*标注