
Script de auditoría bash de solo lectura que clasifica CVE-2026-98432, un use-after-free en IPv4 TCP del kernel de Linux, mediante la revisión de registros de cambios del kernel, matrices de corrección de distribuciones y la exposición de escuchas TCP.
Script de auditoría de solo lectura para CVE-2026-98432, un use-after-free en el handshake TCP IPv4 del kernel de Linux. Un SYN-ACK puede construirse a partir de opciones IP que otra CPU acaba de liberar. El disparador es tráfico de red contra un socket en escucha ordinario, por lo que, a diferencia de los fallos de page-cache y checksum de las auditorías hermanas, no requiere acceso local.
Cuando una conexión se completa, tcp_v4_syn_recv_sock() entrega las opciones IP del request socket (ireq->ireq_opt) al nuevo socket hijo sin copiarlas. Un SYN retransmitido para el mismo request socket, procesado en otra CPU, puede seguir construyendo un SYN-ACK a partir de esas opciones. Dado que 079096f103fa (4.4) los request sockets funcionan sin el lock del listener, las opciones del hijo se liberan con un kfree() simple, y ip_options_build() lee memoria liberada (CWE-416).
Existe una segunda carrera en la migración de request sockets, que solo está activa con net.ipv4.tcp_migrate_req=1 o con un programa BPF SK_REUSEPORT_SELECT_OR_MIGRATE. La corrección cambia ambas liberaciones a kfree_rcu().
| CVE | CVE-2026-98432 |
| Componente | Kernel de Linux net/ipv4 (tcp_v4_syn_recv_sock, inet_sock_destruct, tcp_v4_reqsk_destructor) |
| Clase | Use-after-free, alcanzable remotamente a través de un socket TCP en escucha |
| Introducido | 079096f103fa "tcp/dccp: install syn_recv requests into ehash table" (4.4); parte de migración c905dee62232 |
| Corrección upstream | e3f33b0a1d89 "ipv4: free inet_opt and ireq_opt after an RCU grace period" (Eric Dumazet), en 7.3-rc7 |
| Correcciones estables | 5.10.272, 5.15.223, 6.1.190, 6.6.159, 6.12.113, 6.18.56, 7.2.10 |
| Reportero | Xinyang Ge |
| Gravedad | CNA: 9.8 (AC:L). Red Hat: 8.1 (AC:H, debido a la carrera), sin mitigación disponible. Ubuntu: Alta |
| Debian | bookworm corregido en 6.1.190-1, trixie en 6.12.113-1, forky 7.2.12-1 |
| Ubuntu | corrección en curso para todas las versiones, ninguna publicada aún |
| Red Hat | no se ha publicado tabla de productos afectados ni erratum |
Las versiones estables se verificaron contra los archivos ChangeLog-* de kernel.org el 2026-10-29. En cada rama, la versión listada es la primera que incluye la corrección y la versión anterior carece de ella. La línea principal se verificó comparando etiquetas: 7.3-rc6 carece del commit y 7.3-rc7 lo tiene. Las series que no tienen fila de corrección (4.x, 5.4, 6.2–6.5, 6.7–6.11, 6.13–6.17, 6.19, 7.0, 7.1) están al final de su vida útil y se reportan como vulnerables. Los estados de las distribuciones corresponden a la misma fecha.
El fallo requiere un socket TCP en escucha y un SYN que transporte opciones IP, además de una carrera perdida entre dos CPU. El script no puede determinar hasta qué punto tu red hace alcanzables esas opciones, por lo que informa de lo que puede ver (listeners) y deja el resto a tu criterio.
Solo hace triaje y no cambia nada. Nunca carga un módulo, nunca abre un socket, nunca toca sysctl ni reglas de firewall, y nunca ejecuta un PoC, por lo que es seguro ejecutarlo en producción.
changelog.Debian.gz o rpm -q --changelog) el ID de CVE o el asunto del commit upstream. Una corrección encontrada allí siempre prevalece./proc/net/tcp y /proc/net/tcp6:
net.ipv6.bindv6only=1;net.ipv4.tcp_migrate_req y anota los runtimes de contenedores, cuyos puertos publicados y espacios de nombres de red privados no puede ver. Cuentan como exposición.--json.Las filas de distros son una instantánea (2026-10-29). Los proveedores publicarán correcciones después de esa fecha, por lo que una copia antigua puede informar "corrección en curso" para un kernel que lleva mucho tiempo parcheado. El informe imprime la antigüedad de la instantánea y advierte una vez que supera los 14 días. La advertencia nunca cambia el veredicto, y la comprobación del changelog y los umbrales upstream no envejecen. Con --quiet, aparece una segunda línea NOTE: solo cuando está desactualizada, por lo que un analizador de la línea 1 no se ve afectado. El JSON incluye matrix_date, matrix_age_days y matrix_stale.
Cuando advierta, descargue la última versión de este script.
| Veredicto | Significado | Salida |
|---|---|---|
| PATCHED | Corrección encontrada en el changelog o en las tablas upstream/del proveedor | 0 |
| NOT_APPLICABLE | El kernel es anterior a 4.4 | 0 |
| MITIGATED | Sin corregir, pero ningún listener TCP es accesible por IPv4 en este momento. Aun así parchee: iniciar cualquier servicio lo vuelve a abrir | 1 |
| VULNERABLE | Sin corregir y al menos un listener (o un /proc/net/tcp ilegible, o un runtime de contenedores) | 2 |
| UNKNOWN | No se puede determinar, por ejemplo, sin changelog y sin fila en la matriz | 3 |
| ERROR | Opción incorrecta o herramienta faltante | 4 |
MITIGATED es poco frecuente a propósito: casi todos los servidores escuchan en algo. Un usuario local también puede ejecutar un listener en un espacio de nombres privado de usuario+red; esa vía se anota en el informe pero no se cuenta, porque su explotabilidad no está verificada.
Se manejan dos casos en los que una simple comparación de versiones sería incorrecta:
ID=debian pero ejecuta su propia serie proxmox-kernel-*. Los mínimos de Debian no aplican, por lo que solo se resuelve mediante una coincidencia en el changelog....-microsoft-standard-WSL2). La regla de la distro no aplica; sí la tabla upstream. Actualícelo desde Windows con wsl --update.sudo ./cve-2026-98432-audit.sh # text report
./cve-2026-98432-audit.sh --json # JSON on stdout
./cve-2026-98432-audit.sh --quiet # one line, exit code carries the verdict
./cve-2026-98432-audit.sh --since 2026-09-01 --no-hunt