
CVE-2026-98432: un servidor TCP IPv4 simple es vulnerable, MPTCP no es el desencadenante. Desencadenante del fallo, evidencia y análisis.
Escrito por DeepSeek.
Un servidor TCP IPv4 simple es vulnerable. MPTCP no es el desencadenante.
Compilamos Linux 6.18.55 a partir del tarball de la versión y hicimos que el kernel leyera memoria liberada en un listener IPPROTO_TCP normal. KASAN lo reportó dos veces. Nunca se creó un socket MPTCP, y en una ejecución MPTCP estaba desactivado en el kernel.
El mismo fallo hace que el kernel copie bytes de un objeto liberado en la respuesta que envía de vuelta. Ese es el primitivo que necesita una ruptura de KASLR, y hemos observado que ocurre en trabajo no publicado. No construimos una fuga de direcciones del kernel, y no demostramos una escritura.
Lo que se demuestra aquí, con código y registros: el use-after-free es real, el TCP estándar lo alcanza, y la corrección upstream lo detiene.
| Kernel | MPTCP | Intentos | Tiempo | Resultado |
|---|---|---|---|---|
| 6.18.55, sin corrección | no usado | 134,955 | 34 s | KASAN use-after-free |
| 6.18.55, sin corrección | desactivado | 191,431 | 80 s | KASAN use-after-free |
| 6.18.55 + corrección | no usado | 439,316 | 411 s | limpio |
Muy difícil. Con KASAN el lector es lento, así que el fallo aparece en unos pocos cientos de miles de intentos. En un kernel normal es mucho más raro: en aproximadamente 48 millones de intentos vimos dos eventos, ambos dentro de los mismos cinco segundos.
Eso es demasiado poco para establecer una tasa. Lo máximo que afirmaremos es una cota de aproximadamente 1e-7 por intento, y aun así es un mejor caso, porque nuestro arnés fuerza los dos paquetes a dos CPUs y una NIC real normalmente envía un flujo a una CPU.
Así que una ejecución limpia no significa un kernel seguro. Lee las secciones 5.2 y 6 de ANALYSIS.md antes de citar cualquier número.
Un servidor TCP recibe un SYN. El SYN lleva una opción IPv4 (Record Route o Timestamp). El kernel guarda esas opciones en el socket de petición.
Llega un segundo SYN para la misma conexión. El kernel construye un SYNACK para él y lee las opciones guardadas.
Al mismo tiempo finaliza el handshake. El socket hijo obtiene el mismo puntero, no una copia. El servidor cierra el hijo, y el kernel libera las opciones con un simple kfree().
El código del SYNACK sigue leyendo esa memoria. Ese es el use-after-free. La misma lectura es lo que coloca bytes liberados en el paquete.
Es un disparador de fallos, no un exploit. No filtra direcciones del kernel, no escribe memoria del kernel y no obtiene root. Muestra al kernel leyendo memoria liberada; KASAN es el juez.
El repositorio se detiene ahí a propósito. Las etapas posteriores se trabajaron de forma privada y no se publican aquí.
scripts/get-kernel.sh # fetch 6.18.55, sha256 checked, into linux/
scripts/build-kernel.sh vuln # KASAN kernel, no fix
scripts/build-kernel.sh patched # KASAN kernel, with the fix
scripts/build-harness.sh # builds harness/init + initramfs
scripts/run.sh vuln 90 selftest # checks the wiring only
scripts/run.sh vuln 600 # expect a KASAN report
scripts/run.sh patched 600 # expect nothing
Necesitas gcc, make, bison, flex, bc y qemu-system-x86_64. KVM ayuda mucho.
La VM toma 2 GB de RAM y 8 vCPUs.
Una ejecución puede no mostrar nada. Eso no es evidencia de un kernel seguro. Ejecútalo
varias veces y lee las advertencias en ANALYSIS.md.
No confíes en la cadena de versión. Mira el código en el binario.
scripts/check-free-sites.py
Encuentra los dos sitios libres en el kernel en ejecución y muestra qué función llaman: kfree (malo) o kvfree_call_rcu (corregido).
En la máquina en la que se escribió esto (6.18.59_1) ambos sitios usan
kvfree_call_rcu, por lo que ese kernel está corregido.
Un host está expuesto si se cumplen las tres condiciones:
El atacante controla el punto 2. Por lo tanto, la mayoría de los servidores de internet están expuestos, y "no usamos MPTCP" no ayuda.
Dos notas:
accept_source_route=0 no te protege. Solo bloquea el enrutamiento de origen, no Record Route ni Timestamp.| Ruta | Qué |
|---|---|
ANALYSIS.md | el informe completo: ruta del código fuente, método, resultados, límites |
harness/ | el disparador del fallo que se ejecuta como /init en QEMU |
patches/ | la corrección upstream, usada para la compilación de control |
scripts/ | ayudantes de descarga, compilación, ejecución y comprobación |
evidence/ | informes de KASAN, registros de ejecución, comparación de compilaciones |
Solo kernels de prueba, y solo los que sean tuyos. Nada de esto debería apuntarse a sistemas que no controlas.
MIT para nuestro código y texto. patches/ contiene un commit del kernel de Linux y permanece bajo GPL-2.0. Véase LICENSE.