摘要

  • RFC 6528 保留 TCP 序列空间持续前进的纪律,同时把本地与远端地址、端口和密钥送入函数,隐藏不同连接之间的数值关系。
  • 这种设计降低路径外盲猜概率,却不是身份认证;密钥轮换、TIME-WAIT、NAT 信息泄露和临时端口选择仍属于同一控制面。

初始序列号承担两项方向相反的任务。它必须前进,避免同一连接的新实例接受旧实例遗留的报文;它也必须隐藏下一条连接从哪里开始。一个人人看得懂的全局时钟满足了前一项直觉,却暴露了后一项。

RFC 793 建议使用 32 位全局生成器,大约每四微秒加一。RFC 6528 指出,TIME-WAIT 和 TCP 的 quiet time 已经承担了大部分旧报文隔离责任。不过,一些源自 BSD 的协议栈还会利用 ISN 单调上升的启发式规则,允许同一连接快速重生。于是,时钟既成了兼容习惯,也成了预测接口。

路径外攻击者未必需要看到服务器回复。如果能从此前一条真实连接估算服务器下一个 ISN,它就可以伪造三次握手最后的 ACK,并利用只信任源地址的服务。历史上的远程登录工具大多已被 SSH 取代,但基于 IP 地址的信任并未完全消失。传输层的可预测性会放大应用层错误的信任边界。

为每条连接纯随机选择 ISN 可以抑制预测,却可能破坏依赖单调前进的重生启发式规则。保存所有已关闭连接状态能够恢复安全,但要付出内存成本。RFC 6528 选择第三条路:同一连接身份内部保持前进,不同身份之间不暴露明显关系。

给每次会话一个私有偏移

规范建议使用 ISN = M + F(localip, localport, remoteip, remoteport, secretkey)。M 是四微秒计时器;F 是以连接四元组和密钥为输入的伪随机函数。计时器保留推进分量,带密钥的偏移则让本地地址、本地端口、远端地址和远端端口的每种组合拥有独立的表观序列空间。

关键并不是函数看起来复杂,而是外部不能计算 F。否则,一条连接中观察到的 ISN 就会成为预测另一条连接的材料。四元组本身不是秘密,保护力来自密钥,以及没有密钥就无法重建输出的函数。

这种分离不要求系统保存每条死亡连接的历史。再次使用相同四元组时,M 仍会推动空间向前;换成另一四元组时,偏移随之改变。它不是简单给 TCP 粘上随机数,而是在序列连续性与跨连接不透明性之间建立结构化折中。

密钥也有生命周期

RFC 6528 认为 128 位密钥对其威胁模型应当足够,并允许真正随机数或每主机秘密。它列出的轮换时机包括启动、经过预设或随机时间,以及使用次数已足够多。这些都是运营决策,不是无成本清理。

更换密钥会改变重生连接的 ISN 空间。如果系统不保存死亡连接状态,就可能必须等待两倍最大报文寿命的静默期。忽略 TIME-WAIT 的安全控制,可能破坏它原本想保留的生命周期属性。

RFC 在有限的路径外盲猜模型中认为 MD5 可以接受,同时要求实现者权衡更强函数。这个结论只属于该设计及 2012 年的威胁边界;它不是对 MD5 认证能力的认可,也不能证明当前操作系统使用何种算法。

好的 ISN 仍只是一项缓解措施。能观察连接起始报文的人可以知道序列状态,路径上的攻击者本来就拥有更大能力。RFC 将 IPsec 和 TCP-AO 列为密码学认证边界。它还记录了两个相邻效应:不同 ISN 空间可能帮助计算 NAT 后的主机数量;临时端口随机化则会让攻击者更难猜中目标四元组。

唯一来源是 2012 年 2 月以 Standards Track 发布的 RFC 6528。它废止 RFC 1948,并更新 RFC 793。它规定如何降低盲目序列预测,并未说明当前实现默认值、密钥轮换实践或攻击频率。