CVE-2026-98432
ipv4: liberar inet_opt e ireq_opt tras un periodo de gracia de RCU
- Publicado
- 15 oct 2026
- Actualizado
- 3 nov 2026
- Asignación de CNA
- Linux
- Evidencia observada
- 1 nov 2026
CVSS primario
nvd · CVSS 3.1
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:HBajo · próximos 30 días
- Percentil
- 39,6 %
- Fecha del modelo
- 2 nov 2026
EPSS es una estimación estadística, no una certeza o una medida de impacto. Combínelo con CVSS, estado KEV, exposición y su entorno.
Resumen
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: ipv4: liberar inet_opt e ireq_opt tras un periodo de gracia de RCU. tcp_v4_syn_recv_sock() transfiere la propiedad de ireq->ireq_opt al socket hijo (newinet->inet_opt) sin copiarlo. Otra CPU puede procesar concurrentemente un SYN retransmitido para el mismo request socket y enviar un SYNACK desde tcp_check_req(). tcp_v4_send_synack() e inet_csk_route_req() leen ireq->ireq_opt solo bajo rcu_read_lock(), y ip_build_and_send_pkt() e ip_options_build() leen después opt->optlen dos veces. Nótese que el propio temporizador del SYNACK no es un problema: mantiene una referencia sobre su request socket, e inet_csk_reqsk_queue_drop() llama a timer_delete_sync() antes de que el hijo pueda ser liberado. Desde el commit 079096f103fa ("tcp/dccp: install syn_recv requests into ehash table"), los request sockets se procesan sin mantener el lock del listener, por lo que nada impide que el socket hijo sea liberado mientras el SYNACK aún se está construyendo. Los sockets hijos TCP no tienen SOCK_RCU_FREE, e inet_sock_destruct() libera inet_opt con un kfree() simple, lo que provoca un use-after-free en ip_options_build(). Existe un problema similar con la migración de request sockets (net.ipv4.tcp_migrate_req=1, o un programa BPF_SK_REUSEPORT_SELECT_OR_MIGRATE). reqsk_timer_handler() clona el request socket con inet_reqsk_clone(), de modo que el request socket antiguo y su clon comparten el mismo ireq_opt, y luego reqsk_migrate_reset() borra el puntero en el antiguo. Otra CPU que mantiene una referencia sobre el request socket antiguo puede seguir usando estas opciones (enviando un SYNACK, o creando un hijo en tcp_v4_syn_recv_sock()) cuando el clon es liberado, y tcp_v4_reqsk_destructor() también usa un kfree() simple. Los lectores ya usan RCU, y otras rutas que reemplazan inet_opt (do_ip_setsockopt(), cipso_v4_sock_setattr()...) ya usan kfree_rcu(). Usar kfree_rcu() también en inet_sock_destruct() y tcp_v4_reqsk_destructor(). IPv6 no se ve afectado por el primer problema, porque tcp_v6_syn_recv_sock() duplica las opciones. tcp_v6_reqsk_destructor() tiene el mismo problema de migración con ipv6_opt, que solo establece CALIPSO. Esto se abordará en un parche separado.
Fuentes
Uso responsable
Utilice información sobre vulnerabilidades solo en sistemas de su propiedad o que esté autorizado a probar. Kitploit enlaza con metadatos de investigación pública y no almacena código de explotación ni cargas útiles maliciosas.