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

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

Gravedad CVSS v3.1:
MEDIA
Tipo:
No Disponible / Otro tipo
Fecha de publicación:
30/07/2024
Última modificación:
03/11/2025

Descripción

En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: btrfs: corrige la adición de un grupo de bloques a una lista de recuperación y la lista no utilizada durante la recuperación. Existe una posible adición de lista paralela para volver a intentarlo en btrfs_reclaim_bgs_work y agregarla a la lista no utilizada. Dado que el grupo de bloques se elimina de la lista de recuperación y se encuentra en un trabajo de reubicación, se puede agregar a la lista no utilizada en paralelo. Cuando eso sucede, agregarlo a la lista de recuperación dañará el encabezado de la lista y provocará una corrupción en la lista como se muestra a continuación. Solucionarlo tomando fs_info->unused_bgs_lock. [177.504][T2585409] Error BTRFS (dispositivo nullb1): error al reubicar ch= unk 2415919104 [177.514][T2585409] corrupción list_del. siguiente->anterior debería ser ff1100= 0344b119c0, pero era ff11000377e87c70. (next=3Dff110002390cd9c0) [177.529][T2585409] ------------[ cortar aquí ]------------ [177.537][T2585409] ERROR del kernel en lib/ list_debug.c:65! [177.545][T2585409] Ups: código de operación no válido: 0000 [#1] PREEMPT SMP KASAN NOPTI [177.555][T2585409] CPU: 9 PID: 2585409 Comm: kworker/u128:2 Contaminado: GW 6.10.0-rc5-kts # 1 [177.568][T2585409] Nombre de hardware: Supermicro SYS-520P-WTR/X12SPW-TF, BIOS 1.2 14/02/2022 [177.579][T2585409] Cola de trabajo: events_unbound btrfs_reclaim_bgs_work[btrfs] [177.589][T2585409] QEPD: 0010 :__list_del_entry_valid_or_report.cold+0x70/0x72 [177.624][T2585409] RSP: 0018:ff11000377e87a70 EFLAGS: 00010286 [177.633][T2585409] RAX: 000000000000006d RBX: ff11000344b119c0 RCX:0000000000000000 [177.644][T2585409] RDX: 000000000000006d RSI: 0000000000000008 RDI :ffe21c006efd0f40 [177.655][T2585409] RBP: ff110002e0509f78 R08: 0000000000000001 R09:ffe21c006efd0f08 [177.665][T2585409] R10: 7847 R11: 0000000000000000 R12:ff110002390cd9c0 [177.676][T2585409] R13: ff11000344b119c0 R14: ff110002e0508000 R15:dffffc0000000000 [177. 687] [T2585409] FS: 0000000000000000(0000) GS:ff11000fec880000(0000) knlGS:0000000000000000 [177.700][T2585409] CS: 0010 DS: 0000 ES: 0000 CR0: 00000080050033 [177.709][T2585409] CR2: 00007f06bc7b1978 CR3: 0000001021e86005 CR4: 0000000000771ef0 [177.720][T2585409] DR0: 0000000000000000 DR1: 0000000000000000 DR2:0000000000000000 [177.731][T2585409] DR3: 00000000 DR6: 00000000fffe0ff0 DR7:0000000000000400 [177.742][T2585409] PKRU: 55555554 [177.748][T2585409] Seguimiento de llamadas: [ 177.753][T2585409] [177.759][T2585409] ? __die_body.cold+0x19/0x27 [177.766][T2585409] ? morir+0x2e/0x50 [177.772][T2585409] ? do_trap+0x1ea/0x2d0 [177.779][T2585409] ? __list_del_entry_valid_or_report.cold+0x70/0x72 [177.788][T2585409] ? do_error_trap+0xa3/0x160 [177.795][T2585409] ? __list_del_entry_valid_or_report.cold+0x70/0x72 [177.805][T2585409] ? handle_invalid_op+0x2c/0x40 [177.812][T2585409] ? __list_del_entry_valid_or_report.cold+0x70/0x72 [177.820][T2585409] ? exc_invalid_op+0x2d/0x40 [177.827][T2585409] ? asm_exc_invalid_op+0x1a/0x20 [177.834][T2585409] ? __list_del_entry_valid_or_report.cold+0x70/0x72 [177.843][T2585409] btrfs_delete_unused_bgs+0x3d9/0x14c0 [btrfs] Hay un código retry_list similar en btrfs_delete_unused_bgs(), pero es seguro, AFAICS. Dado que el grupo de bloques estaba en la lista no utilizada, los bytes usados deberían ser 0 cuando se agregó a la lista no utilizada. Luego, verifica que block_group->{used,reserved,pinned} todavía sean 0 bajo block_group->lock. Por lo tanto, aún deberían ser elegibles para la lista no utilizada, no para la lista de recuperación. La razón por la que es seguro allí es porque mantenemos space_info->groups_sem en modo de escritura. Eso significa que ninguna otra tarea puede asignar desde el grupo de bloques, por lo que mientras estamos en deleted_unused_bgs() no es posible que otras tareas asignen y desasignen extensiones del grupo de bloques, por lo que no se pueden agregar a la lista no utilizada ni a la reclamación. lista por cualquier otra persona. El error puede repro ---truncado---

Productos y versiones vulnerables

CPE Desde Hasta
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 6.1.96 (incluyendo) 6.1.98 (excluyendo)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 6.6.36 (incluyendo) 6.6.39 (excluyendo)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 6.9.7 (incluyendo) 6.9.9 (excluyendo)
cpe:2.3:o:linux:linux_kernel:5.15.162:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.10:rc5:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.10:rc6:*:*:*:*:*:*