摘要

  • RFC 3012 让 Mobile IPv4 外地代理在访问链路上自行发出挑战,在外部 AAA 完成认证之前,就能区分缺失、已用过和不属于近期窗口的值。
  • 正确回送挑战只证明请求与本地近期状态相符;它仍须经过认证扩展、外部或归属域决策、注册接受、转发建立与实际流量验证。

漫游把信任拆成了两处。设备站在访问网络里,凭据却可能由归属网络掌握。外地代理需要立即处理注册请求,却未必与这个移动节点预先共享密钥。若所有判断都等待远端认证、授权与计费系统完成,访问边缘连“这是不是旧报文”都无法先行判断。

2000 年 11 月发布的 RFC 3012 解决的正是这个时间差。外地代理可在 Agent Advertisement 中加入 Challenge extension,发出一个应不少于 32 位的随机值。移动节点把这个值复制到 Registration Request 的 MN-FA Challenge extension 中,再送回来。

关键不在“挑战—响应”四个字,而在谁发出挑战。值由当前访问网络的外地代理产生,因此它无需先知道节点的完整身份,也能确认请求是否回应了自己的近期动作。它获得的是本地新鲜性,而不是全球身份结论。

规范随即堵住了最危险的误读。挑战值不能单独成立。Registration Request 中的 MN-FA Challenge 后面必须跟随 Mobile-Foreign Authentication,或 MN-AAA Authentication。若请求只带挑战而没有两种认证扩展中的任何一种,外地代理必须静默丢弃。

如果节点与外地代理已有安全关联,前一种认证可以直接绑定报文;若没有,节点必须使用 MN-AAA,并且最好携带 RFC 2794 定义的 Network Access Identifier。NAI 的 realm 可帮助系统把验证工作路由到适当的管理域,但一个可路由的名字并不是名字所有权的证明。

因此,挑战、标识符、认证器与授权决定属于不同层。挑战回答“是否对应近期本地状态”;NAI 回答“应去哪里寻找验证者”;认证器回答“持有相应秘密的一方是否绑定了这些数据”;授权系统再回答“验证成功后是否允许此项注册”。任何一层都不应冒充下一层。

RFC 3012 用三个错误码把状态差异写进协议。缺少必需挑战时返回 MISSING_CHALLENGE;同一移动节点已经使用过该值时通常返回 STALE_CHALLENGE;值既不是上次成功回复中给该节点的挑战,也不在最近 CHALLENGE_WINDOW 次广告范围内时,返回 UNKNOWN_CHALLENGE。今天的 IANA Mobile IPv4 登记表 仍保存这些代码。

三者都可能出现在“注册失败”的大类里,却指向完全不同的事实。缺失说明请求没有完成规定结构;过期说明值有使用历史;未知说明外地代理无法把值归入自己的近期发行记录。把它们压成一个认证失败,会丢掉真正发生在哪个状态边界的信息。

重传构成一项精确例外。移动节点若用相同的 64 位 Identification 与相同挑战重发请求,而外地代理仍保存着该节点的对应 pending registration record,代理会再次转发。只看报文字节,两次请求相同;结合待处理状态,它们却可能是同一交易,而不是新的重放攻击。

这揭示了防重放的真实成本:记忆。系统必须保存哪个代理发行了什么、哪个节点已经使用、哪项请求仍在等待、Identification 是否一致,以及状态何时失效。“相同值一律拒绝”会误伤合法重传;“最近见过即可接受”又会把窗口变成攻击面。

下游回复也需要绑定。若外地代理把挑战保留在转给 Home Agent 的请求中,它应把该值记录在 pending 状态里。Home Agent 返回的 Registration Reply 若没有相同挑战,外地代理必须拒绝它,并把结果改成缺失挑战后交给移动节点。这里的匹配并不证明服务已经可用,只证明这份下游结果属于这项本地见证过的交易。

若移动节点与外地代理直接共享安全关联,代理验证 Mobile-Foreign Authentication 后可以删去自己的挑战与相关认证材料,再向后转发。这时规范要求它在本地记录中保留请求的 Identification,以维持防重放边界。线上表示可以改变,证据责任不能消失。

