如何模拟51%攻击复现
zmhg799417
发表于 2022-12-6 19:16:15
158
0
0
最常见的一种算力攻击方式是"51%算力攻击",顾名思义,就是在控制的算力超过整个网络的50%的时候才能大概率完成的一种攻击。
在发动51%算力攻击时,攻击者需要从主链的某一区块开始分出来一条私链,在私链的区块高度超过主链时将私链与主链合并,由于共识机制会选择最长且难度最高的链作为主链,所以攻击者可以用自己的私链覆盖主链,以完成某种目的。
这里需要明确的一点是:攻击者从主链中分出一条私链不等于分叉。
很多人将两者的概念混淆了,他们最大的区别是:前者的两条链是共识相同的两条链,是可以互相合并的,而分叉的两条链是共识不相同的两条链,不可以相互合并。% i4 ]9 i0 O6 B9 u) p
51%攻击复现需要一条ETH私链,不会搭建的可以看上一篇ETH私链搭建的文章。9 ^/ b9 M$ v+ \' X& I$ y1 _
场景:攻击者对某交易所利用51攻击发起双花交易。
二、攻击场景和大致流程:
1.本地模拟一个主网环境,由一下节点组成1 K/ a; V9 z- }. H: X" o [
节点 A、节点 B 为诚实矿工,节点C 是受攻击者控制的高算力恶意矿工。" R, k0 v$ I2 s/ ~6 X" \
2.节点A、节点B、节点C相连,形成一个主网。
3.攻击者在主网上发起向交易所充值100 ETH的交易& f& d# M$ _! C. Z; [& w& }
4.攻击者控制节点C,脱离主网,形成一个私网(私网算力比主网算力高)。; l% T1 r. z! O& l- d
5.攻击者在私网上发起向自己转账100 ETH的交易" \# ~2 y# i6 ~% l( B p
6.交易所在主网上查询余额确认是否收款成功,并给攻击者标记充值余额- I' S5 T9 y9 i/ u1 B4 k7 Q
7.攻击者在交易所低价抛售100 ETH套现1 n$ P; p& c% D9 k; y
8.攻击者抛售完ETH后将其所控制的恶意矿工并入主网,向交易所充值的交易被攻击者向自己转账的交易覆盖0 u. F4 y8 _' L |
9.攻击者重新获得之前所充值的100 ETH
10.攻击者完成双花交易
11.攻击者钱包余额为100ETH和大量套现现金,交易所损失100ETH/ S, ~6 d) k$ V! q- E8 o9 S- [. d
三、环境模拟: J# i& b1 l- j
首先建立三个节点模拟主网环境
节点相连: 节点C(四核CPU) —> 节点B(双核CPU) —> 节点A(单核CPU) 形成主网,节点C的算力大于节点A、节点B的总和,掌控整个网络50%以上的算力。# q! r- f5 c( |
; i6 ?# k' X# e: V& x4 `6 [
节点B中生成两个账号,账号1为矿工账户,账户2为模拟交易所账户) [( [( _, O% F. K' n& o# Q
. y3 a4 I3 {) n( c3 L% I
B节点上的两个账号余额都为0
我们通过在节点B和节点C中挖矿然后转到模拟账户5 E4 G" |- y) }
节点B的B2账户已经有了450个ETH,此为模拟的交易所账户6 d; A% F+ _: r" F! [! f" N- b
0 [8 r% j) H/ {( J
节点C的C2账户已经有了100个ETH,此为模拟的攻击者账户9 w ?1 ?, ~# w! T7 N1 S4 x3 D6 k
四、攻击模拟
攻击者在主网上发起向交易所充值100 ETH的交易
交易所地址:B节点的B2账户,余额450ETH- \9 Y, a, I2 e3 H/ R6 T8 X% \/ {
“0x1f516e2f519a6f31653486ab16450cff2ea836ce”
攻击者地址:C节点的C2账户,余额100ETH) t$ D! l# X; l/ M2 a
“0xbcfa293865c39b95711429c6a9b6b182c5b22466”
攻击者生成一个攻击者向交易所转账100ETH的交易签名
; {2 e; y& J8 w
攻击者脱离主网,形成自己的私网(可以删除所有节点也可以拔网线断网,不与主网相连即可)
然后在主网上广播交易5 @, a5 U& }; F. z$ L
攻击者在私网中生成一个攻击者向自己钱包转账100ETH的交易签名 H3 w/ p" v1 |( [4 k9 H9 w0 E: d
然后在自己的私网上进行广播0 ]0 D- s% o# ^
0 X2 C! t# m7 I" G- Y9 s- u
由于主网上是有矿工在挖矿的,所以我们刚刚在主网上广播的交易,会很快被确认。
交易所查询自己钱包余额是否增加了100个ETH7 [, D/ I& k) Z
可以看到,交易所的钱包里面已经增加了100个eth,而攻击者的账号减少了100个ETH
,所以攻击者的这笔交易是有效被承认的。0 j; \2 t' G' r: Y0 f( O+ R% Y
交易所在其交易平台网站上标记充值成功
8 {1 Q; u2 j0 t0 H
攻击者在交易所上面抛售刚刚所充值的100个ETH假如当前价格为1000 人民币一枚攻击者抛售100个ETH后获得10万人民币。8 o. J; x- I6 }8 c% g
抛售完毕后攻击者便可以将自己的控制的大算力恶意节点并入主网了7 f" m6 T' K# o) H- q9 e
此时攻击者的私网的区块高度已经达到了661块; ]9 M4 u! a( _2 k
而主网的区块高度才635块
0 m" Y' O* Y- \1 u
攻击者并入主网, k5 u7 X* [" V, j2 f8 X
由于区块链共识机制:谁的链长且难度高就承认谁是有效的,并同步最长的链。可以看到,当攻击者控制的高算力节点并入主网后,主网上的节点都自动同步了攻击者的恶意节点的区块高度
同时,攻击者向交易所转账的交易也被攻击者向自己转账的交易给覆盖了。
4 K7 k& J' |" _$ ]- N
此时在主网上查询攻击者的钱包余额和交易所的钱包余额会发现攻击者的ETH没有减少且交易所的ETH也没有增加,一切都和原来一样。但是黑客在交易所上确确实实抛售了100个ETH,成功套现了10万人民币,而黑客的ETH却没有减少,也就是说黑客的ETH被他花了两次,形成了双花攻击。
在这次模拟攻击事件中,被黑客的攻击的交易所,损失了100ETH,而黑客在交易所中套现了自己所充值的100ETH获得10万人民币,并且自己的钱包的ETH余额没有减少。
成为第一个吐槽的人



