网络层深度剖析:IPv4首部全字段解析与分片(Fragmentation)安全机制

网络层深度剖析:IPv4首部全字段解析与分片(Fragmentation)安全机制

在突破了局域网的 MAC 限制后,数据包的旅程进入了广阔的互联网。网络层(OSI 第三层)负责解决跨网段的寻址与路由问题。在这里,IP(Internet Protocol)协议是绝对的统治者。

IP 协议的设计初衷是“尽力而为(Best-Effort)”与“无连接”,它只负责将数据包从源端推向目的端,不保证顺序,也不保证到达。正是这种为了高效而牺牲严谨的设计,在网络层的报文首部与分片重组机制中,埋下了诸多深远的安全隐患。


1. IPv4 报文首部全字段硬核解析

一个标准的 IPv4 首部长度为 20 字节。在信息安全研究中,每一个字段都可以被攻击者操纵用于逃逸、探测或发起攻击。

💻 Wireshark 视角:真实的 IPv4 首部抓包 当你打开 Wireshark,随便点开一个 HTTP 请求的 IP 层,你会看到如下底层数据(这与下面的表格是一一对应的):

Internet Protocol Version 4, Src: 192.168.1.10, Dst: 8.8.8.8
    0100 .... = Version: 4
    .... 0101 = Header Length: 20 bytes (5)
    Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)
    Total Length: 60
    Identification: 0x1a2b (6699)
    Flags: 0x40, Don't fragment
        0... .... = Reserved bit: Not set
        .1.. .... = Don't fragment: Set
        ..0. .... = More fragments: Not set
    Fragment Offset: 0
    Time to Live: 64
    Protocol: ICMP (1)
    Header Checksum: 0x3f1c [validation disabled]
    Source Address: 192.168.1.10
    Destination Address: 8.8.8.8
字段长度作用与底层逻辑核心安全关联与渗透利用场景
IHL (首部长度)4 bits指示 IP 首部的长度,以 4 字节为单位。标准为 5 (5x4=20字节)。IDS 逃逸:通过插入无意义的 IP Options 字段增加 IHL,可能导致某些编写不严谨的防火墙/IDS 无法正确定位上层(如 TCP)载荷,从而绕过检测。
Total Length16 bits首部加数据载荷的总字节数(最大 65535)。溢出漏洞:如果攻击者构造 Total Length 小于 IHL 的畸形包,或者发送超大载荷但 Total Length 虚报,可能导致接收端内核发生缓冲区溢出(如早期的 Ping of Death)。
Identification16 bits用于标识属于同一个原始数据报的所有分片。分片重组与隐蔽探测:操作系统生成此 ID 的算法(递增或随机)可用于操作系统指纹识别 (OS Fingerprinting),甚至被用于空闲扫描 (Idle Scan) 中的盲打探测。
Flags3 bitsDF (Don’t Fragment) 和 MF (More Fragments)。MTU 探测与防火墙绕过:设置 DF 位可用于探测路径 MTU。设置 MF 位是发起分片攻击的前提。
Fragment Offset13 bits指示当前分片在原始数据报中的位置(以 8 字节为单位)。Teardrop 攻击与 IDS 规避:网络层最危险的字段之一,下文将详细展开。
TTL8 bits数据包在网络中的最大跳数,每经过一个路由器减 1,为 0 时丢弃并返回 ICMP 超时。路由探测与指纹:不同的 OS 有不同的默认 TTL(Linux=64, Windows=128, Cisco=255),是判断目标系统类型的关键指标。
Protocol8 bits指示上层协议的类型(TCP=6, UDP=17, ICMP=1)。隐蔽信道:攻击者可以构造 Protocol 为非标准值的数据包,携带恶意指令穿透只检查常见端口的防火墙。
Source IP32 bits发送端 IP。IP 欺骗 (IP Spoofing):IP 协议不验证源 IP 真实性,这是所有反射型 DDoS 攻击的根源。

2. 深入理解 IP 分片 (Fragmentation) 机制

2.1 为什么需要分片?

