什么是 Replay Attack?
Replay Attack 是指有人捕获一个有效的加密操作并再次发送,使网络将其视为新的动作。签名是真的,但时机被滥用。可以把它比作有人在另一个仍按相同规则办理的柜台重复使用你已签名的支票。
有人会误以为 Replay Attack 意味着你的私钥被窃取。但不完全是。攻击者可以在两个接受相同签名规则的地方重复使用你已签名的消息,即使不知道你的私钥。
Replay Attack 的工作原理
快速说明,便于记住。
- 步骤 1:你广播了一个已签名的 交易。
- 步骤 2:攻击者复制了完全相同的已签名数据。
- 步骤 3:他们在仍能验证的地方重新发送,例如在发生 硬分叉之后,或在接受相同签名规则的链上。
- 步骤 4:网络看到有效签名并再次处理,结果价值被转移了两次。
- 步骤 5:只有防重放检查能阻止它,例如链 ID、nonce,或应用级的一次性许可。
这就是整个手法。令人恼火,但很容易防范。
为何 Replay Attack 很重要
你为什么要关心 Replay Attack?因为它可以把你本只想执行一次的真实操作复制为两次。
- 好处:了解风险可以帮你省钱并减轻压力,帮助你安排更安全的操作。
- 角度:多链交互已成常态,因此已签名消息在错误的链上被接受的情况比想象中更常见。
- 相关性:当你跨越区块链网络转移资金、遇到链分裂,或为应用签名链外消息时,会遇到这个术语。
使用会清楚显示当前链并正确设置链 ID 的 钱包。不确定时,先发送少量测试交易,再发送剩余部分。
Replay Attack 的主要特征
通过以下特征快速识别:
- 复制:它逐字节重复使用完全相同的已签名消息。
- 有效性:签名是真实的,因此节点会接受,除非存在防重放保护。
- 时机:最常见于链分裂、跨链桥,或应用跳过 nonce 检查时。
变种
同一手法,不同场景:
- 分叉:在分裂后的两条链之间发生重放,且两边仍认可相同签名。
- 跨链:在共享参数或接受相同消息格式的链之间发生重放。
- 合约:在应用中重放已签名的许可或元交易,因为忘记使用一次性 nonce。
在重大升级或分叉后,检查两条链上的 交易记录。如果有重复条目,发送更多之前请暂停。
示例
在 DAO 分叉之后,一些在以太坊上签名的提现曾被以太坊经典接受,直到引入更强的重放保护为止。
趣闻
以太坊在 2016 年通过 EIP155 引入了链 ID,专门用于阻止 Replay Attack 的手段,这一设计也影响了现代钱包要求你事先选择链的做法。
总结
一句话总结 Replay Attack:真实签名在不该使用的地方或时间被重复使用。把它当作双重扣款来对待,会更容易发现。
