CVE-2025-21664

In the Linux kernel, the following vulnerability has been resolved: dm thin: make get_first_thin use rcu-safe list first function The documentation in rculist.h explains the absence of list_empty_rcu() and cautions programmers against relying on a list_empty() -> list_first() sequence in RCU safe code. This is because each of these functions performs its own READ_ONCE() of the list head. This can lead to a situation where the list_empty() sees a valid list entry, but the subsequent list_first() sees a different view of list head state after a modification. In the case of dm-thin, this author had a production box crash from a GP fault in the process_deferred_bios path. This function saw a valid list head in get_first_thin() but when it subsequently dereferenced that and turned it into a thin_c, it got the inside of the struct pool, since the list was now empty and referring to itself. The kernel on which this occurred printed both a warning about a refcount_t being saturated, and a UBSAN error for an out-of-bounds cpuid access in the queued spinlock, prior to the fault itself. When the resulting kdump was examined, it was possible to see another thread patiently waiting in thin_dtr's synchronize_rcu. The thin_dtr call managed to pull the thin_c out of the active thins list (and have it be the last entry in the active_thins list) at just the wrong moment which lead to this crash. Fortunately, the fix here is straight forward. Switch get_first_thin() function to use list_first_or_null_rcu() which performs just a single READ_ONCE() and returns NULL if the list is already empty. This was run against the devicemapper test suite's thin-provisioning suites for delete and suspend and no regressions were observed.
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:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:3.15:-:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:3.15:rc4:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:3.15:rc5:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:3.15:rc6:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:3.15:rc7:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:3.15:rc8:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.13:rc1:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.13:rc2:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.13:rc3:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.13:rc4:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.13:rc5:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.13:rc6:*:*:*:*:*:*

History

03 Nov 2025, 21:19

Type Values Removed Values Added
References
  • () https://lists.debian.org/debian-lts-announce/2025/03/msg00001.html -
  • () https://lists.debian.org/debian-lts-announce/2025/03/msg00002.html -

26 Sep 2025, 16:18

Type Values Removed Values Added
References () https://git.kernel.org/stable/c/12771050b6d059eea096993bf2001da9da9fddff - () https://git.kernel.org/stable/c/12771050b6d059eea096993bf2001da9da9fddff - Patch
References () https://git.kernel.org/stable/c/6b305e98de0d225ccebfb225730a9f560d28ecb0 - () https://git.kernel.org/stable/c/6b305e98de0d225ccebfb225730a9f560d28ecb0 - Patch
References () https://git.kernel.org/stable/c/802666a40c71a23542c43a3f87e3a2d0f4e8fe45 - () https://git.kernel.org/stable/c/802666a40c71a23542c43a3f87e3a2d0f4e8fe45 - Patch
References () https://git.kernel.org/stable/c/80f130bfad1dab93b95683fc39b87235682b8f72 - () https://git.kernel.org/stable/c/80f130bfad1dab93b95683fc39b87235682b8f72 - Patch
References () https://git.kernel.org/stable/c/cbd0d5ecfa390ac29c5380200147d09c381b2ac6 - () https://git.kernel.org/stable/c/cbd0d5ecfa390ac29c5380200147d09c381b2ac6 - Patch
References () https://git.kernel.org/stable/c/cd30a3960433ec2db94b3689752fa3c5df44d649 - () https://git.kernel.org/stable/c/cd30a3960433ec2db94b3689752fa3c5df44d649 - Patch
References () https://git.kernel.org/stable/c/ec037fe8c0d0f6140e3d8a49c7b29cb5582160b8 - () https://git.kernel.org/stable/c/ec037fe8c0d0f6140e3d8a49c7b29cb5582160b8 - Patch
CWE NVD-CWE-noinfo
First Time Linux linux Kernel
Linux
CVSS v2 : unknown
v3 : unknown
v2 : unknown
v3 : 5.5
CPE cpe:2.3:o:linux:linux_kernel:6.13:rc3:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.13:rc2:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:3.15:rc4:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.13:rc1:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:3.15:rc6:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:3.15:-:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:3.15:rc7:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.13:rc4:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.13:rc5:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:3.15:rc8:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.13:rc6:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:3.15:rc5:*:*:*:*:*:*

02 Feb 2025, 11:15

Type Values Removed Values Added
References
  • () https://git.kernel.org/stable/c/cd30a3960433ec2db94b3689752fa3c5df44d649 -
  • () https://git.kernel.org/stable/c/ec037fe8c0d0f6140e3d8a49c7b29cb5582160b8 -

23 Jan 2025, 17:15

Type Values Removed Values Added
Summary
  • (es) En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: dm thin: hacer que get_first_thin use la función list first de rcu-safe La documentación en rculist.h explica la ausencia de list_empty_rcu() y advierte a los programadores que no confíen en una secuencia list_empty() -> list_first() en el código seguro de RCU. Esto se debe a que cada una de estas funciones realiza su propio READ_ONCE() del encabezado de la lista. Esto puede llevar a una situación en la que list_empty() ve una entrada de lista válida, pero el list_first() posterior ve una vista diferente del estado del encabezado de lista después de una modificación. En el caso de dm-thin, este autor tuvo un bloqueo del cuadro de producción debido a una falla de GP en la ruta process_deferred_bios. Esta función vio un encabezado de lista válido en get_first_thin() pero cuando posteriormente desreferenciaba eso y lo convertía en un thin_c, obtuvo el interior del grupo de estructuras, ya que la lista ahora estaba vacía y se refería a sí misma. El núcleo en el que esto ocurrió imprimió una advertencia sobre la saturación de un refcount_t y un error UBSAN por un acceso a cpuid fuera de los límites en el spinlock en cola, antes del fallo en sí. Cuando se examinó el kdump resultante, fue posible ver otro hilo esperando pacientemente en elsynchronous_rcu de thin_dtr. La llamada thin_dtr logró sacar el thin_c de la lista de thins activa (y hacer que sea la última entrada en la lista de active_thins) justo en el momento equivocado, lo que provocó este bloqueo. Afortunadamente, la solución aquí es sencilla. Cambie la función get_first_thin() para usar list_first_or_null_rcu() que realiza solo un único READ_ONCE() y devuelve NULL si la lista ya está vacía. Esto se ejecutó contra las suites de aprovisionamiento fino del conjunto de pruebas devicemapper para eliminar y suspender y no se observaron regresiones.
References
  • () https://git.kernel.org/stable/c/802666a40c71a23542c43a3f87e3a2d0f4e8fe45 -

21 Jan 2025, 13:15

Type Values Removed Values Added
New CVE

Information

Published : 2025-01-21 13:15

Updated : 2025-11-03 21:19


NVD link : CVE-2025-21664

Mitre link : CVE-2025-21664

CVE.ORG link : CVE-2025-21664


JSON object : View

Products Affected

linux

  • linux_kernel