Vulnerabilidad en kernel de Linux (CVE-2024-41070)
Gravedad CVSS v3.1:
ALTA
Tipo:
CWE-416
Utilización después de liberación
Fecha de publicación:
29/07/2024
Última modificación:
22/08/2024
Descripción
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: KVM: PPC: Book3S HV: Prevenir UAF en kvm_spapr_tce_attach_iommu_group() Al informó un posible use after free (UAF) en kvm_spapr_tce_attach_iommu_group(). Busca `stt` en tablefd, pero luego continúa usándolo después de realizar fdput() en el fd devuelto. Después de fdput(), otro hilo puede cerrar el tablefd. El cierre llama a kvm_spapr_tce_release() y luego a release_spapr_tce_table() (a través de call_rcu()) que libera `stt`. Aunque hay llamadas a rcu_read_lock() en kvm_spapr_tce_attach_iommu_group(), no son suficientes para evitar la UAF, porque `stt` se usa fuera de las regiones bloqueadas. Con un retraso artificial después de fdput() y un programa de espacio de usuario que desencadena la ejecución, KASAN detecta la UAF: ERROR: KASAN: slab-use-after-free in kvm_spapr_tce_attach_iommu_group+0x298/0x720 [kvm] Lectura de tamaño 4 en dirección c000200027552c30 por tarea kvm-vfio/2505 CPU: 54 PID: 2505 Comm: kvm-vfio Not tainted 6.10.0-rc3-next-20240612-dirty #1 Nombre de hardware: 8335-GTH POWER9 0x4e1202 opal:skiboot-v6.5.3-35 -g1851b2a06 Seguimiento de llamadas de PowerNV: dump_stack_lvl+0xb4/0x108 (no confiable) print_report+0x2b4/0x6ec kasan_report+0x118/0x2b0 __asan_load4+0xb8/0xd0 kvm_spapr_tce_attach_iommu_group+0x298/0x720 [kvm] kvm_vfio_set_attr+0x524/0xac0 [kvm] kvm_device_ioctl+0x144/0x240 [kvm] sys_ioctl+0x62c/0x1810 system_call_exception+0x190/0x440 system_call_vectored_common+0x15c/0x2ec ... Liberado por la tarea 0: ... kfree+0xec/0x3e0 release_spapr_tce_table+0xd4/0x11c [rcu_core+0x568/0 x16a0 handle_softirqs+0x23c /0x920 do_softirq_own_stack+0x6c/0x90 do_softirq_own_stack+0x58/0x90 __irq_exit_rcu+0x218/0x2d0 irq_exit+0x30/0x80 arch_local_irq_restore+0x128/0x230 arch_local_irq_enable+0x1c/0x 30 cpuidle_enter_state+0x134/0x5cc cpuidle_enter+0x6c/0xb0 call_cpuidle+0x7c/0x100 do_idle+0x394 /0x410 cpu_startup_entry+0x60/0x70 start_secondary+0x3fc/0x410 start_secondary_prolog+0x10/0x14 Solucionarlo retrasando fdput() hasta que `stt` ya no esté en uso, que es efectivamente toda la función. Para mantener el parche mínimo, agregue una llamada a fdput() en cada una de las rutas de retorno existentes. El trabajo futuro puede convertir la función a limpieza de estilo goto o __cleanup. Con la solución implementada, el caso de prueba ya no activa la UAF.
Impacto
Puntuación base 3.x
7.80
Gravedad 3.x
ALTA
Productos y versiones vulnerables
CPE | Desde | Hasta |
---|---|---|
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 5.4.281 (excluyendo) | |
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 5.5 (incluyendo) | 5.10.223 (excluyendo) |
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 5.11 (incluyendo) | 5.15.164 (excluyendo) |
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 5.16 (incluyendo) | 6.1.101 (excluyendo) |
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 6.2 (incluyendo) | 6.6.42 (excluyendo) |
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 6.7 (incluyendo) | 6.9.11 (excluyendo) |
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/4cdf6926f443c84f680213c7aafbe6f91a5fcbc0
- https://git.kernel.org/stable/c/5f856023971f97fff74cfaf21b48ec320147b50a
- https://git.kernel.org/stable/c/82c7a4cf14aa866f8f7f09e662b02eddc49ee0bf
- https://git.kernel.org/stable/c/9975f93c760a32453d7639cf6fcf3f73b4e71ffe
- https://git.kernel.org/stable/c/a986fa57fd81a1430e00b3c6cf8a325d6f894a63
- https://git.kernel.org/stable/c/b26c8c85463ef27a522d24fcd05651f0bb039e47
- https://git.kernel.org/stable/c/be847bb20c809de8ac124431b556f244400b0491