
Script para comprobar si los sistemas son vulnerables a cve-2026-23111
CVE-2026-23111 es una vulnerabilidad del kernel de Linux en nf_tables que puede ser explotada para la escalada local de privilegios por un usuario sin privilegios en sistemas donde los espacios de nombres de usuario (user namespaces) y nftables están disponibles.[1][2] Los avisos públicos de proveedores y gobiernos la describen como un problema local que afecta a las distribuciones Linux y enfatizan la aplicación de parches como la solución principal.[3][4]
Este repositorio contiene un script de validación defensiva diseñado para ayudar a evaluar si un host expone las condiciones técnicas asociadas con esta CVE sin proporcionar un exploit de escalada de privilegios. Comprueba las condiciones relevantes del kernel y del entorno de ejecución, carga opcionalmente el módulo nf_tables para realizar pruebas funcionales completas, intenta una ruta de validación controlada sin privilegios usando unshare y nft, recopila trazas de diagnóstico locales y clasifica el host en veredictos operativos como probablemente seguro, bloqueado por política local, o ruta expuesta disponible.[1][5]
Según el NVD, CVE-2026-23111 es una vulnerabilidad de nf_tables en el kernel de Linux resuelta como una corrección de un error lógico en netfilter y es explotable para la escalada local de privilegios desde un usuario sin privilegios a través de los espacios de nombres de usuario y nftables en configuraciones afectadas.[1] El aviso de seguridad de Ubuntu describe la misma ruta de explotación de alto nivel y realiza el seguimiento de los estados de los paquetes afectados y corregidos por versión.[2]
Red Hat afirma que un usuario local con privilegios bajos podría explotar el problema para causar una denegación de servicio o potencialmente lograr una escalada de privilegios, y documenta una ruta de mitigación basada en impedir que el módulo nf_tables se cargue cuando eso sea operativamente aceptable.[3] La guía a nivel nacional del Centro Canadiense de Ciberseguridad también remite a las organizaciones afectadas a las actualizaciones de los proveedores y menciona la regeneración del initramfs cuando se utilizan mitigaciones de bloqueo de módulos.[4]
El script está pensado para la evaluación defensiva de exposición, no para la explotación. Está diseñado para:
CONFIG_USER_NS y CONFIG_NF_TABLES parecen estar presentes.[1]kernel.unprivileged_userns_clone y user.max_user_namespaces para estimar si los espacios de nombres de usuario sin privilegios están disponibles.install nf_tables /bin/false) o una lista negra débil para el módulo nf_tables./proc/kallsyms para el símbolo vulnerable (nft_map_catchall_activate) frente al símbolo posterior al parche (nft_catchall_set_activate) antes de cualquier interacción con el módulo.nf_tables mediante modprobe cuando se especifica (ver más abajo), y descargarlo automáticamente al salir.El script almacena los registros en un subdirectorio del directorio del script y los elimina de forma predeterminada a menos que se use --keep-logs.
De forma predeterminada, el script nunca carga nf_tables. Si el módulo no está ya cargado cuando el script se inicia, todas las pruebas funcionales de nft se omiten y el veredicto se deriva únicamente de la versión del kernel, la huella de kallsyms, la configuración de modprobe, el changelog del RPM y la evidencia de política sysctl/LSM.
Este valor predeterminado conservador evita ampliar involuntariamente la superficie de ataque en hosts de producción. Para habilitar las pruebas funcionales completas en un sistema controlado o instrumentado, use --allow-load-module como root (ver más abajo).
# Default — no module loading, policy-evidence-only verdict
./check_cve_2026_23111.sh
./check_cve_2026_23111.sh --color
./check_cve_2026_23111.sh --keep-logs
./check_cve_2026_23111.sh --color --keep-logs
# Full functional test — loads (and unloads) nf_tables, requires root
sudo ./check_cve_2026_23111.sh --allow-load-module
sudo ./check_cve_2026_23111.sh --allow-load-module --color --keep-logs
--allow-load-moduleUse --allow-load-module cuando necesite el veredicto de mayor confianza en una VM de prueba aislada, que no sea de producción o creada específicamente para ello. Escenarios típicos:
No use --allow-load-module en hosts de producción donde nf_tables esté bloqueado intencionalmente o donde cargarlo violaría una política de endurecimiento.
--allow-load-moduleAntes de intentar cargar el módulo, el script aplica las siguientes comprobaciones y sale con un error si alguna falla:
install nf_tables /bin/false) no debe estar presente en /etc/modprobe.d/.modprobe debe estar disponible en el sistema.root (uid 0).Si el script carga el módulo correctamente, se llama a modprobe -r nf_tables al salir mediante la trampa cleanup(), independientemente de cómo termine el script (con éxito, con error o con CTRL+C).
El script utiliza veredictos operativos en lugar de resultados de explotación:
Estos veredictos están pensados para respaldar la priorización de parches y el triaje defensivo, no para sustituir la validación del estado de los paquetes del proveedor.
El script compara el kernel en ejecución con los puntos de corrección upstream documentados:
La acción principal recomendada es instalar la actualización del kernel corregido por el proveedor y reiniciar con el kernel corregido.[2][3][4] Debido a que la explotación depende de la superficie de ataque local del kernel, un endurecimiento adicional puede reducir la exposición mientras se programa o valida la aplicación del parche.[5][6]
nf_tables si el sistema no requiere la funcionalidad de nftables y el cambio se ha validado por su impacto operativo.[3][4]CAP_NET_ADMIN, y reduzca el número de cuentas que pueden manipular el estado del firewall.[5]Restrinja los espacios de nombres de usuario sin privilegios:
echo 'kernel.unprivileged_userns_clone=0' > /etc/sysctl.d/99-cve-2026-23111.conf
echo 'user.max_user_namespaces=0' >> /etc/sysctl.d/99-cve-2026-23111.conf
sysctl --load /etc/sysctl.d/99-cve-2026-23111.conf
Bloquee la carga del módulo nf_tables cuando sea operativamente seguro:
echo 'install nf_tables /bin/false' > /etc/modprobe.d/disable-nf_tables.conf
rmmod nf_tables 2>/dev/null || true
Si se utiliza una mitigación basada en la carga de módulos, algunas guías recomiendan regenerar el initramfs para que el módulo bloqueado no se cargue durante el arranque temprano.[4]
Ubuntu documenta las restricciones basadas en AppArmor para los espacios de nombres de usuario sin privilegios como una forma de reducir la superficie de ataque, más que como un sustituto completo de las correcciones del kernel.[6] Un host puede parecer menos expuesto en las pruebas de ejecución porque la ruta de ataque está bloqueada localmente, mientras que la remediación a largo plazo aún requiere instalar el paquete del kernel corregido por el proveedor.[2][6] El script valida la efectividad de las restricciones de AppArmor intentando una invocación real de unshare --user y comprobando si CAP_NET_ADMIN es funcional dentro de un espacio de nombres de usuario+red.
Red Hat enumera explícitamente impedir que el módulo nf_tables se cargue como una mitigación para CVE-2026-23111 cuando ese cambio es apropiado para el entorno.[3] El script detecta esta configuración mediante check_modprobe_deny() y distingue entre una denegación estricta (install nf_tables /bin/false, que bloquea la carga bajo demanda) y una lista negra débil (que no la bloquea). En los sistemas de la familia RHEL, el script también inspecciona el changelog del RPM del kernel en ejecución en busca de una entrada de backport de CVE-2026-23111, lo que permite un veredicto confirmado por el proveedor independientemente del número de versión upstream.
Este README y el script que lo acompaña están pensados para la validación defensiva, el inventario y la planificación de mitigaciones. No sustituyen las directrices del proveedor, la verificación a nivel de paquetes ni los procesos estándar de gestión de parches, y no deben utilizarse como sustituto de la aplicación de las correcciones oficiales descritas en los avisos enlazados.[2][3][4]
Un repositorio para aprender, probar e investigar conceptos de ciberseguridad en entornos controlados.
Este repositorio es solo para investigación de seguridad educativa y autorizada.
Está diseñado para ayudar a los usuarios a aprender sobre:
Use este repositorio solo en entornos donde tenga permiso, como:
El uso no autorizado o ilegal está estrictamente prohibido.
El autor y los colaboradores no son responsables de ningún daño, uso indebido, problema legal o pérdida causada por este proyecto.
Al usar este repositorio, usted acepta que:
Este proyecto está pensado para:
Por favor, siga las prácticas de divulgación responsable y cumpla con todas las leyes aplicables.
Para divulgación responsable o colaboración, contacte con el mantenedor del repositorio a través de GitHub.
--allow-load-moduleunshare -U -n --map-root-user + nft cuando el módulo está cargado, y registrar stdout, stderr y los registros recientes del kernel.unshare --user realmente crea un espacio de nombres y que CAP_NET_ADMIN es funcional dentro de él, para confirmar si las restricciones de AppArmor o SELinux son realmente efectivas.| Opción | Descripción |
|---|
--allow-load-module | Autoriza al script a cargar nf_tables mediante modprobe si el módulo no está ya cargado. Habilita el ejercitador completo de la ruta catchall de nft y la prueba de efectividad de CAP_NET_ADMIN. El módulo se descarga automáticamente al salir. Requiere root. Se rechaza si ya existe una denegación estricta de modprobe. Úselo solo en sistemas que no sean de producción o instrumentados. |
--color | Habilita la salida stdout coloreada cuando el terminal lo soporta. |
--keep-logs | Mantiene los registros y las trazas en el directorio del script en lugar de eliminarlos al salir. |
--help | Muestra la información de uso y sale. |
| Veredicto | Significado |
|---|
not-affected | La versión del kernel es inferior a 5.13; la característica de elementos catchall aún no se había introducido y la ruta de código vulnerable está ausente. |
likely-patched-vendor-confirmed | CVE-2026-23111 se encontró en el changelog del RPM del kernel del proveedor, lo que confirma una corrección con backport independientemente de la versión upstream. |
likely-patched-upstream-confirmed | La versión del kernel está en el rango upstream parcheado y la prueba funcional de nft devolvió un valor distinto de cero sin señal del kernel — la evidencia estática + dinámica más sólida de un estado seguro. |
likely-patched-upstream | La versión del kernel está en un rango upstream parcheado, pero la prueba funcional no se ejecutó (módulo ausente o no concluyente). El estado del aviso del proveedor aún debe verificarse. |
likely-safe-or-patched | El script no confirmó ninguna ruta explotable; la causa es ambigua entre un kernel parcheado, código vulnerable ausente o un bloqueo local implícito. |
blocked-by-local-policy | La ruta probada parece bloqueada por AppArmor, SELinux, restricciones de espacios de nombres de usuario o una denegación de modprobe.[6] Los bloqueos de política no sustituyen a la corrección del proveedor. |
exposed-path-available | El host expone una ruta userns + nftables compatible con los requisitos de explotación documentados.[1][5] |
strong-signal-lab-confirmation | Se observó una señal en el registro del kernel consistente con corrupción de memoria relacionada con nf_tables. Confírmelo solo en un laboratorio instrumentado y desechable. |
prerequisites-missing | Faltan las herramientas de diagnóstico necesarias (unshare, nft); no se completó ninguna validación de ejecución significativa. |
| Rama | Corregido en | Commit upstream |
|---|
| 6.13.x+ | ≥ 6.13.1 | f41c5d1 |
| 6.12.x | ≥ 6.12.12 | 8c760ba |
| 6.6.x | ≥ 6.6.75 | b9b6573 |
| 6.1.x | ≥ 6.1.128 | 8b68a45 |
| 6.2–6.5, 6.7–6.11 | EOL upstream | solo backport de la distribución |
| 5.15.x | depende de la distribución | Amazon Linux: ALAS2KERNEL-5.15-2026-098 |
| 5.10.x | depende de la distribución | Amazon Linux 2: pendiente al 2026-03 |
| 5.4.x | depende de la distribución | Amazon Linux 2: pendiente al 2026-03 |
| 5.13–5.14 | EOL upstream | solo backport de la distribución |
| < 5.13 | no afectado | la característica catchall no está presente |