真正的 AAA 工作被有意留在 Mobile IPv4 之外。RFC 3012 的附录把它称为 verification infrastructure。外地代理可以把认证材料交给外部系统,等待一项受保护的结果;但规范没有定义这套基础设施所用的协议,也没有要求执行验证的实体本身属于 Mobile IPv4。

这是一条克制的接口。移动协议规定节点要带什么、外地代理能先检查什么;外部系统按照自己的密钥、账户与政策完成验证;代理再决定如何处理结果。共同标准让层次对接,却没有假装一个 RFC 能接管所有运营决策。

为兼容当时的 AAA 环境,规范保留 CHAP_SPI 2,给出与 RADIUS 用法接近的 CHAP 风格 MD5 计算。RFC 2865 所代表的远端认证体系因而更容易接入。不过 RFC 3012 的安全章节明确承认,这种做法弱于 HMAC-MD5,应尽可能避免。

这段警告保存了一项重要历史现实:可部署性经常来自对既有系统的适配,而适配本身又会变成下一轮修订的理由。标准记录妥协,不等于宣布妥协永久安全。

规范还描述了拒绝服务边界。恶意节点可重放请求,诱发一份看似拒绝的回复;与此同时,合法的成功回复也许仍在途中。移动节点可能因先看到拒绝而按失败处理,即使注册接受消息稍后抵达。挑战减少了一类重放,却没有消除竞态、伪造提示或状态耗尽。

长度不足四字节的挑战尤其脆弱。外地代理若使用短值,应同时保留 Identification,以增加对唯一性的把握。随机性、交易标识与本地状态只有在明确条件下才可互相补充,不能靠“这是随机数”的措辞创造不存在的熵。

2007 年的 RFC 4721 废止并修订 RFC 3012。新版要求外地代理按移动节点记录适用挑战;节点一旦用某个值完成注册,就不得再使用在它之前广告过的值。它还澄清回复与广告处理、增加对伪造消息的防护,并提供 HMAC-MD5 选项。

这些修订不能证明某个具体网络曾遭攻击,却证明了原机制的意义依赖有序历史。一个值是否“新”,取决于谁发行、给谁使用、此前接受过哪个值、是否仍有对应请求待处理,以及哪种认证器覆盖了报文。脱离这些关系,随机字节没有独立的信任含义。

它也与 RFC 2002 的历史主线不同。基础 Mobile IPv4 关心稳定 home address 与临时 care-of address 之间的绑定;认证成功的 Registration Reply 可证明 Home Agent 接受了一项有期限的状态。RFC 3012 处理的是更早、更靠访问边缘的一步:外地代理能否相信请求没有简单重放。

它同样不是把 RFC 1994 的 PPP CHAP 换一个包装。PPP 中的认证者与对端处于特定链路认证交换里;RFC 3012 把外地代理的本地挑战嵌进 Mobile IPv4 注册,并允许另一套 AAA 基础设施完成更广的凭据判断。借用计算方式,不会抹平控制面的差异。

按 Lu Heng 的 Minimum Initial Specification 视角,RFC 3012 的成绩在于只规定必须共同的部分:挑战格式、扩展顺序、可接受历史、错误与转发边界。它没有把单一 AAA 产品、商业政策或归属域安排写成全球强制结构。外地代理运营者保留选择,也承担记录与解释责任。

Running-Code Primacy 则提醒我们停止在文档层过度推论。RFC 只能证明状态机被发布;抓包可证明代理发过挑战、节点回过某个值;验证日志才能证明认证器结果;政策日志才能证明授权;代理状态才能证明注册;流量证据才能证明真正连通。

“挑战—响应”听起来像一次完整的信任仪式,容易让这些层次被压扁。RFC 3012 自己却拒绝这种神话:没有认证扩展的挑战必须丢弃;认证材料仍可能要去远端验证;积极结果仍要进入注册;注册仍不等于报文抵达应用。

网关发出挑战,只因为它需要一项自己能先建立的事实。身份与授权仍须从别处到来。RFC 3012 最耐久的价值,不是让一个随机值包办信任,而是诚实标出了信任尚未到达的位置。

Sources