
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 error parcial de copia en escritura en la acción act_pedit del subsistema net/sched del kernel de Linux que permite a un usuario local no privilegiado corromper la memoria 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 queda fuera de la región COW. Resultado: las páginas compartidas de caché de páginas se sobrescriben y un binario setuid en caché (objetivo clásico: /bin/su) puede envenenarse 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, la falla de propiedad de páginas es la misma.
Triaje estrictamente de solo lectura. Nunca carga un módulo, nunca toca sysctl, nunca ejecuta una prueba de concepto. Diseñado para ser seguro de ejecutar en producción.
act_pedit a través de cuatro señales independientes:
lsmod)modinfo)/boot/config-$(uname -r), /proc/config.gz, modules.builtin)install ... /bin/true en modprobe.dtc action pedit existentes (solo informativo; sin cambios).user.max_user_namespaces, kernel.unprivileged_userns_clone y las restricciones de AppArmor para espacios de nombres de usuario en Ubuntu./etc/os-release (RHEL 8/9/10, Debian 11/12/13/14, Ubuntu 18.04→26.04, SUSE, Amazon Linux, Arch-family rolling).sudo ./cve-2026-46331-audit.sh # informe de texto completo
sudo ./cve-2026-46331-audit.sh --json # JSON legible por máquina, sin banner
sudo ./cve-2026-46331-audit.sh --quiet --no-hunt # veredicto de una línea para escaneos masivos
sudo ./cve-2026-46331-audit.sh --since 2026-06-01 # ampliar ventana de búsqueda de IoC
sudo ./cve-2026-46331-audit.sh --no-banner # informe de texto sin el banner ASCII
Consulte examples/sample-output.txt para una ejecución completa y examples/sample-output.json para el formato JSON.
La puntuación es una combinación ponderada de:
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 agregue con jq:
grep -v '^[a-z]' /tmp/audit.jsonl | jq -s 'group_by(.verdict) | map({verdict: .[0].verdict, hosts: length})'
- name: auditar 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 correcta según lo que haya encontrado.
# Opción 1: bloquear act_pedit si no lo usa.
tc actions list action pedit # DEBE estar vacío antes de hacer esto
echo 'install act_pedit /bin/true' | sudo tee /etc/modprobe.d/disable-act_pedit.conf
lsmod | grep -q act_pedit && sudo rmmod act_pedit
# Opción 2: restringir espacios de nombres de usuario no privilegiados.
# Romperá Podman/Docker sin raíz, entornos aislados del navegador, Flatpak, unshare sin privilegios, algunos entornos aislados de CI.
sudo sysctl -w user.max_user_namespaces=0 # familia EL
sudo sysctl -w kernel.unprivileged_userns_clone=0 # Debian/Ubuntu
La verdadera solución es una actualización del kernel del proveedor y un reinicio. uname -r después del reinicio es lo único que lo prueba.
Esta es la quinta iteración del mismo fallo arquitectónico. Cada una corrigió la causa inmediata, ninguna corrigió la causa raíz: rutas rápidas de copia cero que comparten páginas a través de límites de propiedad, donde cada escritor debe probar la privacidad antes de mutar bytes, en cientos de sitios de llamada.
Rust en el kernel aborda exactamente esta clase mediante tipos de propiedad. No aparecerá en net/sched mañana.
MIT. Consulte LICENSE.
Para uso defensivo autorizado en sistemas de su propiedad o para los que tenga permiso explícito de auditoría. El script nunca ejecuta la prueba de concepto pública, nunca modifica el estado del sistema y nunca carga módulos. Trate el veredicto como triaje, no como prueba de compromiso o de seguridad.
| CVE | CVE-2026-46331 |
| Componente | Kernel de Linux net/sched / act_pedit |
| Clase | COW parcial → corrupción de caché de páginas → escalada local de privilegios |
| Vector de ataque | Local (CAP_NET_ADMIN, normalmente adquirido a través de un espacio de nombres de usuario no privilegiado) |
| Afectado aguas arriba | 5.18 .. 7.1-rc6 |
| Parche aguas arriba | 7.1-rc7 |
| Prueba de concepto pública | packet_edit_meme (verificado en RHEL 10, Debian 13, Ubuntu 24.04.4) |
| Severidad 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) |
auditd y journalctl (ventana configurable mediante --since).PATCHED / NOT_APPLICABLE / MITIGATED / VULNERABLE / UNKNOWN.| Código | Significado |
|---|
| 0 | PATCHED o NOT_APPLICABLE (el kernel es anterior al error) |
| 1 | MITIGATED (mitigación activa, kernel aún vulnerable, aplicar parche de todas formas) |
| 2 | VULNERABLE (una o más condiciones previas cumplidas, sin kernel parcheado) |
| 3 | UNKNOWN (tratar como sospechoso en entornos compartidos / CI / Kubernetes) |
| 4 | ERROR (el script no pudo ejecutarse; faltan herramientas o entorno incorrecto) |
| Señal | Peso |
|---|
Veredicto del proveedor VULNERABLE | +50 |
Veredicto del proveedor UNKNOWN | +30 |
act_pedit compilado en el kernel | +25 |
act_pedit cargable, sin anulación | +20 |
act_pedit cargable, anulación activa | +5 |
act_pedit cargado actualmente | +5 |
| Espacio de nombres de usuario no privilegiado alcanzable, sin portal AppArmor | +15 |
| Espacio de nombres de usuario no privilegiado alcanzable, portal AppArmor activo | +8 |
| IoCs encontrados en la ventana de búsqueda | +10 |
| CVE | Año | Subsistema | Primitiva |
|---|
| CVE-2016-5195 | 2016 | mm | Condición de carrera COW en mapeo de solo lectura |
| CVE-2022-0847 | 2022 | pipe / splice | Fuga de indicador pipe_buffer en caché de páginas |
| CVE-2026-31431 | 2026 | crypto AF_ALG/AEAD | Criptografía in-place sobre caché de archivos de solo lectura |
| CVE-2026-46300 | 2026 | XFRM ESP-in-TCP | Pérdida de marcador de fragmento compartido skbuff |
| CVE-2026-46331 | 2026 | net/sched act_pedit | COW parcial por desplazamiento de clave tipada resuelto tarde |