当前位置: 首页 > 科技 > 区块链 > 什么是区块链上的重放攻击?_腾讯新闻

什么是区块链上的重放攻击?_腾讯新闻

天乐
2020-07-23 17:25:10 第一视角

重放攻击(Replay Attack)并非区块链技术所特有,其最初指在互联网中,攻击者将拦截到的数据再次原封不动发送给接收方的情况。只要攻击者知晓自己所拦截信息的用途,哪怕信息经过加密,其仍然可以发起重放攻击达到恶意目的,例如窃取存款、窃取账号等。而在区块链中,由于时间戳的存在,重放攻击的定义不同于传统互联网,其表现形式也有相应差异。

区块链中的重放攻击

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

由于分叉后的两条区块链,分叉前共用同一规格的地址、密钥对与交易结构等,为了保证分叉后能继承原链的算力与资产,一般都会支持原链的钱包与地址,但为了与竞争链做出区别,分叉后两者的交易结构和原生代币都会发生变化。通俗的讲就是常见的”发糖果“——以太坊The DAO分叉后,分叉前钱包中有以太坊的账户都获得了同等数量的ETH和ETC。如果分叉后的两条链都支持分叉前的代币和账户(例如ETC和ETH分叉后代码差异仅仅只有涉及The DAO的部分,其他代码完全相同),而他们又都有同样的区块账本,那么本质上,分叉前拥有以太坊的账户发起的交易,广播到分叉后的两条区块链上都是完全合法的,这就导致了重放攻击问题。

除了The DAO分叉外,以太坊还有许多分叉升级,对重放攻击的讨论主要集中在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。

以太坊智能合约中防止重放攻击的代码片段,要求调用合约的交易所采用的随机数必须包含一个独特的随机数。

另一方面,用户也可通过“污染”的手段来避免自己资产于分叉时遭受重放攻击,这需要用户在分叉后及时向自己的原账户(实际上是两个账户,分别对应分叉后的两个不同链)转入分叉后的代币资产。我们以比特币分叉为BTC和BCH为例,在分叉发生后,通过交易所或其他途径分别购入最低数量的BTC和BCH,并发送到分叉后的钱包中。对于BTC钱包和节点而言,你的账户中包含了分叉后的代币,而包含BTC的交易不会被BCH节点所打包,对于BCH节点而言你的账户中存在了一笔不被承认的“非法交易”,这也就保证了发送BTC交易时不会被恶意者在BCH链上发起重放攻击。

重放攻击经过The DAO事件和BCH硬分叉事件后已经被广大开发者所了解到,目前主流的区块链项目都包含了对重放攻击的防御手段。但防范重放攻击的意识仍需要留存于脑海中,对于开发者而言,防范重放攻击仍然是需要考虑的一点,毕竟会有让事务无法正常运行的风险;对于用户而言,防范重放攻击可以避免自己的合法资产被窃取。

提示:支持键盘“← →”键翻页
为你推荐
加载更多
意见反馈
返回顶部