交易重放

Posted by Thomas_Xu on 2022-12-11

author:Thomas_Xu

重放攻击及解决方案

传统重放攻击:

攻击者将拦截到的数据再次原封不动发送给接收方的情况。只要攻击者知晓自己所拦截信息的用途,哪怕信息经过加密,其仍然可以发起重放攻击达到恶意目的,例如窃取存款、窃取账号等

区块链重放攻击

在区块链中的重放攻击和传统安全行业里的重放攻击,不是一回事。它一般指的是主链分叉时候出现的一种特殊情况。

分叉是区块链中常见的状况,不论是网络升级发起的主动分叉,还是恶意攻击者发起的被动分叉,分叉发生后在一段时间内区块链网络都是出于“原链+新链”的双链状态。正常来说,以升级为目的分叉发生后,随着旧客户端的升级,算力回归新链,原链会被逐渐废弃;以攻击为目的发起的分叉,如果全网算力能及时切换到正确的分叉链上,那么恶意区块会无法得到确认,最终无法跟上最长链节奏被废弃。但有一些分叉最终保留了一条以上的区块链,最典型的为The DAO事件后以太坊分叉出ETH和ETC,算力大战后比特币分叉为BTC和BCH,BCH分叉处BCH与BSV这三件分叉大事,对重放攻击讨论最热烈的时间点也集中在上述三大分叉前后。

由于分叉后的两条区块链,分叉前共用同一规格的地址、密钥对与交易结构等,为了保证分叉后能继承原链的算力与资产,一般都会支持原链的钱包与地址,但为了与竞争链做出区别,分叉后两者的交易结构和原生代币都会发生变化。

通俗的讲就是常见的”发糖果“——以太坊The DAO分叉后,分叉前钱包中有以太坊的账户都获得了同等数量的ETH和ETC。如果分叉后的两条链都支持分叉前的代币和账户(例如ETC和ETH分叉后代码差异仅仅只有涉及The DAO的部分其他代码完全相同),而他们又都有同样的区块账本,那么本质上,分叉前拥有以太坊的账户发起的交易,广播到分叉后的两条区块链上都是完全合法的,这就导致了重放攻击问题。

重放攻击剖析

我们设分叉前用户A的地址上有10个以太坊,用户B的地址上有20个以太坊,分叉后用户A的地址上有10个ETH和ETC,用户B则有20个ETH和ETC。如果用户A在分叉后向用户B发起10ETH的交易,之后用户B再向用户A发起15ETH的交易,那么这两笔交易将会原封不动地呈现在ETC区块链上,表现为A向B发送10ETC,B向A发送15ETC,看起来似乎是没有问题的。

然而如果ETC区块链上的用户A没有ETC,那么上述交易将会让用户B在没有收到A发送的ETC的情况下向A发送15ETC,白白损失了自己的资金。这就是区块链上的重放攻击,而这常常发生在交易所中。恶意用户可以通过监听用户A和用户B的交易情况来猜测二者身份,如果两位用户均没有防范重放攻击的意识或者分叉链本身不具备防重放攻击能力,恶意用户就可以通过映射交易窃取通常用户的账户资金。

合约的交易重放

除了对分叉链条发起的重放攻击外,对智能合约也可发起重放攻击,其形式更类似传统的重放攻击定义——恶意者窃听了某一智能合约的交易请求,不断向该智能合约发送窃听到的交易信息(哪怕不知道交易情况也不重要),直到智能合约中预存的用于执行的Gas被消耗殆尽,智能合约被迫暂停。

防止重放攻击

首先最常用的方式便是完善交易格式,让分叉点之前即存在的资金所关联的交易只能在一条链上生效,这就要让分叉后的链条在交易结构上做出区别。

对于以升级为目的的分叉而言很容易就能达到,因为硬分叉升级将采用不同的客户端版本,交易的前缀中通常包含有发起交易客户端的版本信息。分叉后矿工为了避免打包旧客户端的“非法交易”(并非恶意交易,仅仅只是版本号过低不被其他节点所承认),通常会拒绝一定版本号以前的交易,保证恶意攻击者很难在硬分叉升级时通过重放攻击窃取资金。

对于非升级目的发起的分叉,不论是算力战争导致的项目分裂,还是恶意攻击者发起的分叉攻击,由于交易发起版本大概率是不会变化的,分叉后的链条无法通过版本验证来防止重放攻击,需要在其他方向做出努力。常见的方式之一是为每一个交易附加上随机数Nonce,尽管Nonce一般被认为是用于防止重复交易与双花交易的,但防止重放攻击方面,Nonce也功不可没。

重放攻击需要监听一条链上的交易情况并转发至另一分叉链上以窃取资金,交易随机数的使用可以在一定程度上避免分叉情况下的重放攻击。如果在一条分叉链上发起的交易,其使用的随机数已被另一条分叉链中的相同用户发起的交易所使用,那么节点将不会广播该交易,矿工也不会打包此可疑交易。对于普通用户而言只需要重新设立随机数并用私钥签名即可恢复交易。Nonce最重要的用途在于防止事务/智能合约被重放攻击。只需要在事务中设立一段验证随机数的代码,即可保证事务不被窃听者通过重放攻击耗尽Gas。


notice

true

This is copyright.

...

...

00:00
00:00