Instituto Nacional de ciberseguridad. Sección Incibe
Instituto Nacional de Ciberseguridad. Sección INCIBE-CERT

Vulnerabilidad en kernel de Linux (CVE-2024-47679)

Gravedad CVSS v3.1:
MEDIA
Tipo:
CWE-362 Ejecución concurrente utilizando recursos compartidos con una incorrecta sincronización (Condición de carrera)
Fecha de publicación:
21/10/2024
Última modificación:
03/11/2025

Descripción

En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: vfs: arregla la ejecución entre evice_inodes() y find_inode()&iput() Hola a todos Recientemente noté un error[1] en btrfs, después de investigarlo y creo que es una ejecución en vfs. Supongamos que hay un inodo (es decir, ino 261) con i_count 1 que es llamado por iput(), y hay un hilo concurrente que llama a generic_shutdown_super(). cpu0: cpu1: iput() // i_count es 1 ->spin_lock(inode) ->dec i_count a 0 ->iput_final() generic_shutdown_super() ->__inode_add_lru() ->evict_inodes() // por alguna razón[2] ->if (atomic_read(inode->i_count)) continue; // regresar antes // el inodo 261 pasó la verificación anterior // list_lru_add_obj() // y luego programar la salida ->spin_unlock() // nota aquí: el inodo 261 // todavía estaba en la lista sb y la lista hash, // y I_FREEING|I_WILL_FREE no se había establecido btrfs_iget() // después de algunas llamadas de función ->find_inode() // encontró el inodo 261 anterior ->spin_lock(inode) // verificó I_FREEING|I_WILL_FREE // y pasó ->__iget() ->spin_unlock(inode) // programó de regreso ->spin_lock(inode) // verificó los indicadores (I_NEW|I_FREEING|I_WILL_FREE), // pasó y estableció I_FREEING iput() ->spin_unlock(inode) ->spin_lock(inode) ->evict() // dec i_count a 0 ->iput_final() ->spin_unlock() ->evict() Ahora, tenemos dos subprocesos expulsando simultáneamente el mismo inodo, lo que puede activar la declaración BUG(inode->i_state & I_CLEAR) tanto dentro de clear_inode() como de iput(). Para corregir el error, vuelva a verificar inode->i_count después de mantener i_lock. Porque en la mayoría de los escenarios, la primera verificación es válida y se puede reducir la sobrecarga de spin_lock(). Si hay algún malentendido, hágamelo saber, gracias. [1]: https://lore.kernel.org/linux-btrfs/000000000000eabe1d0619c48986@google.com/ [2]: La razón podría ser 1. SB_ACTIVE fue eliminado o 2. mapping_shrinkable() devolvió falso cuando reproduje el error.

Productos y versiones vulnerables

CPE Desde Hasta
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 2.6.37 (incluyendo) 5.10.227 (excluyendo)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 5.11 (incluyendo) 5.15.168 (excluyendo)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 5.16 (incluyendo) 6.1.113 (excluyendo)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 6.2 (incluyendo) 6.6.54 (excluyendo)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 6.7 (incluyendo) 6.10.13 (excluyendo)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 6.11 (incluyendo) 6.11.2 (excluyendo)