摘要

  • RFC 7474 把 32 位启动计数与 32 位报文计数组合成 64 位序号。前者保存在非易失存储中,后者随每个 OSPF 报文递增;接收方按报文类型拒绝不高于上次已接受值的序号。
  • Acee Lindem 是这份四人标准的编辑,其他作者为 Manav Bhatia、Sam Hartman 与 Dacheng Zhang。机制的硬边界是:一旦维修、升级或换机丢失持久启动历史,原密钥也必须更换;普通轮换则要证明收发时窗与两端选择实际重叠。

等待遗忘的旧报文

设想有人录下一个通过认证的 OSPF Database Description 报文。他不知道密钥,也改不了摘要。只要接收路由器记得更高的序号,这份录音没有用。随后邻接断开,进程重启,原来附着于邻居状态的计数归零。旧报文没有获得新的授权;只是验证者失去了证明它已经过期的记忆。

2015 年 4 月以 Standards Track 发布的 RFC 7474,处理的正是这种断层。旧式 OSPFv2 加密认证把序号保存在邻接状态里。邻接消失,序号可以重新初始化。摘要仍能证明报文由持有密钥者产生,却不能再证明它属于哪一次协议生命期。

RFC 7474 的完整作者组是 Manav Bhatia、Sam Hartman、Dacheng Zhang 与担任编辑的 Acee Lindem。IETF Datatracker 的公开档案把 Lindem 与这份标准及更广泛的路由工作联系起来,但不证明他是单独发明者,也不把 OSPF、实现或部署结果交给个人所有。这里可以确认的贡献更窄:他参与了一项集体标准,让此前会被故障擦除的安全时间轴跨过重启。

哈希能证明来源,却不能证明现在

RFC 5709早已为 OSPFv2 引入 HMAC-SHA。其作者是 Manav Bhatia、Vishwas Manral、Michael Fanto、Russ White、Michael Barnes、Tony Li 与 Randall Atkinson,Lindem 不在其中。更强的算法提升了抗伪造能力,却不会让一份过去正确产生的报文自动失效。

RFC 6039由 Vishwas Manral、Manav Bhatia、Joel Jaeggli 与 Russ White 撰写,概括手工密钥保护路由协议时的长期密钥、轮换、重放与上下文缺口。本文把它作为威胁背景,而不是把其作者身份移给 Lindem。

因此,“authentication succeeded”只回答了一个问题:受保护字节与某份密钥是否一致。它没有自动回答报文是否属于当前启动期、是否来自 OSPF 实际用来识别邻居的源地址,也没有回答同一密钥是否在另一个协议语境中被误用。完整证据至少包括完整性、新鲜度与使用域。

把启动变成认证纪元

RFC 7474 把加密序号扩展为 64 位。高 32 位是 boot count,低 32 位是严格递增的报文计数。前者标出一次协议纪元,后者标出报文在该纪元里的位置。

boot count 必须在 OSPFv2 路由器的整个部署寿命中保存在非易失存储里。只要先前报文序号状态丢失,包括冷重启,就要增加它。标准允许借用 SNMPv3 的 snmpEngineBoots,但建议另设 OSPF 专用值,以免 SNMP 和 OSPF 不同的重置原因互相污染安全时间轴。

低位计数随每个发出的 OSPF 报文增加。接收方把它与该邻居、同一报文类型的上一个已接受值比较;不更大就按重放丢弃。按类型分开很关键,因为调度优先级可能让 Hello、Database Description 与 Link State Update 以不同顺序到达,并不表示其中一个来自过去。

低 32 位最终回绕时,高位也可以增加,使组合值继续单调。标准没有假装重启不存在,而是把它变成一个经过认证的新纪元,使旧录音无法越过。

新增的八字节序号放在 OSPF 报文之后,并参与摘要计算。Authentication type 3 标识这一形式,Key ID 扩展为 32 位。如果纪元不在认证范围内,攻击者就能替换它;如果接收方不区分报文类型,合法重排又会变成误报。格式本身就是安全性质的一部分。

把 IPv4 源地址纳入证明

此前的认证计算不覆盖 IPv4 头。但在 broadcast 与 NBMA 网络上,OSPF 依赖 IP 源地址判断报文来自哪个邻居。攻击者若能修改已录报文的源地址,就可能在摘要仍然正确时,把它的序号影响转移到另一个邻居状态。

