
cve-2026-46331-script de auditoría
Script de auditoría de solo lectura para CVE-2026-46331 (también conocido como pedit COW) — un fallo de copy-on-write parcial en la acción act_pedit de net/sched del kernel de Linux que permite a un usuario local sin privilegios corromper la memoria de la caché de páginas y escalar a root.
____ _____ ____ ___ _____ ____ _____ __
| _ \| ____| _ \_ _|_ _| / ___/ _ \ \ / /
| |_) | _| | | | | | | | | | | | | \ \ /\ / /
| __/| |___| |_| | | | | | |__| |_| |\ V V /
|_| |_____|____/___| |_| \____\___/ \_/\_/
CVE-2026-46331 net/sched act_pedit partial COW
tcf_pedit_act() calcula el rango COW para skb_ensure_writable() una vez antes del bucle de claves, usando tcfp_off_max_hint. Las claves tipadas añaden un desplazamiento de cabecera en tiempo de ejecución que la pista no cubre, por lo que parte de la escritura final cae fuera de la región COW. Resultado: las páginas compartidas de la caché de páginas se corrompen, y un binario setuid en caché (objetivo clásico: /bin/su) puede ser envenenado en memoria. Los hashes en disco permanecen limpios. Los monitores de integridad de archivos no lo detectarán.
Misma familia de errores que Dirty COW (CVE-2016-5195), Dirty Pipe (CVE-2022-0847), Copy Fail (CVE-2026-31431) y Dirty Frag (CVE-2026-46300). El punto de entrada es diferente, el fallo de propiedad de página es el mismo.
| CVE | CVE-2026-46331 |
| Componente | Kernel Linux net/sched / act_pedit |
| Clase | COW parcial → corrupción de la caché de páginas → LPE |
| Vector de ataque | Local (CAP_NET_ADMIN, típicamente adquirido mediante userns sin privilegios) |
| Afectados upstream | 5.18 .. 7.1-rc6 |
| Corrección upstream | 7.1-rc7 |
| PoC público | packet_edit_meme (verificado en RHEL 10, Debian 13, Ubuntu 24.04.4) |
| Severidad Red Hat | Important |
| CVSS 3.1 de SUSE | 7.8 (AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H) |
Triaje estrictamente de solo lectura. Nunca carga un módulo, nunca toca sysctl, nunca ejecuta un PoC. Diseñado para ser seguro de ejecutar en producción.
act_pedit mediante cuatro señales independientes:
lsmod)modinfo)/boot/config-$(uname -r), /proc/config.gz, modules.builtin)install ... /bin/true en modprobe.d, o por blacklist en kernels que autocargan act_pedit a través de su alias net-act-pedit (6.9+; los kernels más antiguos lo solicitan por nombre, lo que blacklist no detiene)tc action pedit existentes (informativo; sin cambios).user.max_user_namespaces, kernel.unprivileged_userns_clone, user.max_net_namespaces, y las restricciones de userns de AppArmor en Ubuntu./etc/os-release (RHEL 8/9/10, Debian 11/12/13/14, Ubuntu 18.04→26.04, SUSE, Amazon Linux, familia Arch rolling).auditd y journalctl (ventana configurable mediante --since y --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
| Código | Significado |
|---|---|
| 0 | PATCHED o NOT_APPLICABLE (el kernel es anterior al bug) |
| 1 | MITIGATED (mitigación activa, el kernel sigue siendo vulnerable, aplicar el parche de todos modos) |
| 2 | VULNERABLE (se cumple una o más precondiciones requeridas, no hay kernel corregido) |
| 3 | UNKNOWN (tratar como sospechoso en contextos compartidos / CI / Kubernetes) |
| 4 | ERROR (el script no pudo ejecutarse; faltan herramientas o el entorno es incorrecto) |
Consulte examples/sample-output.txt para una ejecución completa, y examples/sample-output.json para la forma JSON.
La puntuación es una combinación ponderada de:
| Señal | Peso |
|---|---|
Veredicto del proveedor VULNERABLE | +50 |
Veredicto del proveedor UNKNOWN | +30 |
act_pedit integrado en el kernel | +25 |
act_pedit cargable, sin anulación | +20 |
act_pedit cargable, anulación o lista negra activa | +5 |
act_pedit cargado actualmente | +5 |
| userns+netns sin privilegios accesible, sin puerta de AppArmor | +15 |
| userns+netns sin privilegios accesible, puerta de AppArmor activa | +8 |
| IoCs encontrados en la ventana de búsqueda | +10 |
Limitado a 100. Cualquier valor por encima de ~70 debe tratarse como urgente en nodos multiinquilino / CI / Kubernetes; por debajo de ~20 suele ser una confirmación de que el host está bien.
ansible -i inventory all -m script \
-a "cve-2026-46331-audit.sh --json --quiet --no-hunt" \
--become \
| tee /tmp/audit.jsonl
Luego agrega con 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
En orden de preferencia. El script recomendará la adecuada según lo que haya encontrado.
# 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