CVE-2024-50250

In the Linux kernel, the following vulnerability has been resolved: fsdax: dax_unshare_iter needs to copy entire blocks The code that copies data from srcmap to iomap in dax_unshare_iter is very very broken, which bfoster's recent fsx changes have exposed. If the pos and len passed to dax_file_unshare are not aligned to an fsblock boundary, the iter pos and length in the _iter function will reflect this unalignment. dax_iomap_direct_access always returns a pointer to the start of the kmapped fsdax page, even if its pos argument is in the middle of that page. This is catastrophic for data integrity when iter->pos is not aligned to a page, because daddr/saddr do not point to the same byte in the file as iter->pos. Hence we corrupt user data by copying it to the wrong place. If iter->pos + iomap_length() in the _iter function not aligned to a page, then we fail to copy a full block, and only partially populate the destination block. This is catastrophic for data confidentiality because we expose stale pmem contents. Fix both of these issues by aligning copy_pos/copy_len to a page boundary (remember, this is fsdax so 1 fsblock == 1 base page) so that we always copy full blocks. We're not done yet -- there's no call to invalidate_inode_pages2_range, so programs that have the file range mmap'd will continue accessing the old memory mapping after the file metadata updates have completed. Be careful with the return value -- if the unshare succeeds, we still need to return the number of bytes that the iomap iter thinks we're operating on.
Configurations

Configuration 1 (hide)

OR cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.12:rc1:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.12:rc2:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.12:rc3:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.12:rc4:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.12:rc5:*:*:*:*:*:*

History

14 Nov 2024, 17:04

Type Values Removed Values Added
CWE NVD-CWE-noinfo
References () https://git.kernel.org/stable/c/50793801fc7f6d08def48754fb0f0706b0cfc394 - () https://git.kernel.org/stable/c/50793801fc7f6d08def48754fb0f0706b0cfc394 - Patch
References () https://git.kernel.org/stable/c/8e9c0f500b42216ef930f5c0d1703989a451913d - () https://git.kernel.org/stable/c/8e9c0f500b42216ef930f5c0d1703989a451913d - Patch
References () https://git.kernel.org/stable/c/9bc18bb476e50e32e5d08f2734d63d63e0fa528c - () https://git.kernel.org/stable/c/9bc18bb476e50e32e5d08f2734d63d63e0fa528c - Patch
References () https://git.kernel.org/stable/c/bdbc96c23197d773a7d1bf03e4f11de593b0ff28 - () https://git.kernel.org/stable/c/bdbc96c23197d773a7d1bf03e4f11de593b0ff28 - Patch
First Time Linux
Linux linux Kernel
CPE cpe:2.3:o:linux:linux_kernel:6.12:rc1:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.12:rc4:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.12:rc5:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.12:rc3:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.12:rc2:*:*:*:*:*:*
CVSS v2 : unknown
v3 : unknown
v2 : unknown
v3 : 7.1

12 Nov 2024, 13:56

Type Values Removed Values Added
Summary
  • (es) En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: fsdax: dax_unshare_iter necesita copiar bloques enteros El código que copia datos de srcmap a iomap en dax_unshare_iter está muy, muy roto, lo que los cambios recientes de fsx de bfoster han expuesto. Si la posición y la longitud pasadas a dax_file_unshare no están alineadas con un límite de fsblock, la posición y la longitud de iter en la función _iter reflejarán esta desalineación. dax_iomap_direct_access siempre devuelve un puntero al inicio de la página fsdax kmapped, incluso si su argumento pos está en el medio de esa página. Esto es catastrófico para la integridad de los datos cuando iter->pos no está alineado con una página, porque daddr/saddr no apuntan al mismo byte en el archivo que iter->pos. Por lo tanto, corrompemos los datos del usuario copiándolos en el lugar equivocado. Si iter->pos + iomap_length() en la función _iter no está alineado con una página, entonces no copiamos un bloque completo y solo rellenamos parcialmente el bloque de destino. Esto es catastrófico para la confidencialidad de los datos porque exponemos contenidos pmem obsoletos. Solucione ambos problemas alineando copy_pos/copy_len con un límite de página (recuerde, esto es fsdax, por lo que 1 fsblock == 1 página base) de modo que siempre copiemos bloques completos. Aún no hemos terminado: no hay ninguna llamada a invalidate_inode_pages2_range, por lo que los programas que tienen el rango de archivos mmap seguirán accediendo al mapeo de memoria anterior después de que se hayan completado las actualizaciones de metadatos del archivo. Tenga cuidado con el valor de retorno: si la anulación del uso compartido tiene éxito, aún necesitamos devolver la cantidad de bytes en los que el iter iomap cree que estamos operando.

09 Nov 2024, 11:15

Type Values Removed Values Added
New CVE

Information

Published : 2024-11-09 11:15

Updated : 2024-11-14 17:04


NVD link : CVE-2024-50250

Mitre link : CVE-2024-50250

CVE.ORG link : CVE-2024-50250


JSON object : View

Products Affected

linux

  • linux_kernel