开启 3 天免费试用
注册即可免费体验全部高级功能。
*仅限新用户;每位用户只能获得一次试用。


代理握手重放攻击,是攻击者记录一条过去有效的握手消息或早期保护请求,然后再次发送,希望服务器把旧授权当成新授权接受。攻击者不一定知道密钥,也不必解密消息。真正的安全问题是重复使用:过去有效的证明在新的上下文中再次产生了本不应获准的效果。[1]
完整 VPN 指南从整体上解释隧道建立。本文只讨论防御性协议设计,不提供抓取流量、制作重放工具或测试未经授权系统的步骤。
关键要点
- 重放复用的是有效字节,不等于伪造新的认证值。
- 网络重传和有上限的客户端重试可能完全正常,服务器必须定义明确接受语义。
- nonce、时间戳、计数器、临时密钥和握手记录哈希解决不同的新鲜度问题。
- 抗重放窗口依赖状态、时间假设或两者,在无法确认时需要明确失败策略。
- 阻止握手重放,不会自动让所有应用操作变成幂等。
**图例:**1 表示过去记录的有效握手或早期消息;2 表示新鲜度与握手记录检查拒绝复用;3 表示新会话只能在当前认证上下文中继续。
握手通常要确认谁掌握密钥、采用哪些算法和参数,并为后续流量建立新的会话密钥。如果一条已记录的客户端消息永久有效,这些字节本身就可能变成可重复使用的通行证。攻击者无需恢复密钥,也可能让服务器分配资源、开放路由、重复早期动作,或产生可区分响应。
并非所有重复包都是攻击。IP 可能复制数据包,TCP 会重传未确认字节,应用也会在响应丢失后重试。安全协议应规定重复消息是忽略、确认、只处理一次,还是作为新尝试处理。“相同字节出现两次”只是观察;“第二份副本再次导致未经授权的接受”才是重放漏洞。
上下文也要区分。同一传输连接内的重发会受到序列号和记录保护;放进新连接重发,考验授权是否与原会话绑定;重放早期应用数据,则考验业务动作能否安全执行多次。
| 事件 | 发起方 | 服务器的预期行为 |
|---|---|---|
| TCP 重传 | 丢包后由传输栈发起 | 重组同一字节流并抑制重复段 |
| 客户端握手重试 | 授权客户端在失败后发起 | 应用协议重试与新鲜度规则 |
| 重复应用请求 | 客户端或网络歧义造成 | 使用请求对应的幂等语义 |
| 重放攻击 | 未授权一方重复使用截获的字节 | 拒绝陈旧或已经接受的授权 |
传输层重传通常发生在丢包后,目的是交付同一条有序字节流。接收方依据传输状态识别副本,不会把同一字节两次交给应用。客户端重试则是获授权客户端在结果不确定后主动发起的另一次尝试,常常使用新的连接状态。
重放者不属于这个协作交付契约。它把旧消息放入自己选择的上下文,以获得新的接受。服务器不能只检查消息在密码学上是否有效,因为真实密文也可能已经过期。
日志应分别记录传输层重传、新连接尝试、重复 nonce 和重复业务标识,不能用一个“重复次数”解释所有事件。
Nonce 是在规定范围内只使用一次的值。客户端随机 nonce 能让正常握手彼此不同,但服务器必须把它纳入认证,并决定怎样发现复用。服务器 challenge 能证明响应是在挑战发出后生成,代价是增加一次往返。
时间戳把接受限制在时间窗口内,但需要时钟漂移和回拨规则。计数器提供顺序,却要求持久或可靠同步的状态,否则服务器重启或多个节点会重新开放旧范围。
临时 Diffie-Hellman 密钥可以提供新会话密钥材料,却不会自动证明所有随附授权字段都是新的。认证计算应覆盖完整握手记录:协议名称、角色、算法选择、临时密钥、身份以及路由请求。Noise Protocol Framework 使用握手哈希和 chaining key,把消息上下文纳入认证和密钥派生。[2]
假设一个有效的认证值只覆盖了时间戳,却没有覆盖请求的目标或服务器身份。攻击者也许无法改动受保护的字节,但同一个证明可能会在不同的外围路由下被解读。绑定完整握手记录,可以防止字段脱离其获得授权时所在的会话。
角色绑定也出于同样的原因。客户端发往服务器的消息,不应在反方向上也被当作有效。协议版本和算法绑定,能防止在一次协商中产生的证明被挪用到更弱或含糊的协商中。端点或服务绑定,能防止一个部署接受原本为另一个信任域准备的授权。
因此,密码学验证要回答两个问题:认证值是否正确?它是否恰好针对当前这份完整的握手记录?除非实现明确说明了所覆盖的上下文,否则一条“MAC 有效”的日志只回答了第一个问题。
严格的一次性 nonce 要求服务器至少在重放窗口内,记住哪些值已经被接受过。数据库或分布式缓存可以提供精确的状态,但会增加延迟、存储、清理和一致性方面的要求。当协议具有稳定的会话身份和顺序时,围绕单调递增计数器维护的有界位图成本更低。
概率型数据结构可以节省内存,却可能因误判而拒绝新的客户端。按时间分桶的缓存限制了保留时长,但依赖时钟,并留下一个明确的窗口。无状态令牌可以认证签发时的数据,但除非应用动作本身可以安全地重复,或有另一个组件保存兑换状态,否则它无法证明没有被重复使用。
多节点部署需要为防重放判断指定一个明确的负责方。如果每个边缘节点各自维护独立缓存,同一条消息可能在每个节点上各被接受一次。共享状态可以缩小这个缺口,但会带来可用性方面的取舍。失败时放行(fail open)提高了可用性,却削弱了这一安全属性;失败时拒绝(fail closed)保护了该属性,却可能在状态丢失时拒绝客户端。设计应说明这种取舍,而不是把它藏起来。
TLS 1.3 的 0-RTT 允许回访客户端在完整新握手结束前发送应用数据。RFC 8446 明确指出,0-RTT 在跨连接场景下没有内建重放保护。服务器可以采用一次性 ticket、共享重放数据库或时间窗口,但也可能只对能够安全重复的操作接受风险。[1]
这里的核心是握手认证与应用语义相连。同一个只读请求在某些服务中重复执行问题不大;付款、状态修改、配额消耗或一次性凭据兑付则不同。“早期数据已加密”并不等于“严格执行一次”。
代理握手可能在通道完全建立之前就携带路由或准入数据。设计者应在确认新鲜性之前尽量减少副作用,认证完整的请求上下文,并尽可能让重复处理不造成危害。这是一条防御性设计原则,并不是说每种代理都类似 TLS 0-RTT。
WireGuard 提供了一个分层实例。握手使用临时密钥、发起消息中的时间戳以及与握手绑定的密钥派生;传输数据使用计数器和滑动重放窗口;协议说明也包括拒绝旧时间戳和限制频繁发起。[3]
这些机制属于 WireGuard,不能直接投射到无关代理。VLESS 与 REALITY 层次有不同契约,不能由“加密”两个字推断抗重放属性。
如果你担心的是在不可信网络上被重放,而不是要自建代理,AethoVPN 会在应用内完成连接建立:在 Windows、Linux 或 Android 上安装(iPhone 和 Mac 需通过官方设置向导,并使用 Pro 或 Premium 套餐),选择一个位置,在使用公共 Wi-Fi 前先连接。AethoVPN 并未公开其握手格式、nonce 数据库或重放窗口,所以会话成功并不能说明它如何抵御重放。开始 3 天免费 Pro 试用来评估客户端,切勿重新发送捕获的凭据。
只调查自己拥有或已明确获授权的系统。先读规范、服务器日志,并用合成消息编写单元或集成测试,不要从真实用户流量开始。记录第二份输入是否到达密码学验证、是否分配资源、是否建立会话,以及是否重复业务副作用。
还要把重放与主动探测分开:探测可以发送新输入,重放必须复用过去有效消息,服务器对两者的防护可能不同。
如果服务器有响应但握手失败,应保存经过认证的错误及精确阶段。握手故障排查比把每次重复尝试都叫作攻击更合适。日志和问题报告中不要发布可复用认证材料。
不需要。攻击者可以原样发送已记录字节。如果服务器把旧认证消息视为新消息并再次授权,就存在漏洞。
通常不属于。TCP 会在同一连接内抑制重复交付。只有安全层或应用边界再次接受旧字节时,才进入重放问题。
不能。Nonce 还必须具有适合范围的唯一性,被纳入认证,在正确范围内检查,并被记住或通过其它方式证明新鲜。
不一定。时间戳依赖时钟和窗口规则;计数器依赖顺序及持久状态。协议可以组合两者覆盖不同故障。
早期数据在完整新握手前使用过去会话的信息发送。部署需要额外抗重放措施,并应只允许重复后仍安全的操作。
不同。主动探测可使用新选择的输入,重放则专指再次发送过去有效的消息或保护请求。
不能。应用仍需幂等、事务或一次性兑付规则。握手新鲜度无法决定每个后续业务操作是否能安全重复。
免责声明:本文仅提供防御性协议安全信息。请只测试自己拥有或明确获授权的系统,不要保存或披露用户流量与认证材料。
来源:
Sources checked 2026 年 9 月 12 日。
延伸阅读:
注册即可免费体验全部高级功能。
*仅限新用户;每位用户只能获得一次试用。