Descripción
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: NFSD: verificar el permiso de truncado bajo el bloqueo del inode nfsd_setattr() verifica si una actualización de tamaño requiere NFSD_MAY_TRUNC antes de tomar inode_lock(). La comparación usa el tamaño del archivo obtenido mediante esa lectura sin bloqueo, pero la actualización real de ATTR_SIZE se aplica después, bajo inode_lock(), mediante notify_change(). Esto deja una ventana TOCTOU para archivos de solo anexado (append-only). Si un cliente envía un SETATTR que no reduce el archivo en el momento de la muestra sin bloqueo, un anexado concurrente puede extender el archivo antes de que nfsd_setattr() tome inode_lock(). notify_change() aplica entonces un truncado real sin la verificación NFSD_MAY_TRUNC que rechaza IS_APPEND(inode). Las rutas de la llamada al sistema truncate del VFS realizan sus propias verificaciones de solo anexado antes de llamar a notify_change(), por lo que NFSD debe tomar esta decisión con respecto al tamaño bloqueado que está por modificar. Se separa la obtención del contador de escritura de la verificación del permiso de truncado. Se mantiene get_write_access() antes del trabajo de setattr con bloqueo y luego se vuelve a verificar si el tamaño solicitado es menor que i_size_read(inode) después de adquirir inode_lock() y antes de notify_change(ATTR_SIZE). Esto también evita la carga simple sin bloqueo de inode->i_size.
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: 783112f7401ff449d979530209b3f6c2594fdb4e y anteriores a 0669861a2e8e2bdb9c1149417d8ad821996ae4fe · 783112f7401ff449d979530209b3f6c2594fdb4e y anteriores a 52d0c5bdfe232c9974d4b11f97078b9c7814f05d · 783112f7401ff449d979530209b3f6c2594fdb4e y anteriores a 3afa17d93ba8c925f49370c816c6dae5112d8c24 · 783112f7401ff449d979530209b3f6c2594fdb4e y anteriores a d8352da196349182e1afd5a93308256cddc0a97d · 783112f7401ff449d979530209b3f6c2594fdb4e y anteriores a 44086254479035de42ca3d286ecf25521d4e6325 · 783112f7401ff449d979530209b3f6c2594fdb4e y anteriores a b778e0e0a16759f22a70579c3cf8d254a40d4a7f · 604a3c407026d6162d15300478e63f901e435efc · cc4d5dc73841b98d33cdfb9822d70b0aac4beca5 · 3ee4f442e5b37a537297b812557b1163f96b5399 · a3c6cbc4eac4473ed5461d5faae2794d3e5c0e44
- Linux Afectadas: 4.11 No afectadas: 6.1.191 · 6.6.160 · 6.12.109 · 6.18.50 · 7.2.4 · 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/0669861a2e8e2bdb9c1149417d8ad821996ae4fe
- Referencia en git.kernel.orggit.kernel.org/stable/c/52d0c5bdfe232c9974d4b11f97078b9c7814f05d
- Referencia en git.kernel.orggit.kernel.org/stable/c/3afa17d93ba8c925f49370c816c6dae5112d8c24
- Referencia en git.kernel.orggit.kernel.org/stable/c/d8352da196349182e1afd5a93308256cddc0a97d
- Referencia en git.kernel.orggit.kernel.org/stable/c/44086254479035de42ca3d286ecf25521d4e6325
- Referencia en git.kernel.orggit.kernel.org/stable/c/b778e0e0a16759f22a70579c3cf8d254a40d4a7f
Ver el texto original en inglés (CVE.org)
NFSD: check truncate permission under inode lock
In the Linux kernel, the following vulnerability has been resolved: NFSD: check truncate permission under inode lock nfsd_setattr() checks whether a size update needs NFSD_MAY_TRUNC before it takes inode_lock(). The comparison uses the file size sampled by that unlocked read, but the actual ATTR_SIZE update is applied later under inode_lock() by notify_change(). This leaves a TOCTOU window for append-only files. If a client sends a SETATTR that does not shrink the file at the time of the unlocked sample, a concurrent append can extend the file before nfsd_setattr() takes inode_lock(). notify_change() then applies a real truncation without the NFSD_MAY_TRUNC check that rejects IS_APPEND(inode). The VFS truncate syscall paths perform their own append-only checks before calling notify_change(), so NFSD must make this decision against the locked size it is about to change. Split the write-count acquisition from the truncation permission check. Keep get_write_access() before the locked setattr work, then recheck whether the requested size is below i_size_read(inode) after inode_lock() has been acquired and before notify_change(ATTR_SIZE). This also avoids the plain unlocked inode->i_size load.