网络链路的物理特性决定了它单次能传输的数据帧大小是有限的,这个限制称为 MTU(最大传输单元,Maximum Transmission Unit),以太网的标准 MTU 为 1500 字节。 当上层传递下来的数据报(如一个 3000 字节的 UDP 包)大于 MTU 时,路由器必须在网络层将该 IP 数据报“切碎”,由最终的目的主机进行重组。

💻 日常接触:如何利用 Ping 探测 MTU 并触发分片? 在日常排障或踩点时,我们可以使用 ping 命令强行发送一个大于 MTU 的包,并设置 DF (Don’t Fragment,不许分片) 标志位,来看看路由器的反应:

# Windows 下发送 1500 字节的 ICMP 载荷,并强制设置 DF 标志 (-f)
C:\> ping 8.8.8.8 -f -l 1500
正在 Ping 8.8.8.8 具有 1500 字节的数据:
需要拆分数据包但是设置 DF。
需要拆分数据包但是设置 DF。

(解释:由于加上 IP 首部后超过了 1500 的 MTU,而我们又要求不许分片,路由器只好丢弃该包并返回一个 ICMP 错误提示,这就是黑客探测路径真实 MTU 的常用手法。)

2.2 分片重组的内核逻辑

目的主机的内核在收到分片时,会开辟一块内存缓冲区,将具有相同 Identification 的分片暂存。它根据 Fragment Offset 将分片排列,直到收到 MF=0 的分片,且通过 Offset + Length 计算出数据是连续的,才会将其重组为一个完整的包。


3. 基于 IP 分片的经典攻击与逃逸

正常情况下,Offset 和 Length 是严格计算的。但如果攻击者故意构造重叠或缺失的分片呢?这就引发了网络层最经典的漏洞。

3.1 操作系统崩溃:Teardrop (泪滴) 攻击

在 90 年代末,一种名为 Teardrop 的攻击摧毁了无数的 Windows 和 Linux 服务器。

  • 攻击原理: 攻击者发送两个 IP 分片,故意把第二个分片的 Offset 设置得非常小,使其与第一个分片的数据发生重叠
    • 分片 1:Offset = 0,Length = 100
    • 分片 2:Offset = 50,Length = 100 (正常情况 Offset 应该是 100)
  • 内核灾难: 早期的操作系统在处理重叠分片时,计算需要复制的内存大小时出现了负数,强制转换为无符号整数后变成了天文数字。内核尝试执行如此巨大的内存拷贝(memcpy),直接导致蓝屏崩溃(BSOD)。

3.2 安全设备致盲:IDS/防火墙分片逃逸

虽然现代 OS 修复了该漏洞,但分片机制成为了绕过入侵检测系统 (IDS) 和 WAF 的利器。

  • 逃逸原理: 如果攻击者将一段恶意载荷 <script>alert(1)</script> 极其细碎地切分到 5 个 IP 分片中。
    1. 不重组直接检测:每个分片只有几个字符,IDS 匹配不到任何恶意特征,直接放行。
    2. 重叠策略差异 (Insertion / Evasion):如果攻击者发送重叠的分片,IDS 的重组逻辑与目标主机的重组逻辑可能不一致。例如,IDS 采用“先到先得”保留了正常字符,认为流量无害并放行;而目标主机的内核采用“后到覆盖”保留了恶意字符,最终在目标主机上拼凑出了完整的恶意代码。

4. 总结与纵深防御

IPv4 首部的设计极其精巧,但其“只管发、不管验”的特性带来了诸多问题。特别是 IP 分片机制,其复杂的状态维护和重组逻辑,至今依然是高级威胁规避安全设备检测的常用手段。

针对网络层的纵深防御策略

  1. 反 IP 欺骗:边界路由器严格执行 BCP38 规范,丢弃源 IP 明显伪造的数据包。
  2. 分片重组规范化 (Scrubbing):高级的下一代防火墙 (NGFW) 或 IPS 必须具备强大的碎片重组引擎(Fragment Reassembly),并在转发给内网主机前,对重叠、畸形分片进行“清洗 (Scrub)”,统一规范化输出,消除设备与主机之间的解析差异。