摘要

  • RFC 791 的 type 130 是固定 11 字节的 Security 选项,分别携带安全等级、隔离区、处理限制和传输控制码;后来规范保留了类型值,却替换了字段格式。
  • RFC 1108 的 Basic Security Option 把分级与保护机构标志交给接口策略比较;标签可以显式存在,也可以在受控环境中由入口接口隐含赋予。
  • RFC 1108 后来成为 Historic,这类数据包也不应通常出现在全球公网,但后续指南仍反对通用设备默认剥离或丢弃,因为封闭 MLS 网络可能因标签消失而错误升级或降级信息。

“去掉安全字段”也可能破坏安全

这段历史里最危险的动作,不一定是加入标签,而可能是删掉标签。RFC 7126 说明,Basic Security Option 若在传输途中被剥离,接收端很可能因为数据包没有被正确标记而将其丢弃;在某些情况下,它也可能接收数据,却关联错误的敏感度。

错误可朝两个方向发生。把信息当得过于敏感,会造成不必要的升级、隔离和使用障碍;把信息当得不够敏感,则可能让不应接触它的区域获得数据。删除选项的设备没有消除风险,而是在不知道接收端替代规则的情况下更换了访问控制输入。

因此,type 130 必须被理解为安全标签,而不是密码机制。它不加密载荷,不认证发送者,也不证明某人具备许可。它只有在可信端点、可信中介、受保护链路和正确配置共同存在时,才会成为强制访问控制的一部分。

最初的 11 字节装了四种控制

RFC 791 把 Security 定义为类型 130、长度固定为 11 个八位组。类型和长度之后有四个字段:16 位 Security、16 位 Compartments、16 位 Handling Restrictions,以及 24 位 Transmission Control Code。

Security 从一组命名等级中选择一个;Compartments 把流量分入受控类别;Handling Restrictions 表示控制与发布标记;TCC 用于隔离流量并定义受控的利益共同体。这个选项并非只写“秘密”或“公开”,而是试图把一整套外部信息控制制度压缩进 IP 首部。

它的复制位为一,分片时必须进入所有分片;每个数据报至多出现一次。IPv4 自己造成的数据切分,不应让某片脱离标签。

RFC 791 对选项还给出过很强的总体要求:某个数据报是否携带选项可以选择,但 IP 模块实现选项本身并非可选;某些环境甚至可能要求每枚数据报都带 Security 选项。全球协议格式因此容纳了一个完全依赖局部安全环境的规则。

不过,字段被复制不等于字段真实。原始设计没有给标签加密或完整性证明,效果依赖外部信任关系。

同一个类型值,背后已经换了格式

1988 年的 RFC 1038 把 type 130 修订成可变长度的 Basic Security Option。固定的 compartments、handling 与 TCC 布局消失,新的主体由 classification level 和 protection-authority flags 组成。

类型值连续容易制造错觉。注册表中的 130 仍然占用同一个位置,却不代表后续字节还能用 RFC 791 的 11 字节格式解析。解析器必须同时知道长度与所遵循的规范。

RFC 1038 把标签定位为可信组件的共同输入:验证源端传输是否适当、保证路径与目的地达到所需保护等级,并给计算机安全模型提供共同标签。但这些功能要求安全感知的路由和经过认可的组件,不能由首部中的数值单独兑现。

这次修订也只是过渡。RFC 1108 随后取代 RFC 1038,定义 DoD Basic 与 Extended Security Options。Basic 仍用 type 130,但最小长度再次变化:若 Protection Authority 字段缺席,最短可为三个八位组。

分级码故意不能按整数大小比较

RFC 1108 用一个八位组表示 Classification Level。有效码是分散的比特图案,分别对应 Top Secret、Secret、Confidential 和 Unclassified;其余一些列出的图案保留。

分级顺序由表格定义,而不是由数值大小定义。实现可以逐位判断某个值是否等于已分配码,却不能用普通整数区间判断它是否介于 Confidential 与 Secret 之间,因为那个数值区间会包含无效或未分配图案。

有效编码之间被设计为至少四位汉明距离。少量比特翻转不易把一个合法等级直接变成另一个合法等级。这是编码层面的检错距离,不是加密,也不是来源认证。故障或攻击者仍可写入一个结构上合法的码。

这种设计把政策顺序放在数字顺序之外。软件必须认识受控表,而不能凭字节大小猜测敏感度。

保护机构标志不是许可凭证

分类字节之后,RFC 1108 允许可变长度的 Protection Authority 字段。每个八位组前七位是机构标志,最低位表示后面是否还有一个八位组。一枚数据报可以同时受多个机构规则约束,最低合规实现必须能处理至少两个八位组的标志。

这些标志指向对信息保护规则负责的项目。RFC 1108 特别指出,尽管含义表面相似,它们并不是 accreditation authorities。它们不认证主机,也不向用户授予 clearance。

编码必须最小化,不得在末尾附加全零延续字节;延续位所表示的长度还必须与选项总长度吻合。结构错误不能被当成一串无害的未知徽章。

字段的可扩展性也揭示了数据包之外的权威:机构标志需要审批和公布。选项只是从受管理的命名空间里选取规则,并不创造规则。

每个接口都可能是一道分级边界

RFC 1108 描述了系统级与 per-port 参数。这里的 port 是网络接口或策略入口,不是 TCP/UDP 端口号。配置可以要求发出时带 BSO、接收时带 BSO、两者都要求,或都不要求。

处理分级数据的系统通常必须生成显式标签。例外是 dedicated 或 system-high 网络:整条网络可以根据接口赋予隐含标签,不必在每枚数据报里重复写入。若本地政策允许无 BSO 数据包,接收接口的 PORT-IMPLICIT-LABEL 就会补充语境。

