3 个 Linux 内核本地权限提升利用程序。与 Dirty COW 和 Dirty Pipe 相同的漏洞类别。数秒内获得 root shell。所有主流发行版均受影响。
这三个漏洞利用程序都会破坏内核的页缓存——即进程实际读取和执行的文件在内存中的副本。磁盘上的文件从未被修改。文件完整性工具不会发现任何异常。execve("/usr/bin/su") 从缓存加载 → 运行你的 shellcode → 获得 root。
| 漏洞利用程序 | CVE | 机制 | 获得 root 的时间 | 代码行数 |
|---|---|---|---|---|
| Dirty Pedit | CVE-2026-46331 | TC pedit 写时复制(COW)缺口(u32 回绕) | < 1 秒 | 275 |
| skb_shift | CVE-2026-43503 | TCP SACK 分片传输标志丢失 | ~10 秒 | 500 |
| GRO Flag Loss | CVE-2026-43503 | GRO 合并分片传输标志丢失 | ~10 秒 | 550 |
三个均为:非特权用户 → root。无需特殊权限。只需用户命名空间。
本仓库中的每个漏洞利用程序都遵循相同模式:
1. Get page-cache pages into a kernel buffer (splice)
2. Bypass the copy-on-write defense
3. Write in-place → read-only file corrupted in memory
区别在于防御是被如何绕过的,以及由谁执行写入:
| 漏洞利用程序 | 被绕过的防御 | 写入者 |
|---|---|---|
| Dirty Pedit | skb_ensure_writable(u32 回绕 → 部分 COW) | skb_store_bits(直接 4 字节写入) |
| skb_shift | TCP SACK 期间 SKBFL_SHARED_FRAG 标志丢失 | ESP AES-GCM 解密(每数据包 1 字节) |
| GRO Flag Loss | GRO 合并期间 SKBFL_SHARED_FRAG 标志丢失 | ESP AES-GCM 解密(每数据包 1 字节) |
2016 Dirty COW COW race via mmap + fork
2022 Dirty Pipe Stale PIPE_BUF_FLAG_CAN_MERGE in splice
2026 Copy Fail AF_ALG in-place AEAD on page-cache scatterlist
2026 Dirty Frag ESP skip_cow on splice'd frags (missing flag)
2026 Fragnesia skb_try_coalesce drops SHARED_FRAG flag
2026 Dirty Pedit ← TC pedit COW gap, no crypto needed
2026 skb_shift ← TCP SACK drops SHARED_FRAG, ESP writes
2026 GRO Flag Loss ← GRO merge drops SHARED_FRAG, ESP writes
| 漏洞利用程序 | 引入版本 | 修复版本 | 受影响发行版 |
|---|---|---|---|
| Dirty Pedit | v5.18(2022 年 5 月) | v7.1-rc7 | Ubuntu、RHEL、Debian、Fedora、SUSE |
| skb_shift | v3.9(2013) | v7.1-rc5 | 13 年来的所有发行版 |
| GRO Flag Loss | v3.9(2013) | v7.1-rc5 | 13 年来的所有发行版 |
默认配置即可。无需任何加固即存在漏洞。只要运行 Linux,你就在受影响范围内。
skb_shift 和 GRO 使用相同的利用技术:丢失 SKBFL_SHARED_FRAG 标志,然后借助预计算的 IV 查找表,让 ESP 加密以一次一个字节的方式对页缓存页进行 XOR 写入。
Dirty Pedit 则完全是另一回事:
skb_store_bits 精确写入你指定的字节。skb_ensure_writable。# Build all three
cd dirty_pedit && gcc -static -O2 -o exploit exploit.c && cd ..
cd skb_shift && gcc -static -O2 -o exploit exploit.c && cd ..
cd gro && gcc -static -O2 -o exploit exploit.c && cd ..
每个漏洞利用程序都是一个独立的单个 C 文件。除 libc 外没有其他依赖。
# Any of the three (as unprivileged user):
./exploit
# → root shell
要求:受影响版本范围内的 Linux 内核 + CONFIG_USER_NS=y(所有主流发行版默认开启)。
[*] Dirty Pedit — Local Privilege Escalation
[*] uid=1000 pid=42
[*] Victim line at offset 186: nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
[*] Injecting user 'a' (uid=0, no password) over victim line...
[+] User 'a' injected with uid=0!
[+] Running: su a
# id
uid=0(root) gid=0(root) groups=0(root)
[*] uid=1000 euid=1000
[*] IV table pre-computed (256 entries)
[*] Writing 192 bytes to /usr/bin/su...
[120] 0x00→0x48 ... OK
[121] 0x00→0x31 ... OK
[*] Write complete: 192/192
[!] /usr/bin/su page cache overwritten!
# whoami
root
| 特性 | Dirty Pedit | skb_shift | GRO |
|---|---|---|---|
| 所需权限 | 无(用户命名空间) | 无(用户命名空间) | 无(用户命名空间) |
| 文件访问 | O_RDONLY | O_RDONLY | O_RDONLY |
| 是否需要加密 | 否 | 是(AES-GCM) | 是(AES-GCM) |
| 写入控制 | 每数据包 4 字节 | 每数据包 1 字节 | 每数据包 1 字节 |
| 可靠性 | 确定性 | 确定性 | 概率性(可重试) |
| K8s 容器逃逸 | 否(无需 veth) | 否 | 是(veth+GRO 默认) |
| 攻击面 | geneve + TC | loopback + espintcp | veth + ESP-in-UDP |
所有漏洞均已通过负责任披露流程提交给 Linux 内核安全团队和网络维护者。补丁已合并到上游,并已向后移植到稳定分支。
899ee91156e548f6a5356a33这些漏洞利用程序在补丁可用后发布,仅供教育和防御目的使用。页缓存损坏只影响内存——重启或执行 echo 1 > /proc/sys/vm/drop_caches 即可恢复原始文件。
Rajat Gupta — Qualcomm 攻击性安全团队
MIT