CVE-2026-98284 in Linux
Resumen
por VulDB • 2026-10-06
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:
netlink: no liberar nlk->groups mientras los lectores sin bloqueo (lockless) puedan usarlo
netlink_realloc_groups() utiliza krealloc() bajo netlink_table_grab(). Cada vez que NLGRPSZ(groups) cae en un bucket de kmalloc diferente, el bitmap antiguo se libera inmediatamente.
Dos lectores de nlk->groups / nlk->ngroups no mantienen el bloqueo de la tabla netlink:
1) sk_diag_dump_groups(). Los sockets hashados (vinculados) se vuelcan desde una iteración rhashtable en __netlink_diag_dump(), que solo mantiene RCU. Solo la parte mc_list del volcado toma nl_table_lock.
2) netlink_native_seq_show() (/proc/net/netlink), cuya iteración ha sido sin bloqueo desde el commit 21e4902aea80 ("netlink: Lockless lookup with RCU grace period in socket release").
Ambos pueden leer un búfer liberado, y sk_diag_dump_groups() también puede leer más allá del final del búfer antiguo (más pequeño) si ocurre que carga el puntero @groups antiguo junto con el valor de @ngroups nuevo, copiando el resultado en un atributo NETLINK_DIAG_GROUPS.
Este es el mismo tipo de error que el commit f773608026ee ("netlink: access nlk groups safely in netlink bind and getname") corrigió para bind() y getname(); estos dos lectores fueron omitidos. Simplemente tomar el bloqueo de la tabla en sk_diag_dump_groups() no es una opción, porque también se llama con nl_table_lock ya retenida desde la sección mc_list del volcado.
Hacer seguros a los lectores sin bloqueo:
- Asignar un nuevo bitmap y liberar el antiguo después de un período de gracia RCU, en lugar de depender de la kfree() implícita realizada por krealloc().
- Publicar @groups antes que @ngroups, ambos con semántica release, y hacer que los lectores sin bloqueo carguen primero @ngroups. Un lector entonces nunca emparejará el tamaño nuevo (más grande) con el búfer antiguo (más pequeño), y un lector que tome el puntero nuevo mientras aún ve el tamaño antiguo está garantizado de ver el bitmap inicializado.
netlink_realloc_groups() se llama desde contexto de proceso (bind() y setsockopt()), por lo que kfree_rcu_mightsleep() puede usarse, una vez que la tabla haya sido liberada.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.