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

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

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

Descripción

En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: KVM: arm64: deshacerse de userspace_irqchip_in_use El uso inadecuado de userspace_irqchip_in_use provocó que syzbot ejecutara el siguiente WARN_ON() en kvm_timer_update_irq(): ADVERTENCIA: CPU: 0 PID: 3281 en arch/arm64/kvm/arch_timer.c:459 kvm_timer_update_irq+0x21c/0x394 Rastreo de llamadas: kvm_timer_update_irq+0x21c/0x394 arch/arm64/kvm/arch_timer.c:459 kvm_timer_vcpu_reset+0x158/0x684 arch/arm64/kvm/arch_timer.c:968 kvm_reset_vcpu+0x3b4/0x560 arch/arm64/kvm/reset.c:264 kvm_vcpu_set_target arch/arm64/kvm/arm.c:1553 [en línea] kvm_arch_vcpu_ioctl_vcpu_init arch/arm64/kvm/arm.c:1573 [en línea] kvm_arch_vcpu_ioctl+0x112c/0x1b3c arch/arm64/kvm/arm.c:1695 kvm_vcpu_ioctl+0x4ec/0xf74 virt/kvm/kvm_main.c:4658 vfs_ioctl fs/ioctl.c:51 [en línea] __do_sys_ioctl fs/ioctl.c:907 [en línea] __se_sys_ioctl fs/ioctl.c:893 [en línea] __arm64_sys_ioctl+0x108/0x184 fs/ioctl.c:893 __invoke_syscall arch/arm64/kernel/syscall.c:35 [en línea] anybody_syscall+0x78/0x1b8 another_syscall arch/arm64/kernel/syscall.c:49 another_svc_common+0xe8/0x1b0 another_syscall arch/arm64/kernel/syscall.c:132 another_svc+0x40/0x50 another_syscall arch/arm64/kernel/syscall.c:151 another_svc+0x54/0x14c arch/arm64/kernel/entry-common.c:712 el0t_64_sync_handler+0x84/0xfc arch/arm64/kernel/entry-common.c:730 el0t_64_sync+0x190/0x194 arch/arm64/kernel/entry.S:598 La siguiente secuencia condujo al escenario: - El espacio de usuario crea una VM y una vCPU. - La vCPU se inicializa con KVM_ARM_VCPU_PMU_V3 durante KVM_ARM_VCPU_INIT. - Sin ninguna otra configuración, como vGIC o vPMU, el espacio de usuario emite KVM_RUN en la vCPU. Dado que se solicita la vPMU, pero no se configura, kvm_arm_pmu_v3_enable() falla en kvm_arch_vcpu_run_pid_change(). Como resultado, KVM_RUN regresa después de habilitar el temporizador, pero antes de incrementar 'userspace_irqchip_in_use': kvm_arch_vcpu_run_pid_change() ret = kvm_arm_pmu_v3_enable() if (!vcpu->arch.pmu.created) return -EINVAL; if (ret) return ret; [...] if (!irqchip_in_kernel(kvm)) static_branch_inc(&userspace_irqchip_in_use); - Userspace ignora el error y emite KVM_ARM_VCPU_INIT nuevamente. Como el temporizador ya está habilitado, el control se mueve a través del siguiente flujo, y finalmente llega a WARN_ON(): kvm_timer_vcpu_reset() if (timer->enabled) kvm_timer_update_irq() if (!userspace_irqchip()) ret = kvm_vgic_inject_irq() ret = vgic_lazy_init() if (unlikely(!vgic_initialized(kvm))) if (kvm->arch.vgic.vgic_model != KVM_DEV_TYPE_ARM_VGIC_V2) return -EBUSY; WARN_ON(ret); Teóricamente, dado que la funcionalidad de userspace_irqchip_in_use se puede reemplazar simplemente por '!irqchip_in_kernel()', deshágase de la clave estática para evitar la mala administración, lo que también ayuda con el problema de syzbot.

Impacto