
Script d'audit cve-2026-46331
Script d'audit en lecture seule pour CVE-2026-46331 (aussi appelé pedit COW) — une faille de copie sur écriture partielle dans l'action act_pedit de net/sched du noyau Linux qui permet à un utilisateur local non privilégié de corrompre la mémoire du cache de pages et d'élever ses privilèges jusqu'à root.
____ _____ ____ ___ _____ ____ _____ __
| _ \| ____| _ \_ _|_ _| / ___/ _ \ \ / /
| |_) | _| | | | | | | | | | | | | \ \ /\ / /
| __/| |___| |_| | | | | | |__| |_| |\ V V /
|_| |_____|____/___| |_| \____\___/ \_/\_/
CVE-2026-46331 net/sched act_pedit partial COW
tcf_pedit_act() calcule la plage COW pour skb_ensure_writable() une seule fois avant la boucle sur les clés, en utilisant tcfp_off_max_hint. Les clés typées ajoutent un décalage d'en-tête à l'exécution que l'indice ne couvre pas, de sorte qu'une partie de l'écriture finale se produit en dehors de la région COW. Résultat : les pages partagées du cache de pages sont écrasées, et un binaire setuid mis en cache (cible classique : /bin/su) peut être empoisonné en mémoire. Les hachages sur disque restent intacts. Les moniteurs d'intégrité des fichiers ne le verront pas.
Même famille de bugs que Dirty COW (CVE-2016-5195), Dirty Pipe (CVE-2022-0847), Copy Fail (CVE-2026-31431) et Dirty Frag (CVE-2026-46300). Le point d'entrée est différent, la défaillance de propriété des pages est la même.
| CVE | CVE-2026-46331 |
| Composant | Noyau Linux net/sched / act_pedit |
| Classe | COW partiel → corruption du cache de pages → LPE |
| Vecteur d'attaque | Local (CAP_NET_ADMIN, généralement acquis via un userns non privilégié) |
| Affecté en amont | 5.18 .. 7.1-rc6 |
| Correctif en amont | 7.1-rc7 |
| PoC public | packet_edit_meme (vérifié sur RHEL 10, Debian 13, Ubuntu 24.04.4) |
| Sévérité Red Hat | Important |
| CVSS 3.1 SUSE | 7.8 (AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H) |
Triage strictement en lecture seule. Ne charge jamais de module, ne touche jamais à sysctl, n'exécute jamais de PoC. Conçu pour être sûr à exécuter en production.
act_pedit via quatre signaux indépendants :
lsmod)modinfo)/boot/config-$(uname -r), /proc/config.gz, modules.builtin)install ... /bin/true dans modprobe.d, ou par blacklist sur les noyaux qui chargent automatiquement act_pedit via son alias net-act-pedit (6.9+ ; les noyaux plus anciens le demandent par son nom, ce que blacklist n'arrête pas)tc action pedit existantes (à titre informatif ; aucune modification).user.max_user_namespaces, kernel.unprivileged_userns_clone, user.max_net_namespaces, et les restrictions userns AppArmor d'Ubuntu./etc/os-release (RHEL 8/9/10, Debian 11/12/13/14, Ubuntu 18.04→26.04, SUSE, Amazon Linux, famille Arch en rolling release).auditd et journalctl (fenêtre configurable via --since et --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 | Signification |
|---|---|
| 0 | PATCHED ou NOT_APPLICABLE (le noyau est antérieur au bug) |
| 1 | MITIGATED (atténuation active, le noyau reste vulnérable, appliquez le correctif malgré tout) |
| 2 | VULNERABLE (une ou plusieurs préconditions requises sont remplies, aucun noyau corrigé) |
| 3 | UNKNOWN (à considérer comme suspect dans les contextes mutualisés / CI / Kubernetes) |
| 4 | ERROR (le script n'a pas pu s'exécuter ; outils manquants ou environnement défaillant) |
Voir examples/sample-output.txt pour une exécution complète, et examples/sample-output.json pour la forme JSON.
Le score est une combinaison pondérée de :
| Signal | Poids |
|---|---|
Verdict du fournisseur VULNERABLE | +50 |
Verdict du fournisseur UNKNOWN | +30 |
act_pedit intégré au noyau | +25 |
act_pedit chargeable, sans override | +20 |
act_pedit chargeable, override ou blacklist actif | +5 |
act_pedit actuellement chargé | +5 |
| userns+netns non privilégiés accessibles, sans barrière AppArmor | +15 |
| userns+netns non privilégiés accessibles, barrière AppArmor active | +8 |
| IoC trouvés dans la fenêtre de chasse | +10 |
Plafonné à 100. Tout ce qui dépasse ~70 doit être traité comme urgent sur les nœuds multi-tenant / CI / Kubernetes ; en dessous de ~20, c'est généralement une confirmation que l'hôte est sain.
ansible -i inventory all -m script \
-a "cve-2026-46331-audit.sh --json --quiet --no-hunt" \
--become \
| tee /tmp/audit.jsonl
Puis agrégez avec jq :
grep -v '^[a-z]' /tmp/audit.jsonl | jq -s 'group_by(.verdict) | map({verdict: .[0].verdict, hosts: length})'
failed_when dans un play- 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
Par ordre de préférence. Le script recommandera la bonne en fonction de ce qu'il a trouvé.
# 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