区块链的重放攻击
摘要:
这是一个在区块链,尤其是在硬分叉场景下非常常见且危险的安全问题,什么是重放攻击?重放攻击的核心思想是:攻击者截获一个在一条链上有效的交易,然后将其“重放”(重新广播)到另一条链上,... 这是一个在区块链,尤其是在硬分叉场景下非常常见且危险的安全问题。
什么是重放攻击?
重放攻击的核心思想是:攻击者截获一个在一条链上有效的交易,然后将其“重放”(重新广播)到另一条链上,并期望这条交易在另一条链上同样有效,从而获利或造成破坏。
就像一个人在商店A用一张有效的购物卡买了东西,然后他跑到商店B,把同一张卡再刷一次,希望商店B的系统也能认这张卡,从而免费再拿一份商品。
在区块链的语境下,“购物卡”就是一笔包含签名和数据的交易,“商店A和商店B”就是分叉前后的两条链。
为什么会发生重放攻击?—— 根源在于签名
要理解重放攻击,首先要明白区块链交易是如何被验证的。
一笔交易要被网络接受,必须满足两个基本条件:
- 交易数据有效:发送方有足够的余额、格式正确等。
- 签名有效:发送方用其私钥对交易数据进行了签名,网络可以用其对应的公钥验证这个签名,证明交易确实是由该地址发起的。
重放攻击的根源在于:交易签名本身并不包含链的上下文信息。
一笔交易的签名,本质上是对 交易数据 的签名,而不是对 在链X上执行 这个指令的签名,一笔在链A上签名有效的交易,其签名在链B上依然是有效的(只要链B的验证逻辑认为交易数据本身是合法的)。
当发生硬分叉时,新旧两条链的共识规则(尤其是交易验证规则)可能不完全相同,这就为攻击者创造了机会。
重放攻击的经典场景:硬分叉
硬分叉是重放攻击最典型的发生场景,我们以太坊的经典案例来详细说明。
案例背景:以太坊 The DAO 事件与硬分叉
- 分叉前(原链):2025年,以太坊主链上有一个名为“The DAO”的智能合约遭受了黑客攻击,大量以太币被转移。
- 社区分歧:社区对于如何处理这笔被盗的以太币产生了严重分歧,一部分人认为应该通过硬分叉来回滚交易,将资金返还给原所有者;另一部分人则坚持“代码即法律”,认为不应该干预,应该让原链继续运行。
- 分叉发生:
- 以太坊:大部分开发者、矿工和用户支持硬分叉,形成了一条新的链,继续发展,这条链保留了“The DAO”事件后的状态,并将被盗资金转移到一个指定地址。
- 以太坊经典:另一部分人坚持不干预,保留了原始的链,包括“The DAO”的漏洞和被盗的资金,这条链被称为“以太坊经典”(Ethereum Classic, ETC)。
就有了两条链:ETH链 和 ETC链,它们共享分叉前的所有历史状态,包括账户余额和交易签名。
重放攻击如何发生?
假设一个用户在分叉前拥有 10 个 ETH(同时也是 10 个 ETC)。
攻击者的操作:
- 截获交易:攻击者(可以是节点、矿工,或网络中间人)监控到这位用户在 ETH 链上发起了一笔交易,
发送 1 ETH 给地址B。 - 重放到 ETC 链:攻击者截获这笔完整的交易数据(包括发送地址、接收地址、金额、签名等),然后将其广播到 ETC 链上。
- 交易在 ETC 链上生效:
- 验证签名:ETC 链的节点验证了这笔交易的签名,发现它是有效的(因为签名是用户在分叉前用私钥签的,与公钥匹配)。
- 验证余额:ETC 链检查该用户的余额,发现他有 10 ETC,足够支付 1 ETC。
- 执行交易:ETC 链的节点执行了这笔交易,用户的 ETC 余额从 10 变成了 9,地址B收到了 1 ETC。
攻击结果:
- 用户视角:用户只在 ETH 链上发起了一笔交易,以为只花了 1 个 ETH,但他不知道,他的 ETC 也被动地被转走了 1 个。
- 攻击者视角:攻击者通过简单地“复制粘贴”一笔交易,在用户不知情的情况下,免费获得了 1 个 ETC。
更极端的情况:如果用户在 ETH 铿锵上将全部 10 ETH 发送给一个交易所或另一个钱包,攻击者可以立即重放这笔交易,将用户在 ETC 链上的全部 10 ETC 也转走,这会导致用户在两条链上的资产同时归零。
如何防范重放攻击?
为了应对硬分叉带来的重放攻击风险,社区和开发者在分叉前通常会设计并实施“防重放攻击机制”。
主要的防范机制:
-
交易ID(或Nonce)不同
- 原理:这是最简单直接的方法,分叉后,两条链对账户的
nonce(一个递增的序列号)进行独立管理。 - 实现:在 ETH/ETC 分叉中,开发者给 ETC 链上的所有账户设置了一个新的、统一的起始 nonce(从 0 开始),而 ETH 链则保留了原来的 nonce。
- 效果:一笔在 ETH 链上 nonce 为 100 的交易,在 ETC 链上会因为 nonce 不匹配(ETC 链上该账户的 nonce 是 0)而被拒绝,反之亦然。
- 原理:这是最简单直接的方法,分叉后,两条链对账户的
-
添加链ID(Chain ID)
- 原理:这是目前更通用、更优雅的解决方案,在交易的签名数据中,加入一个独一无二的
Chain ID(链标识符)。 - 实现:当用户在 ETH 链上发起交易时,其签名数据里会包含
Chain ID = 1,当交易被广播到 ETC 链(Chain ID = 61)时,ETC 节点会发现这笔交易的签名数据中包含的链ID与自己的链ID不匹配,从而直接拒绝该交易。 - 效果:从根本上杜绝了跨链重放的可能性,因为签名本身就绑定了特定的链,这是以太坊在后续升级中采用的标准做法。
- 原理:这是目前更通用、更优雅的解决方案,在交易的签名数据中,加入一个独一无二的
-
双花交易
- 原理:这是一种更主动的防御策略,用户可以主动发起一笔“消耗性”交易,将资产转移到一个新的、只在特定链上有效的地址。
- 实现:一个持有 ETH 和 ETC 的用户,可以主动在 ETC 链上将所有 ETC 转移到一个新地址,这样一来,即使有人重放他在 ETH 链上的交易,由于他 ETC 链上的旧地址已经没有余额了,重放攻击就会失败。
- 效果:通过主动“清空”旧链资产,来保护新链资产,但这需要用户有较高的安全意识。
| 特性 | 描述 |
|---|---|
| 核心概念 | 将一条链上的有效交易,在另一条链上重新广播执行。 |
| 攻击根源 | 交易签名不包含链的上下文信息,导致跨链有效性。 |
| 主要场景 | 区块链硬分叉,特别是两条链共享历史状态和签名时(如 ETH/ETC)。 |
| 主要危害 | 导致用户在不知情的情况下,在两条链上的资产被“双花”或盗取。 |
| 防范措施 | 交易ID/Nonce独立管理、添加链ID、用户主动双花等。 |
重放攻击是区块链硬分叉中必须严肃对待的安全问题,随着 Chain ID 等机制的普及,现代主流区块链项目在设计分叉方案时,通常会内置防重放机制,以保护用户的资产安全。
作者:咔咔本文地址:https://jits.cn/content/23052.html发布于 01-02
文章转载或复制请以超链接形式并注明出处杰思科技・AI 股讯


还没有评论,来说两句吧...