RFC 7474 修改 RFC 5709 的认证填充值,把前四字节设为 IPv4 源地址。发送方放入即将使用的地址,接收方放入实际收到的地址。源地址改变,认证就失败。由此约束的攻击包括让合法邻居看似单向,或干扰 Database Description 交换。

它并未试图冻结 IPv4 头的所有可变字段。它保护的是 OSPF 用来认定邻居身份的那个事实。这正是最小共同规范的力量:不扩大到无关控制面,只把跨实现必须共享的含义固定下来。

同一秘密也要区分协议

长期密钥库可能让多个路由协议使用相同秘密。如果认证输入里没有协议身份,一个语境中的有效构造可能被搬到另一个语境。RFC 7474 在密钥使用前附加两字节 OSPFv2 Cryptographic Protocol ID。

这是一种域分离。运营者或许仍在底层存放相同秘密,但实际参与哈希的语境明确写着“OSPFv2”。它不是鼓励共用密钥:底层秘密泄露仍会扩大影响,独立密钥仍然更安全。协议标识只是为已经存在的共享基础设施补上一道边界。

密钥轮换是一段重叠期

发送密钥只能在 SendLifetime 内使用,接收密钥只能在自己的 AcceptLifetime 内接受。两段时间不必完全相同。新密钥可以先在接收侧开放,再成为发送首选;旧密钥也可以在发送切换后短暂保持可接受,让延迟报文与未同步设备有受控缓冲。

选择还受算法、peer 或 area、interface 与 direction 限制。明确匹配优先于 all。若仍有多把合格发送密钥,则选择发送开始时间最新的一把,以支持渐进轮换。报文携带 32 位 Key ID,接收方据此找到对称密钥,但仍要检查接口、邻居范围、方向、算法与接受时窗。

所以轮换不是一台设备上的午夜开关。先分发新密钥,再开放接受,随后移动发送权,观察双方邻接,最后关闭旧密钥。“两把密钥都在配置里”不等于时窗重叠、时钟一致或两端实际选中了同一个过渡状态。

兼容性的正确表现是明确拒绝

Authentication type 3 不会静默降级。收到的类型与接口配置不一致,报文就按已有 OSPF 规则被丢弃。局部升级期间,这可能使邻接无法建立,却比双方用不同新鲜度语义维持一条“绿色”邻接更安全。

部署单元因此必须覆盖两端:兼容代码、认证类型、算法、Key ID、秘密、时窗与纪元都要对齐。成功不是第一台路由器保存了配置,而是双方接受新报文、拒绝旧抓包,邻接稳定,转发也符合预期。

失去启动历史,就失去沿用旧密钥的资格

RFC 7474 最严厉的运行规则出现在维修、升级与换机处:非易失 boot count 一旦丢失,认证密钥必须更换。恢复相同 Router ID、接口、area 与秘密文件,只恢复了设备的行政外观,没有恢复区分今天与昨天的安全纪元。

若旧密钥配上归零的纪元,旧抓包会重新进入低序号空间竞争。换机因而是密码学生命周期事件,而不只是配置迁移。

标准还保留其他限制。完全退役的路由器可能面临整段、完全相同的邻接建立过程被重放,这被认为极不可能;更换相关密钥同样可以阻断。若两条未编号点到点链路使用相同源地址和同一序号,又存在主动窃听威胁,则建议每条接口使用不同密钥。自动密钥管理不在 RFC 7474 范围内。

小共同规则与大本地责任

Lu Heng 后来的 Minimum Initial Specification, Localized Future Decision, and Voluntary Adoption 为 Sofia Ren 提供了分析框架。序号格式、认证源、协议标识、Key ID 与拒绝语义可以是很小的共同层;密钥生成、保管、接口范围、轮换批次、时钟与恢复由各网络本地负责。

Running-Code Primacy提高了举证门槛:把持久计数、实际发出序号、选中密钥、源绑定摘要、接收决定、重放丢弃计数、邻接与转发连成一条链。这里的 Heng 文本是 Sofia Ren 后来的分析工具,不是 Lindem 的个人意图,也不是 RFC 之外的 IETF 意图。

攻击者可以比路由器更长久地保存过去。RFC 7474 要求路由器反过来拥有可验证的历史优势。若这段历史已经无法信任,旧密钥也不能继续替新生命作证。

来源