Vulnerabilidad en kernel de Linux (CVE-2022-49850)
Gravedad CVSS v3.1:
MEDIA
Tipo:
No Disponible / Otro tipo
Fecha de publicación:
01/05/2025
Última modificación:
07/05/2025
Descripción
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: nilfs2: corregir bloqueo en nilfs_count_free_blocks() Un bloqueo de semáforo puede ocurrir si nilfs_get_block() detecta corrupción de metadatos mientras localiza bloques de datos y ocurre una escritura diferida de superbloque al mismo tiempo: tarea 1 tarea 2 ------ ------ * Una operación de archivo * nilfs_truncate() nilfs_get_block() down_read(rwsem A) <-- nilfs_bmap_lookup_contig() ... generic_shutdown_super() nilfs_put_super() * Preparar para escribir superbloque * down_write(rwsem B) <-- nilfs_cleanup_super() * Detectar corrupción de árbol b * nilfs_set_log_cursor() nilfs_bmap_convert_error() nilfs_count_free_blocks() __nilfs_error() down_read(rwsem A) <-- nilfs_set_error() down_write(rwsem B) <-- *** DEADLOCK *** Aquí, nilfs_get_block() vuelve a bloquear rwsem A (= NILFS_MDT(dat_inode)->mi_sem) y luego llama a nilfs_bmap_lookup_contig(), pero si falla debido a la corrupción de metadatos, se llama a __nilfs_error() desde nilfs_bmap_convert_error() dentro de la sección de bloqueo. Dado que __nilfs_error() llama a nilfs_set_error() a menos que el sistema de archivos sea de solo lectura y nilfs_set_error() intente bloquear la escritura de rwsem B (= nilfs->ns_sem) para reescribir exclusivamente el superbloque, la adquisición del bloqueo jerárquico se produce en el orden rwsem A -> rwsem B. Ahora bien, si otra tarea comienza a actualizar el superbloque, puede bloquear la escritura de rwsem B durante la secuencia de bloqueo anterior y puede bloquearse al intentar bloquear la lectura de rwsem A en nilfs_count_free_blocks(). Sin embargo, no es necesario tomar rwsem A en nilfs_count_free_blocks() porque, dentro de la sección de bloqueo, solo lee un único dato entero en una estructura compartida con nilfs_sufile_get_ncleansegs(). Esto ha sucedido después del commit aa474a220180 ("nilfs2: añadir variable local para almacenar en caché el número de segmentos limpios"), incluso antes de que se introdujera este error. Por lo tanto, esto resuelve el problema de interbloqueo simplemente eliminando el semáforo en nilfs_count_free_blocks().
Impacto
Puntuación base 3.x
5.50
Gravedad 3.x
MEDIA
Productos y versiones vulnerables
CPE | Desde | Hasta |
---|---|---|
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 2.6.38 (incluyendo) | 4.9.334 (excluyendo) |
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 4.10 (incluyendo) | 4.14.300 (excluyendo) |
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 4.15 (incluyendo) | 4.19.267 (excluyendo) |
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 4.20 (incluyendo) | 5.4.225 (excluyendo) |
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 5.5 (incluyendo) | 5.10.155 (excluyendo) |
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 5.11 (incluyendo) | 5.15.79 (excluyendo) |
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 5.16 (incluyendo) | 6.0.9 (excluyendo) |
cpe:2.3:o:linux:linux_kernel:6.1:rc1:*:*:*:*:*:* | ||
cpe:2.3:o:linux:linux_kernel:6.1:rc2:*:*:*:*:*:* | ||
cpe:2.3:o:linux:linux_kernel:6.1:rc3:*:*:*:*:*:* | ||
cpe:2.3:o:linux:linux_kernel:6.1:rc4:*:*:*:*:*:* |
Para consultar la lista completa de nombres de CPE con productos y versiones, ver esta página
Referencias a soluciones, herramientas e información
- https://git.kernel.org/stable/c/1d4ff73062096c21b47954d2996b4df259777bda
- https://git.kernel.org/stable/c/36ff974b0310771417c0be64b64aa221bd70d63d
- https://git.kernel.org/stable/c/3c89ca6d3dfa6c09c515807a7a97a521f5d5147e
- https://git.kernel.org/stable/c/8ac932a4921a96ca52f61935dbba64ea87bbd5dc
- https://git.kernel.org/stable/c/8b4506cff6630bb474bb46a2a75c31e533a756ba
- https://git.kernel.org/stable/c/abc082aac0d9b6b926038fc3adb7008306581be2
- https://git.kernel.org/stable/c/cb029b54953420f7a2d65100f1c5107f14411bdc
- https://git.kernel.org/stable/c/f0cc93080d4c09510b74ecba87fd778cca390bb1