CVE-2026-46331 pedit COW 页缓存提权
CVE-2026-46331 是 Linux 内核流量控制模块 net/sched 中 act_pedit 的本地提权漏洞。pedit 的 COW(copy-on-write)保护范围在进入 per-key 循环前预计算,而 typed key 的实际写入偏移会在运行时追加 header offset,导致写入越过 COW 保护区,落在共享的页缓存页上——与 CVE-2026-31431 Copy Fail 同属页缓存投毒类:磁盘哈希校验仍然通过,重启后自动还原。
该利用会破坏页缓存并触发内核流量控制路径,仅在授权实验环境复现,不要在生产系统运行 PoC。
概要
| 项目 | 内容 |
|---|---|
| CVE | CVE-2026-46331 |
| 组件 | Linux kernel net/sched act_pedit |
| 影响范围 | v5.18 ~ v7.1-rc6 |
| 修复 | v7.1-rc7 |
| 类型 | 页缓存破坏 / 本地提权 |
版本判定用 uname -a 比对内核版本区间即可,方法与 Copy Fail 的版本比对法一致。
根因:部分 COW
tcf_pedit_act() 在进入 per-key 循环之前,用 tcfp_off_max_hint 预计算 COW 范围并调用 skb_ensure_writable();而 typed key(TCP/UDP header edit)会在运行时追加 header offset,实际写入偏移超出 COW 保护范围。
后果是"部分 COW":待写的内存页没有被完整触发写时复制,写入直接落在共享的页缓存页上,污染了其他使用者看到的文件内容——磁盘文件本身不变。
利用链五步
unshare(CLONE_NEWUSER | CLONE_NEWNET)在用户命名空间内获得 CAP_NET_ADMIN。- 在 loopback 上配置 tc clsact qdisc + pedit filter,用 IHL key 膨胀 IP 头长度,使 TCP key 的写入偏移越界。
sendfile()把 setuid-root 二进制(如/bin/su)的页缓存页送进 socket buffer。- pedit 越界写入 shellcode,覆盖 ELF 入口——只改内存中的页缓存,磁盘文件不变。
execve("/bin/su")触发 shellcode:setgid(0); setuid(0); execve("/bin/sh")。
公开 exploit 的编译与执行
公开 exploit(如 GitHub 上的 packet_edit_meme 实现)静态编译后传输到目标执行:
make CC=gcc CFLAGS="-O2 -Wall -static"
静态编译避免目标缺少运行时依赖。
非交互会话注意:exploit 通过 execve 把自身进程替换成 root shell,在没有 TTY 的非交互 SSH 会话里,这个 shell 会立即退出。用 stdin 管道喂命令稳定拿输出:
echo "id; cat /root/root.txt" | ./packet_edit_meme
PIE 适配
/bin/su 为 PIE 时,第一个只读 LOAD 段在偏移 0,可执行段在 0x3000,超出 pedit 511 字节写入窗口能覆盖的范围。此时 exploit 走 PIE 适配路径:
- 给 PT_NOTE 对应 phdr 加
PF_X标志。 - shellcode 写入 PT_NOTE 区域。
- 改写入口跳转,让执行流落到 shellcode。
与 Copy Fail 的对比
| 维度 | CVE-2026-46331 pedit COW | CVE-2026-31431 Copy Fail |
|---|---|---|
| 关键组件 | act_pedit / tc | AF_ALG / algif_aead / splice |
| 能力来源 | 用户命名空间内 CAP_NET_ADMIN | 非特权 socket 操作 |
| 污染对象 | 页缓存(setuid 二进制入口) | 页缓存(4 字节受控写) |
| 磁盘影响 | 不变 | 不变 |
| 恢复方式 | 重启 / 缓存回收 | 重启 / 缓存回收 |
两者共同点:磁盘完整性校验(如 md5sum)依然通过,检测不能只看磁盘。
防御建议
- 升级至 v7.1-rc7 及以上或发行版修复版内核。
- 收紧非特权用户命名空间:设置
user.max_user_namespaces=0等缓解,阻断 CAP_NET_ADMIN 获取路径。 - 监控 setuid 二进制完整性:结合执行期完整性校验,而不是只依赖磁盘哈希。
- 审计非预期进程创建 tc qdisc / filter 的行为。
- 多用户与容器节点优先排期内核补丁,缩短暴露窗口。