
kpatch livepatch para CVE-2026-98432 (y CVE-2026-99999) en AlmaLinux y Rocky Linux 8, 9 y 10
Módulos livepatch que corrigen CVE-2026-98432 en un host AlmaLinux o Rocky Linux 8, 9 o 10 (x86_64) en ejecución sin reiniciar. En los kernels que además carecen de la corrección para CVE-2026-99999, el mismo módulo también corrige esa, de modo que un host necesita un solo módulo, independientemente de cuál de las dos le falte a su kernel.
Estado (2026-11-02): todos los módulos están compilados y probados en
carga; ninguno está publicado todavía, así que no hay nada que aplicar.
La publicación, y una prueba del comando de una línea sobre cada módulo
publicado, vienen a continuación; hasta entonces scripts/livepatch.sh
no tiene módulos en su tabla y rechaza todos los kernels.
684 kernels: 380 de AlmaLinux y 304 de Rocky Linux, de 8.3 a 10.2,
listados en tools/kernels.tsv. Son todos los kernels cuyos SRPM y
debuginfo están en los espejos de la distribución (incluido vault), solo
x86_64, excepto el 5.14.0-611.41.1.el9_7 de Rocky, cuyo debuginfo no está
en ningún espejo. Incluye el único kernel 8.3 de Rocky, 4.18.0-240.22.1.el8,
que el repositorio anterior de Rocky no cubría, y los kernels que ambas
distribuciones publicaron después de los repositorios anteriores, hasta
4.18.0-553.180.1.el8_10 (AlmaLinux), 5.14.0-687.61.1.el9_8 y
6.12.0-211.69.1.el10_2. La variante x86_64_v2 de AlmaLinux 10 no está
cubierta.
666 de los 684 carecen también de la corrección para CVE-2026-99999, y su módulo incluye ambas. Los otros 18 ya la tienen (desde AlmaLinux 4.18.0-553.177.1.el8_10 y Rocky 553.178.1.el8_10, y desde 5.14.0-687.59.1.el9_8 y 6.12.0-211.67.1.el10_2 en ambas), y su módulo incluye solo el cambio de CVE-2026-98432.
Cada módulo se compiló en CI y se aplicó con scripts/livepatch.sh a su
kernel de distribución en una VM (tools/loadtest.sh), el 2026-10-31, una
ejecución por distribución y versión menor, 40 ejecuciones; los 684
imprimieron RESULT: PASS. En cada una:
inet_sock_destruct y tcp_v4_reqsk_destructor figuran como funciones
parcheadas de vmlinux.tools/tcpopt.py). Esto ejercita las dos liberaciones que el cambio
modifica con las opciones presentes; sin opciones IP solo liberan NULL.nfnetlink_queue y xt_CHECKSUM (y en 9 y 10 en
nf_conntrack_bridge). En 8 y 9 (511 kernels, y el 8.3 de Rocky) una
trama manipulada fue fragmentada por el kernel de distribución y
descartada con el módulo aplicado. En 10 (154 kernels) la trama se
rechaza antes de llegar al fallo, así que esa prueba no dice nada en
ningún sentido allí.No probado: la propia condición de carrera. Demostrar CVE-2026-98432 en el
kernel de distribución y su ausencia con el módulo requiere KASAN y un
entrelazado artificial de un SYN retransmitido con la liberación del hijo;
no ocurre a demanda en estas VMs. Tampoco se probó ningún módulo con
Secure Boot activado (no está firmado y sería rechazado), ni cargado al
arranque por kpatch.service.
tools/mkdiffs.sh porta cada SRPM de kernel de una versión menor. Primero
aplica los parches propios del SRPM a su tarball, como lo hace %prep
(tools/prep.py): AlmaLinux incluye sus propias correcciones de esa
manera, entre ellas la de CVE-2026-99999 en 4.18.0-553.177.1.el8_10, y el
6.12.0-211.69.1 de 10.2 es el tarball 211.56.1 de Red Hat más 466
parches, así que un port hecho contra el tarball sin parches omitiría lo
que tiene el kernel. Luego las líneas modificadas se verifican contra
tools/ref/: las de CVE-2026-98432 deben ser iguales a las de upstream,
las de CVE-2026-99999 al parche de AlmaLinux para 8 o 9 o al de upstream
para 10, o estar ausentes donde el kernel tiene esa corrección. Los 684
coincidieron. tools/port.py también se detiene si el kfree_rcu() del
árbol no omitiera un puntero NULL, como suelen ser ambos punteros.
8 y 9 se construyen con kpatch-build, 10 con el propio klp-build del kernel; ambos construyen parches de reemplazo, que es cómo un módulo toma el control de uno anterior.
La corrección upstream es torvalds/linux e3f33b0a1d89, "ipv4: free inet_opt and
ireq_opt after an RCU grace period". Cuando un SYN lleva opciones IP, el
listener las conserva en el socket de petición (ireq_opt) y las entrega al
socket hijo (inet_opt) sin copiarlas. Un SYN retransmitido para la
misma petición puede responderse con un SYN-ACK en otra CPU, leyendo esas
opciones bajo RCU, mientras el hijo se cierra y inet_sock_destruct() las libera con un simple kfree(): un use after free. La migración del
socket de petición tiene el mismo problema en tcp_v4_reqsk_destructor(). La corrección
libera ambos con kfree_rcu().
Ninguna de las dos distribuciones ha publicado la corrección: el 2026-10-27 los kernels
más recientes de AlmaLinux y Rocky Linux 8, 9 y 10 no nombraban la CVE en
sus changelogs, y las fuentes de 4.18.0-305.3.1.el8_4,
4.18.0-553.179.1.el8_10, 5.14.0-687.61.1.el9_8 y 6.12.0-211.68.1.el10_2
todavía liberan ambos punteros con kfree().
Corregida antes, por separado para cada distribución, por nsrg-fmlorg/kpatch-alma-cve-2026-99999 y nsrg-fmlorg/kpatch-rocky-cve-2026-99999. Ambas distribuciones ya publican kernels con esa corrección, desde 4.18.0-553.177.1.el8_10 (AlmaLinux) o 553.178.1.el8_10 (Rocky), 5.14.0-687.59.1.el9_8 y 6.12.0-211.67.1.el10_2 en adelante. Donde un kernel carece de ella, el módulo de este repositorio lleva el mismo cambio que los anteriores, y reemplaza a un módulo anterior ya cargado (probado en cada uno de los 665 kernels que tenían uno, arriba).