
Script d'audit cve-2026-46331
Script d'audit en lecture seule pour CVE-2026-46331 (alias pedit COW) — un bogue de copie partielle sur écriture (partial copy‑on‑write) dans l'action net/sched act_pedit 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 vers 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 principale, 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 : des pages partagées du cache de pages sont modifiées, et un binaire setuid mis en cache (cible classique : /bin/su) peut être empoisonné en mémoire. Les empreintes sur disque restent intactes. Les moniteurs d'intégrité de fichiers ne le verront pas.
Même famille de bogues 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 diffère, mais l'échec de propriété des pages est le même.
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)blacklist ou une redirection install ... /bin/true dans modprobe.dtc action pedit existantes (informations ; aucune modification).user.max_user_namespaces, kernel.unprivileged_userns_clone et les restrictions AppArmor Ubuntu sur les userns.sudo ./cve-2026-46331-audit.sh # rapport textuel complet
sudo ./cve-2026-46331-audit.sh --json # JSON lisible par machine, sans bannière
sudo ./cve-2026-46331-audit.sh --quiet --no-hunt # verdict en une ligne pour les scans de masse
sudo ./cve-2026-46331-audit.sh --since 2026-06-01 # élargir la fenêtre de chasse d'IoC
sudo ./cve-2026-46331-audit.sh --no-banner # rapport textuel sans la bannière ASCII
Voir examples/sample-output.txt pour une exécution complète, et examples/sample-output.json pour le format JSON.
Le score est une combinaison pondérée de :
Plafonné à 100. Tout ce qui dépasse ~70 doit être traité comme urgent sur les nœuds multi‑locataires / 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éger avec jq :
grep -v '^[a-z]' /tmp/audit.jsonl | jq -s 'group_by(.verdict) | map({verdict: .[0].verdict, hosts: length})'
- name: auditer 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 meilleure selon ce qu'il a trouvé.
# Option 1 : bloquer act_pedit si vous ne l'utilisez pas.
tc actions list action pedit # DOIT être vide avant de faire cela
echo 'install act_pedit /bin/true' | sudo tee /etc/modprobe.d/disable-act_pedit.conf
lsmod | grep -q act_pedit && sudo rmmod act_pedit
# Option 2 : restreindre les espaces de noms utilisateur non privilégiés.
# Va casser Podman/Docker sans root, les sandbox navigateur, Flatpak, unshare non privilégié, certains sandbox CI.
sudo sysctl -w user.max_user_namespaces=0 # famille EL
sudo sysctl -w kernel.unprivileged_userns_clone=0 # Debian/Ubuntu
Le vrai correctif est une mise à jour du noyau fournisseur suivie d'un redémarrage. uname -r après redémarrage est la seule preuve.
C'est la cinquième itération du même échec architectural. Chacune a corrigé la cause immédiate, aucune n'a corrigé la cause racine : des chemins rapides de copie zéro partageant des pages au‑delà des frontières de propriété, où chaque écrivain doit prouver la confidentialité avant de modifier des octets, sur des centaines de points d'appel.
Rust dans le noyau adresse exactement cette classe via les types de propriété. Cela n'arrivera pas dans net/sched demain.
MIT. Voir LICENSE.
Pour une utilisation défensive autorisée sur des systèmes que vous possédez ou pour lesquels vous avez l'autorisation explicite d'auditer. Le script n'exécute jamais le PoC public, ne modifie jamais l'état du système et ne charge jamais de modules. Traitez le verdict comme un triage, non comme une preuve de compromission ou de sécurité.
| 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 obtenu via un userns non privilégié) |
| Versions amont affectées | 5.18 .. 7.1-rc6 |
| Correctif 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 | Importante |
| CVSS 3.1 SUSE | 7.8 (AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H) |
/etc/os-release (RHEL 8/9/10, Debian 11/12/13/14, Ubuntu 18.04→26.04, SUSE, Amazon Linux, Arch rolling).auditd et journalctl (fenêtre configurable avec --since).PATCHED / NOT_APPLICABLE / MITIGATED / VULNERABLE / UNKNOWN.| Code | Signification |
|---|
| 0 | PATCHED ou NOT_APPLICABLE (le noyau est antérieur au bogue) |
| 1 | MITIGATED (atténuation active, noyau toujours vulnérable, appliquer le correctif quand même) |
| 2 | VULNERABLE (une ou plusieurs conditions préalables requises sont remplies, noyau non corrigé) |
| 3 | UNKNOWN (à traiter comme suspect dans les contextes partagés / CI / Kubernetes) |
| 4 | ERROR (le script n'a pas pu s'exécuter ; outils manquants ou environnement inadapté) |
| Signal | Poids |
|---|
Verdict fournisseur VULNERABLE | +50 |
Verdict fournisseur UNKNOWN | +30 |
act_pedit intégré au noyau | +25 |
act_pedit chargeable, sans redirection | +20 |
act_pedit chargeable, redirection active | +5 |
act_pedit actuellement chargé | +5 |
| Userns non privilégié accessible, sans barrière AppArmor | +15 |
| Userns non privilégié accessible, barrière AppArmor active | +8 |
| IoC trouvés dans la fenêtre de chasse | +10 |
| CVE | Année | Sous-système | Primitive |
|---|
| CVE-2016-5195 | 2016 | mm | Course COW sur un mapping en lecture seule |
| CVE-2022-0847 | 2022 | pipe / splice | Fuite du drapeau pipe_buffer dans le cache de pages |
| CVE-2026-31431 | 2026 | crypto AF_ALG/AEAD | Crypto en place sur un cache de fichier en lecture seule |
| CVE-2026-46300 | 2026 | XFRM ESP-in-TCP | Perte du marqueur de fragment partagé skbuff |
| CVE-2026-46331 | 2026 | net/sched act_pedit | COW partiel dû à un décalage de clé typée résolu tardivement |