01 BPFDoor 原理
前置知识
BPF
BPF 简介
Berkeley Packet Filter (BPF) 最早版本的 BPF 是 1990 年代由 Berkeley 大学开发,用于高效地从网络接口中抓包,主要用于工具如 tcpdump. 上世纪 90 年代初,tcpdump 这样的抓包工具已经很流行,但遇到了一个大问题: 性能差:当网卡收到大量数据包时,内核会把所有包都交给用户态的抓包程序去过滤。如果程序只想分析 TCP/80 包,那内核依然会把所有包传过去,剩下的在用户态做判断。这导致大量无用的数据拷贝和用户态 CPU 浪费。 结果就是,在高流量场景下,抓包工具根本跟不上网卡速率,会丢包严重。 BPF主要在内核态过滤数据包,把减少非必要的数据从内核态拷贝到用户态,减少开销
extended BPF (eBPF) 是 BPF 的现代增强版,功能大幅扩展,早已超越原始的网络包过滤用途。eBPF 兼容 BPF.
最初用途
抓包过滤(如 tcpdump)
内核级编程平台(网络、安全、追踪、监控等)
指令集
简单、少数指令
丰富、支持调用 helper 函数、更多寄存器
程序大小限制
很小(~4096 字节)
更大(~1M),允许复杂逻辑
执行上下文
网络包捕获
内核挂钩(kprobe、tracepoint、XDP、LSM 等)
安全机制
无
有:Verifier 校验程序安全性
编程语言支持
汇编
C(通过 LLVM)、bpftrace、Python(bcc)等
内核集成程度
较低
高度集成,可与多种内核子系统配合
数据交互
无 map、共享数据机制
有 map、ringbuf、perf buffer 等与用户空间交互机制
状态管理
无
支持持久状态(通过 BPF map)
BPF 原理
cBPF VM 架构
1、寄存器 cBPF(Classic BPF)架构非常简洁,只有 2 个 32 位寄存器:
A
Accumulator(累加器)
所有算术运算、比较、加载/存储操作主要在这个寄存器上进行
X
Index Register(索引寄存器)
作为辅助寄存器,用于索引访问、部分算术运算、条件跳转等
同时还有M[0..15]:16 个 32 位 scratch memory 槽(临时变量存储)
2、数据流: 数据包缓冲区 → 按需加载到 A / X → 运算 / 比较 → 最终返回匹配或丢弃
3、指令集:
加载 / 存储(LD, LDX, ST, STX)
算术(ADD, SUB, MUL, DIV, AND, OR, LSH, RSH)
跳转(JA, JEQ, JGT, JGE, JSET)
返回(RET)
杂项(TAX, TXA)
特点:寄存器极少,模型简单,只能访问数据包内容和 scratch memory。返回值只有两种:丢弃包 / 接收包(可指定最大长度)
BPF 应用
Classic BPF(cBPF)代码,用于创建一个 Linux 原始套接字的 BPF 数据包过滤器
IP 分片
当 IP 包大小超过路径某段链路的最大传输单元 (max transmission unit, MTU) 且允许分片(DF=0)时,IP 层就会进行分片。
IP 分片(Fragmentation) 是指:当一个 IP 包的大小(总长度)超过了沿途某段链路的 MTU(最大传输单元),就必须将这个包拆成多个碎片传输,以适应链路的最大包长限制。
IP 数据包会在满足 以下情况时发生分片(Fragmentation):
🚧 二、什么情况下会触发 IP 分片?
条件 1:IP 数据包长度 > 路径上的某个 MTU,常见 MTU:以太网默认是 1500 字节;
条件 2:该 IP 包允许分片(Don't Fragment = 0)。IP 报文头中的 Flags 字段有一位叫 DF(Don't Fragment):
要触发真正的“IP 分片”,两个条件都要满足:IP包长度 > MTU 且 DF=0 🧪 三、重组过程(目的端 IP 层完成):
收到分片后按 (srcIP, dstIP, protocol, identification) 分类 根据 Fragment Offset 把分片放回原始数据的位置 根据 MF=0 的最后一个分片确定总长度 检查所有字节都收到后,合并成原始 IP 包,交给上层协议(TCP/UDP/ICMP)
Identification
所有分片有相同的 ID,用于重组
Fragment Offset
分片偏移量(单位为 8 字节)
MF(More Fragments)
除最后一个分片外都设为 1,最后一个为 0
DF(Don't Fragment)
设置为 1 时不允许分片

IP 分片安全问题
攻击者可能利用分片:
绕过防火墙(IP分片重组后的 payload 被分散)
构造 overlapping fragments → 触发协议实现漏洞(Teardrop 攻击)
BPFDoor 类木马使用分片包绕过过滤器
BPFDoor 详细解析


最后更新于