摘要

  • RFC 5269 明确分开 CGA/SEND 签名密钥、专用切换密钥运输公私钥对和共享切换密钥:前者证明源地址声明资格,第二套只运输秘密,第三套只认证 FBU。
  • 有效的 FBU MAC 只授权旧路由器为某个 previous care-of CGA 改变转发;它不认证设备位置、新地址、分组送达、用户、应用或永久 Mobile IPv6 绑定。

问题不在证明太弱,而在标签变得太大

RFC 5269 所防的攻击很具体。FBU 可以要求旧接入路由器把发往移动节点旧转交地址的流量转走。如果任意发送者都能发出这条指令,攻击者便能把受害者流量导向别处。

协议因此在切换前为移动节点与接入路由器建立共享切换密钥。移动节点以后用它为 FBU 计算授权 MAC;旧路由器找到对应密钥并验证,成功后才改变转发。

这是强控制。错误发生在管理层把结果命名为“切换已认证”。MAC 没有观察无线附着,没有为预期 NCoA 执行 DAD,没有看到新路由器释放缓冲,也没有看到移动节点收包。它只授权一条关于旧地址的控制消息。

密钥的用途不是附注,而是证明能够被正确解释的边界。

三套密钥对应三种不同主张

第一套是 CGA/SEND 密钥。RtSolPr 从移动节点的 care-of CGA 发出,带 CGA 参数与 SEND 签名。SEND 验证成功,只让接入路由器确认发送者有权声明这个源 CGA。

第二套由移动节点专门生成,用于加密和解密切换密钥。它与 SEND 使用相同的公钥算法和参数,却是独立公私钥对。RFC 5269 禁止把它用于其他加密或签名。公钥放进 Handover Key Request Option,私钥只在移动节点侧解开回复。

第三套是接入路由器生成或取回的共享切换密钥。路由器用第二套公钥加密它,通过 Handover Key Reply Option 返回;以后双方用它处理 FBU 的授权 MAC。

若把三者压成一个 mobilityKey 字段,模型就失去了因果。SEND 私钥签地址声明交换,运输私钥只解封秘密,共享秘密只认证一类消息。它们的生成者、允许用途、轮换边界和泄露后果都不同。

SEND 验证必须先于状态分配

移动节点的 RtSolPr 包含专用运输公钥、偏好的 FBU Algorithm Type、SEND CGA/Signature 选项和用于抗重放的 nonce。

接入路由器必须先用 SEND 验证请求。验证失败时,它不能返回 Handover Key Reply Option,不能配发密钥,也不能改变该地址原有的密钥记录。最后一条防止伪造请求借失败路径破坏合法节点的缓存。

先验证还有容量意义。随机生成密钥并保留缓存状态需要资源。RFC 5269 要求不要在确认 RtSolPr 发起者之前创建这类状态,并把速率限制、未解决请求的状态上限和谨慎缓存管理列为抵御状态耗尽的措施。

因此审计不能只有“签名有效”。还要知道状态何时分配、分配前是否完成验证,以及通过验证的请求是否仍受准入与容量策略约束。

解密成功之前还有一条路由器证明链

请求有效后,路由器会返回已经与 CGA 关联的共享密钥,或者新建一把。它用请求中的运输公钥加密共享密钥;PrRtAdv 同时返回 HK-LIFETIME、选定的 Algorithm Type 和原请求的 nonce。

路由器本身也必须被验证。接入路由器需要适用于 SEND 路由器的证书,支持证书发现并签署回复。移动节点必须检查签名密钥确实是路由器的认证公钥;若证书路径未缓存,就通过 SEND CPS/CPA 获取。未由认证密钥签署的回复必须丢弃。

nonce 把回复关联到具体请求,并在移动节点同时持有多套运输密钥时指出该用哪一套私钥。找不到匹配 nonce,回复同样必须丢弃。

因此“解密成功”不是完整收据。请求代际、CGA 声明、SEND 签名、路由器验证、证书路径、路由器签名、nonce 回显、算法选择、匹配私钥和寿命共同构成接受链。

