引言:当"确定性"成为噩梦
2026年5月7日,安全研究员 Hyunwoo Kim (@v4bel) 公开披露了 Dirty Frag ——一个影响几乎所有主流Linux发行版的本地提权(LPE)漏洞链。这个漏洞的特殊之处在于:它是确定性的,不像 Dirty Cow 需要竞争条件,也不像 Dirty Pipe 对写入方式有诸多限制。在几乎任何主流Linux发行版上,攻击者都可以100%稳定地获取root权限。
更令运维人员寝食难安的是:即使你已经在5月初修复了 Copy Fail (CVE-2026-31431),系统仍然会受到 Dirty Frag 的威胁——因为它利用的是完全不同的代码路径。
本文将深入剖析 Dirty Frag 的技术原理、两个CVE的协同攻击机制、对Kubernetes集群的实际影响,以及生产环境下的修复与防护方案。
一、漏洞概述与时间线
1.1 漏洞基本信息
Dirty Frag 实际上是一个漏洞链,由两个独立的CVE组成:
| CVE | 影响子系统 | 写入原语 | CVSS | 关键特点 |
|---|
| CVE-2026-43284 | XFRM/ESP (IPsec) | 4字节写入 (seq_hi) | 7.8 (高危) | 需用户命名空间权限 |
| CVE-2026-43500 | RxRPC | 8字节写入 | 待定 | 无需特殊权限 |
1.2 披露时间线
- • 2026年4月30日:研究人员向Linux内核维护团队报告漏洞
- • 2026年5月7日:原定 embargo 日期,但技术细节被提前泄露
- • 2026年5月8日:PoC (漏洞利用代码) 和完整技术分析发布于 GitHub V4bel/dirtyfrag[1]
- • 2026年5月:各大Linux发行版开始发布安全公告和补丁
1.3 与同类漏洞的对比
Dirty Frag 属于与 Dirty Pipe、Copy Fail 同源的"页缓存写入"漏洞家族:
| 漏洞 | 披露时间 | 污染目标 | 写入原语 | 稳定性 |
|---|
| Dirty Pipe (CVE-2022-0847) | 2022年3月 | struct pipe_buffer | 任意字节 | 需竞争条件 |
| Copy Fail (CVE-2026-31431) | 2026年4月 | AF_ALG TX/RX SGL | 4字节 | 确定性 |
| Dirty Frag (ESP) | 2026年5月 | sk_buff frags | 4字节 (seq_hi) | 确定性 |
| Dirty Frag (RxRPC) | 2026年5月 | sk_buff frags | 8字节 | 确定性 |
二、技术原理深度剖析
2.1 核心攻击向量:splice与页缓存
理解 Dirty Frag 的关键在于理解 Linux 内核的 splice() 系统调用和页缓存机制:
splice() 是一个零拷贝数据传输机制,允许在两个文件描述符之间直接移动数据
而不需要将数据复制到用户空间
页缓存是Linux内核用于缓存磁盘数据的内存区域
当数据被读取时,内核会将其保存在页缓存中供后续访问使用
关键发现:splice 可以将一个文件的页缓存页引入到内核的另一个数据结构(sk_buff)中。当内核对这个"共享页"执行原地加密/解密操作时,实际上是在修改原始文件的页缓存!
2.2 CVE-2026-43284:ESP变体详解
漏洞根因
esp_input() 函数在处理非线性 sk_buff 时,跳过了 COW (Copy-On-Write) 保护:
// net/ipv4/esp4.c - esp_input()
if (!skb_cloned(skb)) {
if (!skb_is_nonlinear(skb)) {
goto skip_cow; // [1] 线性 skb:跳过
} else if (!skb_has_frag_list(skb)) {
nfrags = skb_shinfo(skb)->nr_frags;
goto skip_cow; // [2] ← 漏洞点:非线性但无 frag_list 也跳过!
}
}
// 正常流程应该执行 COW...
攻击链
- 1. 攻击者通过 splice 将目标文件的页缓存页引入 sk_buff 的 frag 区域
- 2. 配置 IPsec ESP SA (Security Association),设置 ESN (Extended Sequence Number) 的
seq_hi 为攻击者可控值 - 3.
crypto_authenc_esn_decrypt() 对共享页执行原地解密,将 seq_hi 写入页缓存
scatterwalk_map_and_copy(tmp + 1, dst, assoclen + cryptlen, 4, 1);
// ← 4字节 STORE 到页缓存页(攻击者完全可控)
写入原语
- • 写入位置:任意文件的页缓存(通过 splice 控制)
- • 写入值:由攻击者在 SA 配置中直接控制(
seq_hi) - • 所需权限:需要
CAP_NET_ADMIN(用户命名空间内)
2.3 CVE-2026-43500:RxRPC变体详解
漏洞根因
rxkad_verify_packet_1() 对数据包前8字节执行原地解密:
// net/rxrpc/rxkad.c
skb_to_sgvec(skb, sg, sp->offset, 8); // frag → SGL
skcipher_request_set_crypt(req, sg, sg, 8, iv.x); // src == dst(原地操作!)
crypto_skcipher_decrypt(req); // 8字节 STORE 到页缓存
写入值控制
写入值是 fcrypt_decrypt(C, K) 的结果,攻击者可以通过 add_key("rxrpc", ...) 注册恶意密钥。由于加密算法的特性,攻击者可以暴力搜索使解密结果等于期望值。
关键优势
无需特殊权限! Ubuntu 默认加载 rxrpc.ko,普通用户即可触发此漏洞。
2.4 漏洞链组合:确定性root提权
两个漏洞的协同攻击流程:
┌─────────────────────────────────────────────────────────────────┐
│ Dirty Frag 攻击链 │
├─────────────────────────────────────────────────────────────────┤
│ Step 1: 使用 RxRPC 变体创建用户命名空间(无需特殊权限) │
│ ↓ │
│ Step 2: 在命名空间内获取 CAP_NET_ADMIN 能力 │
│ ↓ │
│ Step 3: 使用 ESP 变体向 /etc/passwd 等特权文件写入数据 │
│ ↓ │
│ Step 4: 添加 root 用户 或 修改 /etc/sudoers │
│ ↓ │
│ Step 5: 获得完全 root 权限! │
└─────────────────────────────────────────────────────────────────┘
三、影响范围评估
3.1 内核版本
| 变体 | 影响版本范围 | 引入时间 | 存在时间 |
|---|
| ESP (CVE-2026-43284) | Linux 4.10 ~ 7.0 | 2017年1月 | 约9年 |
| RxRPC (CVE-2026-43500) | Linux 6.4 ~ 7.0 | 2023年6月 | 约3年 |
3.2 确认受影响的发行版
| 发行版 | 内核版本 | 状态 |
|---|
| Ubuntu 24.04.4 | 6.17.0-23-generic | 已验证 |
| RHEL 10.1 | 6.12.0-124.49.1.el10_1.x86_64 | 已验证 |
| openSUSE Tumbleweed | 7.0.2-1-default | 已验证 |
| CentOS Stream 10 | 6.12.0-224.el10.x86_64 | 已验证 |
| AlmaLinux 10 | 6.12.0-124.52.3.el10_1.x86_64 | 已验证 |
| Fedora 44 | 6.19.14-300.fc44.x86_64 | 已验证 |
3.3 攻击条件对比
| 条件 | ESP变体 | RxRPC变体 |
|---|
| 用户命名空间权限 | 需要 | 不需要 |
esp4/esp6 模块 | 普遍存在 | - |
rxrpc.ko 模块 | - | 仅Ubuntu默认加载 |
| AppArmor限制 | 不可用 | 可用 |
四、对Kubernetes集群的实际威胁
4.1 攻击场景
在Kubernetes环境中,Dirty Frag 的典型攻击路径:
容器内普通用户
↓ (利用 RxRPC 变体,无需特殊权限)
创建用户命名空间
↓
获取 CAP_NET_ADMIN 能力
↓ (利用 ESP 变体)
写入宿主机的 /etc/passwd 或 SSH authorized_keys
↓
宿主机 root shell
↓
逃逸到其他 Pod / 窃取集群 secrets
4.2 受影响组件
- • Kubelet 运行节点:所有使用受影响内核版本的Linux节点
- • K8s 控制平面节点:如果控制平面组件运行在特权容器中
- • 使用 hostPath 或本地存储的 Pod:更容易被攻击者修改文件
4.3 风险评估
| 场景 | 风险等级 | 说明 |
|---|
| 未打补丁的K8s节点 | 极高 | 可直接获取宿主机root权限 |
| 已修复Copy Fail但未修复Dirty Frag | 高 | 仍有被攻击风险 |
| 启用CIS基准加固的集群 | 中-高 | 可降低风险但不能完全免疫 |
| 托管K8s服务 (GKE/EKS/AKS) | 待定 | 取决于云厂商内核更新速度 |
五、修复与缓解方案
5.1 内核升级(推荐)
| 内核版本线 | 首个修复版本 |
|---|
| 6.6.x LTS | 6.6.138 |
| 6.12.x LTS | 6.12.87 |
| 6.18.x LTS | 6.18.28 |
| 7.0.x | 7.0.5 |
检查当前内核版本:
uname -r
# 示例输出: 6.8.0-45-generic
5.2 临时缓解措施
如果无法立即升级内核,可以禁用受影响的内核模块:
# 创建黑名单配置
cat > /etc/modprobe.d/dirtyfrag.conf << 'EOF'
install esp4 /bin/false
install esp6 /bin/false
install rxrpc /bin/false
EOF
# 卸载已加载的模块(如果安全的话)
rmmod esp4 esp6 rxrpc 2>/dev/null
# 清除页缓存(重要!防止已污染的页缓存被利用)
echo 3 > /proc/sys/vm/drop_caches
⚠️ 警告:禁用 ESP 模块会影响 IPsec 功能,可能导致:
- • VPN 连接失败
- • Kubernetes CNI 插件(如 Calico IPIP 模式)异常
- • WireGuard 隧道中断
请在测试环境中验证后再生产部署!
5.3 Kubernetes层面防护
限制容器能力
确保 Pod 安全上下文限制了危险能力:
apiVersion: v1
kind: Pod
metadata:
name: secure-app
spec:
securityContext:
runAsNonRoot: true
seccompProfile:
type: RuntimeDefault
containers:
- name: app
image: nginx
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
启用 AppArmor 或 SELinux
Ubuntu 系统上确保 AppArmor 处于 enforcing 模式:
# 检查 AppArmor 状态
sudo aa-status
# Expected: apparmor module is loaded.
# 确保 nginx 配置文件存在
ls /etc/apparmor.d/
NetworkPolicy 隔离
使用网络策略限制 Pod 间通信,减少攻击面:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
5.4 检测与监控
检查是否存在攻击痕迹
# 检查是否有可疑的 splice() 调用(需要审计配置)
ausearch -k dirtyfrag 2>/dev/null
# 检查系统日志中的异常
journalctl -k | grep -i "esp\|xfrm\|rxrpc" | tail -50
# 检查是否有新增的 root 用户
cat /etc/passwd | grep -E "^(.*:){2}0:"
Prometheus 告警规则
groups:
- name: dirtyfrag-detection
rules:
# 检测异常的 splice 系统调用(需要审计)
- alert: SuspiciousSpliceActivity
expr: rate(node_syscalls{syscall="splice"}[5m]) > 1000
for: 5m
labels:
severity: high
annotations:
summary: "High rate of splice() system calls detected"
description: "Possible exploitation of Dirty Frag vulnerability"
# 检测页缓存异常修改
- alert: PageCacheCorruption
expr: rate(node_memory_NfsUnstable[5m]) > 0
for: 2m
labels:
severity: critical
annotations:
summary: "Unstable NFS memory detected - possible cache poisoning"
六、生产环境修复Checklist
紧急响应阶段(0-24小时)
- • [ ] 评估受影响节点范围
- • [ ] 确认当前内核版本与漏洞版本匹配
- • [ ] 准备内核升级方案或临时缓解措施
- • [ ] 在测试环境验证缓解措施的影响
修复阶段(24-72小时)
- • [ ] 安排维护窗口进行内核升级
- • [ ] 执行内核升级并验证服务正常运行
- • [ ] 部署 Kubernetes Pod 安全策略
- • [ ] 确认 IPsec/WireGuard 等功能正常
长期加固(1周内)
- • [ ] 配置内核模块自动黑名单
- • [ ] 部署审计规则检测可疑活动
- • [ ] 更新 Prometheus 告警规则
- • [ ] 进行红队演练验证防护有效性
七、总结
Dirty Frag 的披露再次提醒我们:内核漏洞不会因为你打了一个补丁就消失。作为一个与 Copy Fail 同源但触发路径不同的漏洞类,Dirty Frag 证明了Linux内核页缓存写入类漏洞的广泛性和持续性。
对于Kubernetes运维人员:
- 1. 不要依赖单一补丁:定期关注内核安全更新,建立多层防护体系
- 2. 理解容器边界的脆弱性:容器并不是真正的隔离,特别是涉及用户命名空间和Linux能力时
- 3. 纵深防御是关键:内核安全 + Pod安全策略 + 网络隔离 + 监控告警,缺一不可
Dirty Frag 的 PoC 已经公开,攻击门槛大幅降低。建议所有K8s管理员立即评估并修复,不要等到被攻击后才后悔。
参考资料
- • Dirty Frag GitHub PoC[1]
- • Tenable: Dirty Frag CVE-2026-43284 FAQ[2]
- • Red Hat Security Bulletin RHSB-2026-003[3]
- • Linux Kernel Patch[4]
关于作者:WAKE UP技术,专注Kubernetes与云原生技术干货分享。关注我,一起探索云原生的无限可能!
引用链接
[1] GitHub V4bel/dirtyfrag: https://github.com/V4bel/dirtyfrag
[2] Tenable: Dirty Frag CVE-2026-43284 FAQ: https://www.tenablecloud.cn/blog/dirty-frag-cve-2026-43284-cve-2026-43500-frequently-asked-questions-linux-kernel-lpe
[3] Red Hat Security Bulletin RHSB-2026-003: https://access.redhat.com/security/vulnerabilities/RHSB-2026-003
[4] Linux Kernel Patch: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=f4c50a4034e62ab75f1d5cdd191dd5f9c77fdff4