CVE-2026-46331(又名 pedit COW)的只读审计脚本——Linux 内核 net/sched act_pedit 操作中的部分写时复制(partial copy-on-write)漏洞,允许本地非特权用户破坏页缓存内存并提权至 root。
____ _____ ____ ___ _____ ____ _____ __
| _ \| ____| _ \_ _|_ _| / ___/ _ \ \ / /
| |_) | _| | | | | | | | | | | | | \ \ /\ / /
| __/| |___| |_| | | | | | |__| |_| |\ V V /
|_| |_____|____/___| |_| \____\___/ \_/\_/
CVE-2026-46331 net/sched act_pedit 部分写时复制
tcf_pedit_act() 在进入键循环之前,使用 tcfp_off_max_hint 计算 skb_ensure_writable() 的 COW 范围。带类型的键会在运行时增加 hint 未覆盖的首部偏移,导致部分写操作落在 COW 区域之外。结果:共享页缓存页面被篡改,内存中的 setuid 二进制(经典目标:/bin/su)可以被污染。磁盘上的哈希保持不变。文件完整性监控将无法察觉。
与 Dirty COW (CVE-2016-5195)、Dirty Pipe (CVE-2022-0847)、Copy Fail (CVE-2026-31431)、Dirty Frag (CVE-2026-46300) 同属一类漏洞家族。入口点不同,页面所有权失效的机制相同。
严格只读的排查工具。从不加载模块、从不触碰 sysctl、从不执行 PoC。设计为可在生产环境中安全运行。
act_pedit 的可达性:
lsmod)modinfo)/boot/config-$(uname -r)、/proc/config.gz、modules.builtin)blacklist 或 modprobe.d 中的 install ... /bin/true 覆盖所阻止tc action pedit 规则(仅供信息参考;不做任何更改)。user.max_user_namespaces、kernel.unprivileged_userns_clone,以及 Ubuntu AppArmor 用户命名空间限制。/etc/os-release 提供启发式供应商补丁矩阵(RHEL 8/9/10、Debian 11/12/13/14、Ubuntu 18.04→26.04、SUSE、Amazon Linux、Arch 家族滚动版)。sudo ./cve-2026-46331-audit.sh # 完整文本报告
sudo ./cve-2026-46331-audit.sh --json # 机器可读 JSON,无横幅
sudo ./cve-2026-46331-audit.sh --quiet --no-hunt # 一行判定,用于大规模扫描
sudo ./cve-2026-46331-audit.sh --since 2026-06-01 # 扩大 IoC 搜索时间窗口
sudo ./cve-2026-46331-audit.sh --no-banner # 文本报告但不显示 ASCII 横幅
参见 examples/sample-output.txt 了解完整运行结果,以及 examples/sample-output.json 查看 JSON 格式。
分数是以下因素的加权组合:
上限为 100。高于约 70 的分数应在多租户/CI/Kubernetes 节点上视为紧急;低于约 20 通常表明主机状况良好。
ansible -i inventory all -m script \
-a "cve-2026-46331-audit.sh --json --quiet --no-hunt" \
--become \
| tee /tmp/audit.jsonl
然后使用 jq 汇总:
grep -v '^[a-z]' /tmp/audit.jsonl | jq -s 'group_by(.verdict) | map({verdict: .[0].verdict, hosts: length})'
- name: audit CVE-2026-46331
ansible.builtin.script: cve-2026-46331-audit.sh --quiet --no-hunt
register: audit
failed_when: audit.rc == 2
changed_when: false
按优先顺序排列。脚本会根据检测结果推荐合适的措施。
# 选项 1:如果不使用 act_pedit,则阻止它。
tc actions list action pedit # 执行前必须为空
echo 'install act_pedit /bin/true' | sudo tee /etc/modprobe.d/disable-act_pedit.conf
lsmod | grep -q act_pedit && sudo rmmod act_pedit
# 选项 2:限制无特权用户命名空间。
# 这将破坏 Rootless Podman/Docker、浏览器沙箱、Flatpak、无特权的 unshare、部分 CI 沙箱。
sudo sysctl -w user.max_user_namespaces=0 # EL 系列
sudo sysctl -w kernel.unprivileged_userns_clone=0 # Debian/Ubuntu
真正的修复方案是安装供应商提供的内核更新并重启。重启后的 uname -r 是唯一有效的证明。
这是同一架构缺陷的第五次出现。每一次都修复了直接原因,但没有修复根本原因:零拷贝快速路径在所有权边界之间共享页面,每个写入者在修改字节之前都必须证明页面的专有性,而这类调用点有数百个。
Rust 在内核中的实现正是通过所有权类型解决了此类问题。但这不会很快出现在 net/sched 中。
MIT。参见 LICENSE。
仅供在您拥有或明确获准审计的系统上作为授权防御用途使用。该脚本从不执行公开的 PoC、从不修改系统状态、从不加载模块。请将判定结果视为初步排查,而非已被入侵或安全的证明。
| CVE | CVE-2026-46331 |
| 组件 | Linux 内核 net/sched / act_pedit |
| 分类 | 部分 COW → 页缓存破坏 → LPE |
| 攻击向量 | 本地(CAP_NET_ADMIN,通常通过无特权用户命名空间获取) |
| 上游受影响版本 | 5.18 .. 7.1-rc6 |
| 上游修复版本 | 7.1-rc7 |
| 公开 PoC | packet_edit_meme(已验证 RHEL 10、Debian 13、Ubuntu 24.04.4) |
| Red Hat 严重性 | 重要 |
| SUSE CVSS 3.1 | 7.8 (AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H) |
auditd 和 journalctl(可通过 --since 配置时间窗口)。PATCHED / NOT_APPLICABLE / MITIGATED / VULNERABLE / UNKNOWN。| 退出码 | 含义 |
|---|
| 0 | PATCHED 或 NOT_APPLICABLE(内核版本早于该漏洞) |
| 1 | MITIGATED(缓解措施已生效,但内核仍有漏洞,建议打补丁) |
| 2 | VULNERABLE(满足一个或多个必要前置条件,且未安装修复内核) |
| 3 | UNKNOWN(在多租户/CI/Kubernetes 环境中视为可疑) |
| 4 | ERROR(脚本无法运行;缺少工具或环境错误) |
| 信号 | 权重 |
|---|
供应商判定为 VULNERABLE | +50 |
供应商判定为 UNKNOWN | +30 |
act_pedit 内置于内核 | +25 |
act_pedit 可加载且无覆盖 | +20 |
act_pedit 可加载但有覆盖生效 | +5 |
act_pedit 当前已加载 | +5 |
| 无特权用户命名空间可达且无 AppArmor 门控 | +15 |
| 无特权用户命名空间可达但有 AppArmor 门控生效 | +8 |
| 在搜索窗口中发现 IoC | +10 |
| CVE | 年份 | 子系统 | 原语 |
|---|
| CVE-2016-5195 | 2016 | mm | 只读映射上的 COW 竞争 |
| CVE-2022-0847 | 2022 | pipe / splice | pipe_buffer 标志泄漏至页缓存 |
| CVE-2026-31431 | 2026 | crypto AF_ALG/AEAD | 对只读文件缓存的原地加密 |
| CVE-2026-46300 | 2026 | XFRM ESP-in-TCP | skbuff 共享分片标志丢失 |
| CVE-2026-46331 | 2026 | net/sched act_pedit | 由运行时解析的类型化键偏移导致的部分 COW |