
cve-2026-46331-Audit-Skript
Read-only-Audit-Skript für CVE-2026-46331 (auch bekannt als pedit COW) — ein Fehler bei partiellen Copy-on-Write-Vorgängen in der act_pedit-Action von net/sched im Linux-Kernel, der es einem lokalen unprivilegierten Benutzer ermöglicht, den Speicher des Page-Cache zu beschädigen und sich zu Root-Rechten zu eskalieren.
____ _____ ____ ___ _____ ____ _____ __
| _ \| ____| _ \_ _|_ _| / ___/ _ \ \ / /
| |_) | _| | | | | | | | | | | | | \ \ /\ / /
| __/| |___| |_| | | | | | |__| |_| |\ V V /
|_| |_____|____/___| |_| \____\___/ \_/\_/
CVE-2026-46331 net/sched act_pedit partial COW
tcf_pedit_act() berechnet den COW-Bereich für skb_ensure_writable() einmalig vor der Key-Schleife anhand von tcfp_off_max_hint. Typisierte Keys fügen einen Laufzeit-Header-Offset hinzu, den der Hint nicht abdeckt, sodass ein Teil des letztendlichen Schreibvorgangs außerhalb des COW-Bereichs landet. Ergebnis: Gemeinsam genutzte Page-Cache-Seiten werden beschrieben, und ein im Cache liegendes setuid-Binary (klassisches Ziel: /bin/su) kann im Speicher vergiftet werden. Die Hashes auf der Festplatte bleiben unverändert. Dateiintegritätsmonitore werden es nicht bemerken.
Dieselbe Fehlerfamilie wie Dirty COW (CVE-2016-5195), Dirty Pipe (CVE-2022-0847), Copy Fail (CVE-2026-31431) und Dirty Frag (CVE-2026-46300). Der Einstiegspunkt ist ein anderer, der Fehler bei der Seitenbesitzzuordnung ist derselbe.
| CVE | CVE-2026-46331 |
| Komponente | Linux-Kernel net/sched / act_pedit |
| Klasse | Partielles COW → Page-Cache-Korruption → LPE |
| Angriffsvektor | Lokal (CAP_NET_ADMIN, typischerweise über unprivilegierten userns erlangt) |
| Upstream betroffen | 5.18 .. 7.1-rc6 |
| Upstream-Fix | 7.1-rc7 |
| Öffentlicher PoC | packet_edit_meme (verifiziert auf RHEL 10, Debian 13, Ubuntu 24.04.4) |
| Red-Hat-Schweregrad | Important |
| SUSE CVSS 3.1 | 7.8 (AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H) |
Strikt schreibgeschützte Triage. Lädt niemals ein Modul, berührt niemals sysctl, führt niemals einen PoC aus. Entwickelt, um sicher auf Produktivsystemen ausgeführt werden zu können.
act_pedit anhand von vier unabhängigen Signalen:
lsmod)modinfo)/boot/config-$(uname -r), /proc/config.gz, modules.builtin)install ... /bin/true-Überschreibung in modprobe.d oder durch blacklist auf Kerneln, die act_pedit über seinen Alias net-act-pedit automatisch laden (6.9+; ältere Kernel fordern es per Namen an, was blacklist nicht verhindert)tc action pedit-Regeln auf (informativ; keine Änderungen).user.max_user_namespaces, kernel.unprivileged_userns_clone, user.max_net_namespaces und die Ubuntu-AppArmor-userns-Beschränkungen./etc/os-release (RHEL 8/9/10, Debian 11/12/13/14, Ubuntu 18.04→26.04, SUSE, Amazon Linux, Arch-Familie Rolling).auditd und journalctl (konfigurierbares Zeitfenster über --since und --until).PATCHED / NOT_APPLICABLE / MITIGATED / VULNERABLE / UNKNOWN.sudo ./cve-2026-46331-audit.sh # full text report
sudo ./cve-2026-46331-audit.sh --json # machine-readable JSON, no banner
sudo ./cve-2026-46331-audit.sh --quiet --no-hunt # one-line verdict for mass scans
sudo ./cve-2026-46331-audit.sh --since 2026-06-01 # widen IoC hunt window
sudo ./cve-2026-46331-audit.sh --since 2026-06-01 --until 2026-09-01 # bounded IoC window
sudo ./cve-2026-46331-audit.sh --no-banner # text report without the ASCII banner
./cve-2026-46331-audit.sh --version # print script version and exit
| Code | Bedeutung |
|---|---|
| 0 | PATCHED oder NOT_APPLICABLE (Kernel stammt von vor dem Fehler) |
| 1 | MITIGATED (Gegenmaßnahme aktiv, Kernel weiterhin anfällig, trotzdem patchen) |
| 2 | VULNERABLE (eine oder mehrere erforderliche Vorbedingungen erfüllt, kein fester Kernel) |
| 3 | UNKNOWN (in gemeinsam genutzten / CI- / Kubernetes-Kontexten als verdächtig behandeln) |
| 4 | ERROR (Skript konnte nicht ausgeführt werden; fehlende Tools oder fehlerhafte Umgebung) |
Siehe examples/sample-output.txt für einen vollständigen Lauf und examples/sample-output.json für die JSON-Form.
Die Bewertung ist eine gewichtete Kombination aus:
| Signal | Gewichtung |
|---|---|
Herstellerurteil VULNERABLE | +50 |
Herstellerurteil UNKNOWN | +30 |
act_pedit in den Kernel eingebaut | +25 |
act_pedit ladbar, keine Überschreibung | +20 |
act_pedit ladbar, Überschreibung oder Blacklist aktiv | +5 |
act_pedit derzeit geladen | +5 |
| Unprivilegierter userns+netns erreichbar, kein AppArmor-Gate | +15 |
| Unprivilegierter userns+netns erreichbar, AppArmor-Gate aktiv | +8 |
| IoCs im Hunt-Fenster gefunden | +10 |
Begrenzt auf 100. Alles über ~70 sollte auf Multi-Tenant- / CI- / Kubernetes-Knoten als dringend behandelt werden; unter ~20 ist in der Regel eine Bestätigung, dass der Host in Ordnung ist.
ansible -i inventory all -m script \
-a "cve-2026-46331-audit.sh --json --quiet --no-hunt" \
--become \
| tee /tmp/audit.jsonl
Dann mit jq aggregieren:
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
In der Reihenfolge der Präferenz. Das Skript empfiehlt die richtige basierend auf seinen Funden.
# Option 1: block act_pedit if you don't use it.
tc actions list action pedit # MUST be empty before doing this
# 1a) Hard block via modprobe install override (strongest).
echo 'install act_pedit /bin/true' | sudo tee /etc/modprobe.d/disable-act_pedit.conf
# 1b) `blacklist act_pedit` only stops the autoload on kernels 6.9+, which
# request the "net-act-pedit" alias. Older kernels load it by name and
# ignore the blacklist, so prefer 1a. Check your kernel:
modinfo -F alias act_pedit | grep -qx net-act-pedit && echo "blacklist works here"
lsmod | grep -q act_pedit && sudo rmmod act_pedit