缓存键本身是一段关系

路由器把共享密钥按移动节点 CGA 索引,并一起保存算法与寿命。移动节点以后发送 FBU 时,则根据旧路由器身份以及自己在那条链路上的 previous care-of CGA 选择密钥。

FBU 的 Home Address Option 携带旧 care-of CGA。旧接入路由器用它查找密钥;找不到就不得改变该地址的转发。

同一设备可以访问多个路由器,一个路由器可以回应多个请求,节点也可同时保留多个回复者的密钥。密钥字节本身并不命名权限;路由器、移动地址、算法、代际和寿命才把它变成一段可解释关系。

如果缓存只按“设备 ID”或“当前路由器”查询,系统可能选错一把仍能计算出有效 MAC 的密钥。密码学无法修复错误的数据库连接条件。

算法选择也属于证据

请求带移动节点偏好的 FBU 认证算法。路由器若支持,应沿用;否则必须选择强度相当或更高的算法。回复记录最终 Algorithm Type,移动节点必须按回复值使用。

多个路由器都回应时,节点可以保留多把密钥。若没有支持的算法,可以重试;但不应因为受控路由器制造降级压力,就把下一次请求降到比最初更弱。

只有“MAC valid”的审计记录,遗漏了“valid”所依赖的策略。原请求、最终选择、算法标识与当时策略代际都应随验证结果保存,不能让未来策略静默重写旧证据。

未过期不等于已续权

RFC 5269 给两类对象不同的默认边界。运输公私钥对建议最多使用 12 小时或十次切换,先到者为准;共享切换密钥默认寿命为 12 小时,即 43,200 秒。

接入路由器必须按认证算法所需强度随机生成共享密钥,为每个 CGA 公钥生成唯一值,并应避免不同切换密钥之间以及切换密钥与 CGA 密钥之间存在相关性。

旧路由器可以保留仍有效的共享密钥,以支持普通 Mobile IPv6 绑定完成前又发生的快速移动。节点返回并重新生成相同 care-of CGA 时,路由器可以再次发送同一把密钥。但节点不能因为本地还记得它,就假定仍有权使用;它必须真正再次从路由器收到密钥。

本地持有、计时器未过期、路由器仍保留、重新配发成功是四种状态。“缓存存在”不能写成“已续权”。普通绑定完成后,移动节点应丢弃密钥;旧路由器在转发超时或 HK-LIFETIME 到期时必须删除。

专用密钥必须留在专用范围内

RFC 5269 把共享秘密视为 purpose-built key 的实例。它用于授权旧路由器为旧地址进行切换相关的转发变更,不加密用户流量,不是应用会话密钥,也不认证订户或员工。

它不能验证预期 NCoA,不能替代普通 Mobile IPv6 Binding Update 或 Return Routability,也不能证明 home agent 或 correspondent node 接受了绑定。签名更强、证书路径更完整,只会让原本狭窄的主张更可靠,不会把它变成别的主张。

现行 FMIPv6 基础规范是取代 RFC 5268 的 RFC 5568;它继续引用 RFC 5269 作为 FBU 共享密钥的建立机制。扩展必须与现行基础规范一起阅读,不能顺带继承 RFC 5268 已淘汰的报文格式。

运行代码是一条证明链

按照 Lu Heng 的 Running-Code Primacy,真正运行的不是“安全移动”这个产品名,而是:一个 CGA 声明、一个 SEND 签名请求、一把独立运输公钥、一个认证路由器回复、一个相符 nonce、一条共享密钥缓存关系、一种算法、一个 FBU MAC 和一次转发决定。

现实层纪律把持有、授权与结果分开。私钥证明控制了一次密码运算;SEND 验证证明特定地址声明;路由器证书在自己的信任模型内说明回复来源;nonce 证明请求关联;FBU MAC 授权路由变更。任何一项都不证明设备附着或服务连续。

只有每个绿色状态都能反查密钥用途、主体关系、代际、算法、寿命与具体消息,抽象才可逆。如果证据止于“已认证”,系统恰好丢掉了密码学最有价值的边界。

来源