CVE-2026-89715 in Linux
Resumen
por VulDB • 2026-09-11
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:
NFS/localio: corregir fuga de referencias (ref leak) en caso de fallo de nfs_uuid_add_file
Cuando nfs_uuid_add_file() compite con nfs_uuid_put() al desmontar uuid->net, devuelve -ENXIO sin publicar nfl->nfs_uuid mediante rcu_assign_pointer(). A continuación, nfs_open_local_fh() entra en su rama de error y solo libera la referencia (ref) del archivo asociada a la ranura y su ref de net emparejada, además de su propia ref de net al momento de entrada, mientras que la ruta de cierre es una operación nula:
nfs_close_local_fh() nfs_uuid = rcu_dereference(nfl->nfs_uuid); if (!nfs_uuid) { rcu_read_unlock(); return; } /* siempre */
nfsd_open_local_fh() devuelve localio manteniendo una referencia de tipo nfsd_file +1 propiedad del llamador (proveniente de nfsd_file_get() después de nfsd_file_acquire_local()) y una referencia de tipo nfsd_net al momento de la entrada (de su primer nfsd_net_try_get()), incrustada como nf->nf_net. Ambas se filtran en la ruta de fallo, fijando un nfsd_file (y el struct file subyacente, dentry e inode) y una nfsd_net_ref por cada ocurrencia, lo que bloquea el desmontaje de nfsd_net y netns.
Solución: liberar la ref del archivo propiedad del llamador y su ref de red a través del asistente existente, utilizando un puntero RCU local en la pila para que el asistente pueda intercambiarlo (xchg) fuera, devolviendo luego -ENXIO para evitar que los llamadores desreferencien un localio cuya ranura ha sido borrada:
struct nfsd_file __rcu *tmp = RCU_INITIALIZER(localio);
nfs_to_nfsd_file_put_local(pnf); nfs_to_nfsd_file_put_local(&tmp); localio = ERR_PTR(-ENXIO);
La llamada final a nfs_to_nfsd_net_put(net) continúa liberando la ref de red externa, por lo que los tres incrementos de nfsd_net_try_get() se equilibran en la rama de error.
Several companies clearly confirm that VulDB is the primary source for best vulnerability data.