本文作者:咔咔

区块链的重放攻击

区块链的重放攻击摘要: 这是一个在区块链,尤其是在硬分叉场景下非常常见且危险的安全问题,什么是重放攻击?重放攻击的核心思想是:攻击者截获一个在一条链上有效的交易,然后将其“重放”(重新广播)到另一条链上,...

这是一个在区块链,尤其是在硬分叉场景下非常常见且危险的安全问题。


什么是重放攻击?

重放攻击的核心思想是:攻击者截获一个在一条链上有效的交易,然后将其“重放”(重新广播)到另一条链上,并期望这条交易在另一条链上同样有效,从而获利或造成破坏。

区块链的重放攻击
(图片来源网络,侵删)

就像一个人在商店A用一张有效的购物卡买了东西,然后他跑到商店B,把同一张卡再刷一次,希望商店B的系统也能认这张卡,从而免费再拿一份商品。

在区块链的语境下,“购物卡”就是一笔包含签名和数据的交易,“商店A和商店B”就是分叉前后的两条链。


为什么会发生重放攻击?—— 根源在于签名

要理解重放攻击,首先要明白区块链交易是如何被验证的。

一笔交易要被网络接受,必须满足两个基本条件:

区块链的重放攻击
(图片来源网络,侵删)
  1. 交易数据有效:发送方有足够的余额、格式正确等。
  2. 签名有效:发送方用其私钥对交易数据进行了签名,网络可以用其对应的公钥验证这个签名,证明交易确实是由该地址发起的。

重放攻击的根源在于:交易签名本身并不包含链的上下文信息。

一笔交易的签名,本质上是对 交易数据 的签名,而不是对 在链X上执行 这个指令的签名,一笔在链A上签名有效的交易,其签名在链B上依然是有效的(只要链B的验证逻辑认为交易数据本身是合法的)。

当发生硬分叉时,新旧两条链的共识规则(尤其是交易验证规则)可能不完全相同,这就为攻击者创造了机会。


重放攻击的经典场景:硬分叉

硬分叉是重放攻击最典型的发生场景,我们以太坊的经典案例来详细说明。

案例背景:以太坊 The DAO 事件与硬分叉

  1. 分叉前(原链):2025年,以太坊主链上有一个名为“The DAO”的智能合约遭受了黑客攻击,大量以太币被转移。
  2. 社区分歧:社区对于如何处理这笔被盗的以太币产生了严重分歧,一部分人认为应该通过硬分叉来回滚交易,将资金返还给原所有者;另一部分人则坚持“代码即法律”,认为不应该干预,应该让原链继续运行。
  3. 分叉发生
    • 以太坊:大部分开发者、矿工和用户支持硬分叉,形成了一条新的链,继续发展,这条链保留了“The DAO”事件后的状态,并将被盗资金转移到一个指定地址。
    • 以太坊经典:另一部分人坚持不干预,保留了原始的链,包括“The DAO”的漏洞和被盗的资金,这条链被称为“以太坊经典”(Ethereum Classic, ETC)。

就有了两条链:ETH链ETC链,它们共享分叉前的所有历史状态,包括账户余额和交易签名。

重放攻击如何发生?

假设一个用户在分叉前拥有 10 个 ETH(同时也是 10 个 ETC)。

攻击者的操作:

  1. 截获交易:攻击者(可以是节点、矿工,或网络中间人)监控到这位用户在 ETH 链上发起了一笔交易,发送 1 ETH 给地址B
  2. 重放到 ETC 链:攻击者截获这笔完整的交易数据(包括发送地址、接收地址、金额、签名等),然后将其广播到 ETC 链上。
  3. 交易在 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 也转走,这会导致用户在两条链上的资产同时归零。


如何防范重放攻击?

为了应对硬分叉带来的重放攻击风险,社区和开发者在分叉前通常会设计并实施“防重放攻击机制”。

主要的防范机制:

  1. 交易ID(或Nonce)不同

    • 原理:这是最简单直接的方法,分叉后,两条链对账户的 nonce(一个递增的序列号)进行独立管理。
    • 实现:在 ETH/ETC 分叉中,开发者给 ETC 链上的所有账户设置了一个新的、统一的起始 nonce(从 0 开始),而 ETH 链则保留了原来的 nonce。
    • 效果:一笔在 ETH 链上 nonce 为 100 的交易,在 ETC 链上会因为 nonce 不匹配(ETC 链上该账户的 nonce 是 0)而被拒绝,反之亦然。
  2. 添加链ID(Chain ID)

    • 原理:这是目前更通用、更优雅的解决方案,在交易的签名数据中,加入一个独一无二的 Chain ID(链标识符)。
    • 实现:当用户在 ETH 链上发起交易时,其签名数据里会包含 Chain ID = 1,当交易被广播到 ETC 链(Chain ID = 61)时,ETC 节点会发现这笔交易的签名数据中包含的链ID与自己的链ID不匹配,从而直接拒绝该交易。
    • 效果:从根本上杜绝了跨链重放的可能性,因为签名本身就绑定了特定的链,这是以太坊在后续升级中采用的标准做法。
  3. 双花交易

    • 原理:这是一种更主动的防御策略,用户可以主动发起一笔“消耗性”交易,将资产转移到一个新的、只在特定链上有效的地址。
    • 实现:一个持有 ETH 和 ETC 的用户,可以主动在 ETC 链上将所有 ETC 转移到一个新地址,这样一来,即使有人重放他在 ETH 链上的交易,由于他 ETC 链上的旧地址已经没有余额了,重放攻击就会失败。
    • 效果:通过主动“清空”旧链资产,来保护新链资产,但这需要用户有较高的安全意识。

特性 描述
核心概念 将一条链上的有效交易,在另一条链上重新广播执行。
攻击根源 交易签名不包含链的上下文信息,导致跨链有效性。
主要场景 区块链硬分叉,特别是两条链共享历史状态和签名时(如 ETH/ETC)。
主要危害 导致用户在不知情的情况下,在两条链上的资产被“双花”或盗取。
防范措施 交易ID/Nonce独立管理添加链ID用户主动双花等。

重放攻击是区块链硬分叉中必须严肃对待的安全问题,随着 Chain ID 等机制的普及,现代主流区块链项目在设计分叉方案时,通常会内置防重放机制,以保护用户的资产安全。

文章版权及转载声明

作者:咔咔本文地址:https://jits.cn/content/23052.html发布于 01-02
文章转载或复制请以超链接形式并注明出处杰思科技・AI 股讯

阅读
分享

发表评论

快捷回复:

评论列表 (暂无评论,2人围观)参与讨论

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