每天进步一点点:了解了一下重播攻击(Replay Attacks)

在以前的文章中,或者别人的文章中,我没少看到重播攻击(Replay Attacks)这个词语,但是讲真,具体什么是重播攻击,以及如何防范重播攻击,我是一头雾水的。最近的学习过程中,又接触到重播攻击,于是沉下心来,仔细研究了一番。

image.png
(图源 :pixabay)

首先说普通的重放攻击,百度百科上这样介绍:

重放攻击(Replay Attacks)又称重播攻击、回放攻击,是指攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程,破坏认证的正确性。

以前爆过不少类似电商网站充值漏洞,可以无限制地给账户充值等等,攻击者大概就是利用网站存在重放攻击漏洞。一般防范的手段有加随机数、加时间戳、加流水号等方式或者这些方式的组合。(详见文末百度百科链接

而放到区块链上,情况变得更加有意思,我把我了解的几种情况分别说明一下。

普通重播攻击

以HIVE为例,假设用户A转给用户B 1000个HIVE,那么这个操作被执行以后,整个transaction是可以在链上被获取的。

比如我用我的两个账户进行一下测试,那么第三者就可以获得我的交易:

Reveal spoiler

image.png

发现什么了吗?第三者可以获取我整个交易的数据,以及一个完全合法的签名。那么如果第三者用这个签名后的交易去再次广播,是不是可以再执行一遍这个交易呢?

如果区块链不进行相应的防范,那么这个重复的交易就可以被执行成功。你可以觉得这么没什么,但是如果是从交易所提现呢?不断重复执行对应的交易,是不是交易所就持续不断地给我转钱了?

好在,区块链代码中都会有对应的检查,不会允许这样的情况发生,比如我在交易过期前,重新广播上述交易,那么会得到如下提示:

('Assert Exception:(skip & skip_transaction_dupe_check) || '
'trx_idx.indices().get<by_trx_id>().find(trx_id) == '
'trx_idx.indices().get<by_trx_id>().end(): Duplicate transaction check failed')

它对应代码中的这个部分:

Reveal spoiler

image.png

也就是说,在交易过期之前,是不允许重复的txid存在的,这就避免了恶意攻击者把交易重新广播,避免了用户资产被盗窃或者区块链被破坏。

分叉链重播攻击

在上一小结中,以HIVE为例,我们得出了,在交易过期之前,是不允许重复的txid存在的这个结论,也就是说同一交易,是无法再次被执行的。

那么我们来看另外一种情况,假设某区块链分叉成A链、B链,这两个链什么都一样。那么我们再A链上的操作,再拿到B链上去操作一下,会是什么效果呢?

举例说,我从交易所提现A链的币,然后获取交易所的转账交易,再去B链上广播一下,那么我是不是也会拿到相应的B链上的代币?

别笑,这不是天方夜谭哦。据说ETH和ETC硬分叉时,有人就用类似的方法,从交易所不断充值&提现ETH,然后把提现交易去ETC链广播,然后从交易所盗取了无数的ETC代币。

在搜索资料时,竟然搜索到@blocktrades大佬早期的帖子:

Reveal spoiler

image.png

扯远了,说到分叉链攻击,朋友可能会问;HIVE和STEEM分叉时,是否也存在重播攻击(Replay Attacks)的可能性呢?比如说从交易所提现HIVE,然后盗取一堆STEEM?

答案是几乎不可以,因为石墨烯区块链有个很重要的机制,叫做:TaPos(Transaction as Proof of Stake)

简单来讲,每个交易都有两个字段:ref_block_num以及ref_block_prefix,交易通过这两项内容指向之前已经存在的一个块与hash来防止重播攻击等。

也就是说,如果把一个在HIVE链上的交易来STEEM链上广播,那么会无法找到相对应的ref_block_num以及ref_block_prefix,也就无法广播成功了,会得到类似如下错误:

'message': 'transaction tapos exception'

而TaPos最长可以设置大概54小时之前的参考块,所以大概2.28天后,这样的攻击就变得完全不可能了。而实际上,大家都用最近不可逆块来设置TaPos信息,所以大概分叉后20个左右块后,这样的攻击就不可能实现了。

至于20个块以内呢,交易所晚几分钟开放提现功能,就可以避免这个风险了😀

两年以前,在Quick update on Hive-related activities at BlockTrades这个帖子下边,有人问这个问题,@blocktrades 给与了答复:

Reveal spoiler

image.png

另外,HARDFORK 24,HIVE区块链更新chain_id到如下形式:

0xBEEAB0DE + 56 zeros

因为交易签名时是对chain_id+交易HASH进行签名,所以相同的交易,甚至相同的TaPos信息设置,在HIVE和STEEM上的签名信息都将会不同。所以,分叉链重播就更不可能啦(原本也不可能)。

签名重播攻击

通过对上述两种重播攻击的学习,大家可能对重播攻击有了一定的了解。但是你知道吗?恶意攻击者还可能从你的签名信息下手来重播交易。

不过这里留个悬念,我们之后的文章中再来详细介绍这个,之所以不在这篇文章中介绍这个,实在是因为写这篇文章已经耗费我太多时间和精力啦,写不动啦,先休息一下。

image.png
(图源 :pixabay)

有关签名重播攻击,敬请期待哦。

相关链接

Sort:  

Your content has been voted as a part of Encouragement program. Keep up the good work!

Use Ecency daily to boost your growth on platform!

Support Ecency
Vote for new Proposal
Delegate HP and earn more

学习了,谢谢O哥的分享👍👍

学习了,在巨大利益面前,黑客真是无孔不入啊

辛苦啦!☕️☕️☕️

感觉好厉害👍👍👍

多谢O哥给我们小白普及区块链知识。这次理解了几个词汇🙂

你欠我的10 HBD該還了吧!?

你欠我的10 HBD該還了吧!?

你欠我的10 HBD該還了吧!?

真好👍,谢谢O哥分享,每天进步一点点😄