这正是剥离风险的根源。同一枚无标签数据包,在一个接口上可能意味着普通 Unclassified,在另一个接口上却会被视作某个受保护等级。去掉显式标签不会产生中性的“空”,而会触发另一种标签来源。

输入处理先检查 classification 是否为已分配码,再检查它是否不高于入口最大等级,并判断 protection-authority flags 是否在入站许可集合内。输出处理则要求标签位于接口配置的最小与最大等级之间,机构标志也必须属于出站许可集合。

数据包提出标签值,接口提供可接受范围,准入来自二者比较。

错误响应同样受安全政策支配

若接口要求 BSO 却收到无标签数据报,RFC 1108 规定使用 ICMP Parameter Problem Code 1 表示缺少必需选项。畸形标签使用普通参数问题;超出范围则可能得到 Communication Administratively Prohibited 的不可达响应。

但这些只是规范允许的最宽松动作。局部政策可以要求记录、通知安全负责人,甚至禁止任何响应。错误回复离开哪个接口、以何种等级发出,本身也要接受安全范围控制。

这不能被泛化成“所有缺失的 IPv4 选项都如此处理”。此前关于 ICMP 缺失选项的文章研究的是错误语法;本篇只以此证明,type 130 曾是强制准入体系中的政策输入。

主机淘汰旧格式,路由器保留修订版

RFC 1122 宣布 RFC 791 与 RFC 1038 所描述的安全选项已经过时,并把 DoD 应用指向后来的 RFC 1108。它没有说所有带标签环境从此消失。

RFC 1812 把差异落实到路由器:旧版本已经过时,路由器却仍应实现 RFC 1108 的修订选项。面向多安全等级网络的路由器应根据 IPSO 标签过滤。

它设想每个接口可配置敏感度下限与上限。超出范围的数据包应被静默丢弃,并以计数器记录。这不是源路由,也不是路径清单;路由器在边界执行的是本地可接受性判断。

因此,标准状态不能被读成一次开关:一个格式过时,替代格式成为条件性路由器能力,RFC 后来进入 Historic,局部运行需要却仍能继续。

Historic 不等于不存在

RFC 7126 说,这类标签通常不应出现在全球公共互联网。它同时记录了关键例外:封闭的 multi-level-secure 网络会在商用和开源系统上使用 Basic 与 Extended Security Options。文档甚至判断,MLS 与 IPSO 的部署可能比 IESG 将其移出 Standards Track 时更多。

这与简单退役故事相反。一项机制可以退出公共标准主流,却在专门运行领域增长。Historic 描述 RFC 的标准地位,并不是“网络上零数据包”的测量,更不是删除登记值的命令。

同一型号路由器或防火墙可能安装在两种环境里。设备出厂时无法预知 type 130 是公网里无意义的异常,还是封闭网里不可缺的标签。默认值必须把最终判断留给了解部署的人。

默认保存,不等于默认信任

RFC 7126 的建议很精细:需要 BSO 的环境一旦遇到丢弃或剥离就会发生运行问题;不需要的环境仅仅携带选项,则不会因为其存在产生特定新危害。因此,默认配置不应修改或删除 BSO,也不应仅因数据包含有它而丢弃。

已知不使用 IPSO 的环境可以配置丢弃。设备还应能按接口记录 BSO 数量,并能按是否存在与具体值进行过滤。规则不是“公共互联网必须理解分级标签”,而是“通用设备不能在部署政策发言之前悄悄改写语义”。

原样传递也不等于相信标签。一个不解释选项的中间系统可以保存字节;真正的信任与准入仍由受控环境决定。

TCP 把这枚化石留在条件性附录里

现代 TCP 规范 RFC 9293 记录了这段尴尬继承。早期 TCP 逻辑曾把 IP security/compartment 信息纳入连接处理。到 2022 年,RFC 1108 已是 Historic,但 RFC 791 本身并未被更新为删除 Security Option。

RFC 9293 把余留讨论放进实现注释:security/compartment 对 MLS 实现者仍可能相关,非 MLS 实现则可以忽略。这种条件边界,比强迫两种环境采用同一行为更诚实。

文档还指出,因安全 compartment 或 precedence 不匹配而重置连接,曾被识别为潜在攻击向量。标签在完备信任模型里可以保护准入;机械套用旧跨层规则时,也可能变成中断表面。

一枚 type 130 到底能证明什么

抓包中出现 type 130,只能首先证明首部在一个历史分配的标签位置含有字节。长度与结构可以帮助判断发送端看起来遵循哪版规范。有效的 RFC 1108 classification 码和正确延续字段说明结构合规。

它们不能证明发送者的许可、标签真实性、载荷保密、路径受到保护或下一接口一定接纳。那些结论需要受保护的分配体系、可信设备、接口范围配置和真实网络证据。

反过来,标签缺席也不必然等于 Unclassified。启用隐含标签的接口会把缺席解释为本地指定等级。离开接口政策的抓包无法还原完整安全决定。

type 130 的长期教训并不是“安全都应写进 IP 首部”,而是删除元数据本身也是语义操作。当字段参与强制访问控制时,不理解接收环境就将其剥掉,可能比原样携带陌生选项更危险。

来源与证据边界

本文封闭证据集为 RFC 791、RFC 1038、RFC 1108、RFC 1122、RFC 1812、RFC 7126 与 RFC 9293。它们足以确定格式演变、处理模型、标准状态与条件性过滤建议;它们不披露机密网络,不测量当前流量,不证明厂商合规,也不能确认某枚实际数据包的标签为真。