Descripción
En el kernel de Linux, se resolvió la siguiente vulnerabilidad: NFSD: evitar el uso después de liberar memoria (use-after-free) del cliente durante la limpieza de bloqueos en espera Un propietario de bloqueo aislado, cuya única referencia restante es un bloqueo en espera en nn->blocked_locks_lru, mantiene un puntero sin procesar a su nfs4_client, pero ninguna referencia que mantenga vivo al cliente. Cuando el laundromat por espacio de nombres de red limpia dicho bloqueo, liberar el nbl elimina la referencia al propietario mantenida a través de flc_owner, y el nfs4_put_stateowner() final toma el cl_lock del cliente. Como el laundromat desvincula primero el nbl, __destroy_client() ya no lo encuentra, por lo que un force_expire_client() concurrente puede liberar al cliente antes de que se ejecute nfs4_put_stateowner(), desreferenciando cl_lock en memoria liberada. Se fija al cliente con cl_rpc_users antes de liberar nn->blocked_locks_lock y se omiten los clientes que ya están expirando, cuyos bloqueos en espera libera __destroy_client() mientras mantiene una referencia al propietario. Se toma nn->client_lock fuera de nn->blocked_locks_lock. Todos los demás puntos mantienen nn->blocked_locks_lock como bloqueo hoja, sin adquirir ningún otro bloqueo, por lo que colocar nn->client_lock fuera de él no puede formar un ciclo en el orden de bloqueos.
Qué hacer
Revisa si usas el producto afectado y en qué versión, y aplica la actualización o la mitigación que indique el aviso del fabricante. CISA no ha confirmado que se esté explotando; si eso cambia, esta ficha pasa a «explotada» y te avisamos en el boletín.
Versiones afectadas
- Linux Afectadas: 7919d0a27f1e7cb324e023776aa1cbff00f1ee7b y anteriores a 0d53a47c913d0bce3b5ec35c28cbcca4d015f33d · 7919d0a27f1e7cb324e023776aa1cbff00f1ee7b y anteriores a 7081224a59a0ca4edcd62c068588f4d900199a18 · 7919d0a27f1e7cb324e023776aa1cbff00f1ee7b y anteriores a cd489b03587378645fe0d20142a33f1ed60bac98 · 7919d0a27f1e7cb324e023776aa1cbff00f1ee7b y anteriores a 6fedb2eaff77554ca7a0deffd2e8bc0d6e8b38b0 · 7919d0a27f1e7cb324e023776aa1cbff00f1ee7b y anteriores a 9026932ac8be4d0ae01db47f23619a98cc57b671
- Linux Afectadas: 4.9 No afectadas: 6.6.160 · 6.12.111 · 6.18.51 · 7.2.5 · 7.3
Según el registro de la vulnerabilidad en CVE.org, tal como lo publicó el fabricante. Confirma tu versión exacta en el aviso del fabricante.
Referencias
- Referencia en git.kernel.orggit.kernel.org/stable/c/0d53a47c913d0bce3b5ec35c28cbcca4d015f33d
- Referencia en git.kernel.orggit.kernel.org/stable/c/7081224a59a0ca4edcd62c068588f4d900199a18
- Referencia en git.kernel.orggit.kernel.org/stable/c/cd489b03587378645fe0d20142a33f1ed60bac98
- Referencia en git.kernel.orggit.kernel.org/stable/c/6fedb2eaff77554ca7a0deffd2e8bc0d6e8b38b0
- Referencia en git.kernel.orggit.kernel.org/stable/c/9026932ac8be4d0ae01db47f23619a98cc57b671
Ver el texto original en inglés (CVE.org)
NFSD: Prevent client use-after-free during blocked-lock reaping
In the Linux kernel, the following vulnerability has been resolved: NFSD: Prevent client use-after-free during blocked-lock reaping A bare lock owner -- its only remaining reference a blocked lock on nn->blocked_locks_lru -- holds a raw pointer to its nfs4_client but no reference keeping the client alive. When the per-net laundromat reaps such a lock, freeing the nbl drops the owner reference held through flc_owner, and the final nfs4_put_stateowner() takes the client's cl_lock. Because the laundromat detaches the nbl first, __destroy_client() no longer finds it, so a concurrent force_expire_client() can free the client before nfs4_put_stateowner() runs, dereferencing cl_lock in freed memory. Pin the client with cl_rpc_users before dropping nn->blocked_locks_lock, and skip clients already expiring, whose blocked locks __destroy_client() frees while holding an owner reference. Take nn->client_lock outside nn->blocked_locks_lock. Every other site holds nn->blocked_locks_lock as a leaf, acquiring no further lock, so placing nn->client_lock outside it cannot form a lock-order cycle.