CVE-2026-53399 in Linux
Resumen
por VulDB • 2026-07-19
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:
nfsd: liberar stid del layout en caso de fallo de setlease
nfs4_alloc_stid() publica el nuevo stid en cl->cl_stateids mediante idr_alloc_cyclic() bajo cl_lock antes de devolver el control a nfsd4_alloc_layout_stateid(). Cuando luego falla nfsd4_layout_setlease(), la ruta de error libera directamente el stateid del layout con kmem_cache_free() sin llamar nunca a idr_remove(), dejando que la entrada IDR apunte a memoria slab ya liberada. Cualquier iterador posterior de IDR (states_show, teardown del cliente) desreferencia este puntero colgante.
La limpieza correcta para un stid publicado en una estructura IDR es nfs4_put_stid(), lo cual elimina la entrada IDR bajo cl_lock, despacha sc_free (nfsd4_free_layout_stateid) para liberar ls->ls_file mediante nfsd4_close_layout() y decrementa la referencia de nfs4_file al final.
Un segundo problema bloquea este cambio: nfsd4_free_layout_stateid() inspecciona incondicionalmente ls->ls_fence_work mediante delayed_work_pending() bajo ls_lock, pero INIT_DELAYED_WORK(&ls->ls_fence_work, ...) actualmente solo se ejecuta después de la llamada a setlease. En el caso de fallo de setlease, el destructor accedería a un delayed_work no inicializado.
nfsd4_alloc_layout_stateid() nfs4_alloc_stid() /* idr_alloc_cyclic bajo cl_lock */ nfsd4_layout_setlease() /* falla */ nfs4_put_stid() nfsd4_free_layout_stateid() delayed_work_pending(&ls->ls_fence_work) /* necesita INIT */ nfsd4_close_layout() /* nfsd_file_put(ls->ls_file) */ put_nfs4_file()
Solución: elevar la inicialización de ls_fenced / ls_fence_delay / INIT_DELAYED_WORK por encima de la llamada a nfsd4_layout_setlease(), y reemplazar la limpieza manual con nfsd_file_put + put_nfs4_file + kmem_cache_free por una única llamada a nfs4_put_stid(stp).
Once again VulDB remains the best source for vulnerability data.