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

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

Gravedad:
Pendiente de análisis
Tipo:
No Disponible / Otro tipo
Fecha de publicación:
28/12/2024
Última modificación:
28/12/2024

Descripción

En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: brd: aplazar la creación automática de discos hasta que la inicialización del módulo tenga éxito. Mi colega Wupeng encontró los siguientes problemas durante la inyección de fallas: ERROR: no se puede gestionar la falla de página para la dirección: fffffbfff809d073 PGD 6e648067 P4D 123ec8067 PUD 123ec4067 PMD 100e38067 PTE 0 Oops: Oops: 0000 [#1] PREEMPT SMP KASAN NOPTI CPU: 5 UID: 0 PID: 755 Comm: modprobe No contaminado 6.12.0-rc3+ #17 Nombre del hardware: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.1-2.fc37 04/01/2014 RIP: 0010:__asan_load8+0x4c/0xa0 ... Seguimiento de llamadas: blkdev_put_whole+0x41/0x70 bdev_release+0x1a3/0x250 blkdev_release+0x11/0x20 __fput+0x1d7/0x4a0 task_work_run+0xfc/0x180 syscall_exit_to_user_mode+0x1de/0x1f0 do_syscall_64+0x6b/0x170 entry_SYSCALL_64_after_hwframe+0x76/0x7e loop_init() está llamando a loop_add() después de que __register_blkdev() tenga éxito e ignora el error de disk_add() de loop_add(), ya que el error de loop_add() no es fatal y los discos creados correctamente ya están visibles para bdev_open().brd_init() actualmente está llamando a brd_alloc() antes de que __register_blkdev() tenga éxito y está liberando discos creados exitosamente cuando brd_init() devuelve un error. Esto puede causar UAF para los últimos dos casos: caso 1: T1: modprobe brd brd_init brd_alloc(0) // éxito add_disk disk_scan_partitions bdev_file_open_by_dev // asignar archivo fput // no se liberará hasta que regrese al espacio de usuario brd_alloc(1) // falló debido a un error de asignación de memoria inject // error la ruta para modprobe liberará el segmento de código // de regreso al espacio de usuario __fput blkdev_release bdev_release blkdev_put_whole bdev->bd_disk->fops->release // fops está liberado ahora, ¡UAF! caso 2: T1: T2: modprobe brd brd_init brd_alloc(0) // éxito open(/dev/ram0) brd_alloc(1) // error // ruta de error para modprobe close(/dev/ram0) ... /* UAF! */ bdev->bd_disk->fops->release Solucione este problema siguiendo lo que hace loop_init(). Además, vuelva a introducir brd_devices_mutex para ayudar a serializar las modificaciones a brd_list.

Impacto