网络层深度剖析:IPv4首部全字段解析与分片(Fragmentation)安全机制
网络层深度剖析:IPv4首部全字段解析与分片(Fragmentation)安全机制
在突破了局域网的 MAC 限制后,数据包的旅程进入了广阔的互联网。网络层(OSI 第三层)负责解决跨网段的寻址与路由问题。在这里,IP(Internet Protocol)协议是绝对的统治者。
IP 协议的设计初衷是“尽力而为(Best-Effort)”与“无连接”,它只负责将数据包从源端推向目的端,不保证顺序,也不保证到达。正是这种为了高效而牺牲严谨的设计,在网络层的报文首部与分片重组机制中,埋下了诸多深远的安全隐患。
1. IPv4 报文首部全字段硬核解析
一个标准的 IPv4 首部长度为 20 字节。在信息安全研究中,每一个字段都可以被攻击者操纵用于逃逸、探测或发起攻击。
💻 Wireshark 视角:真实的 IPv4 首部抓包 当你打开 Wireshark,随便点开一个 HTTP 请求的 IP 层,你会看到如下底层数据(这与下面的表格是一一对应的):
| 字段 | 长度 | 作用与底层逻辑 | 核心安全关联与渗透利用场景 |
|---|---|---|---|
| IHL (首部长度) | 4 bits | 指示 IP 首部的长度,以 4 字节为单位。标准为 5 (5x4=20字节)。 | IDS 逃逸:通过插入无意义的 IP Options 字段增加 IHL,可能导致某些编写不严谨的防火墙/IDS 无法正确定位上层(如 TCP)载荷,从而绕过检测。 |
| Total Length | 16 bits | 首部加数据载荷的总字节数(最大 65535)。 | 溢出漏洞:如果攻击者构造 Total Length 小于 IHL 的畸形包,或者发送超大载荷但 Total Length 虚报,可能导致接收端内核发生缓冲区溢出(如早期的 Ping of Death)。 |
| Identification | 16 bits | 用于标识属于同一个原始数据报的所有分片。 | 分片重组与隐蔽探测:操作系统生成此 ID 的算法(递增或随机)可用于操作系统指纹识别 (OS Fingerprinting),甚至被用于空闲扫描 (Idle Scan) 中的盲打探测。 |
| Flags | 3 bits | DF (Don’t Fragment) 和 MF (More Fragments)。 | MTU 探测与防火墙绕过:设置 DF 位可用于探测路径 MTU。设置 MF 位是发起分片攻击的前提。 |
| Fragment Offset | 13 bits | 指示当前分片在原始数据报中的位置(以 8 字节为单位)。 | Teardrop 攻击与 IDS 规避:网络层最危险的字段之一,下文将详细展开。 |
| TTL | 8 bits | 数据包在网络中的最大跳数,每经过一个路由器减 1,为 0 时丢弃并返回 ICMP 超时。 | 路由探测与指纹:不同的 OS 有不同的默认 TTL(Linux=64, Windows=128, Cisco=255),是判断目标系统类型的关键指标。 |
| Protocol | 8 bits | 指示上层协议的类型(TCP=6, UDP=17, ICMP=1)。 | 隐蔽信道:攻击者可以构造 Protocol 为非标准值的数据包,携带恶意指令穿透只检查常见端口的防火墙。 |
| Source IP | 32 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,不许分片) 标志位,来看看路由器的反应:
(解释:由于加上 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 分片中。- 不重组直接检测:每个分片只有几个字符,IDS 匹配不到任何恶意特征,直接放行。
- 重叠策略差异 (Insertion / Evasion):如果攻击者发送重叠的分片,IDS 的重组逻辑与目标主机的重组逻辑可能不一致。例如,IDS 采用“先到先得”保留了正常字符,认为流量无害并放行;而目标主机的内核采用“后到覆盖”保留了恶意字符,最终在目标主机上拼凑出了完整的恶意代码。
4. 总结与纵深防御
IPv4 首部的设计极其精巧,但其“只管发、不管验”的特性带来了诸多问题。特别是 IP 分片机制,其复杂的状态维护和重组逻辑,至今依然是高级威胁规避安全设备检测的常用手段。
针对网络层的纵深防御策略:
- 反 IP 欺骗:边界路由器严格执行 BCP38 规范,丢弃源 IP 明显伪造的数据包。
- 分片重组规范化 (Scrubbing):高级的下一代防火墙 (NGFW) 或 IPS 必须具备强大的碎片重组引擎(Fragment Reassembly),并在转发给内网主机前,对重叠、畸形分片进行“清洗 (Scrub)”,统一规范化输出,消除设备与主机之间的解析差异。