| Added |
Translation |
|
Title: Linux, Description: En el kernel de Linux, la siguiente vulnerabilidad ha sido resuelta:
KVM: x86: Realizar escaneo IRR en __kvm_apic_update_irr incluso si PIR está vacío
Recurrir a apic_find_highest_vector() cuando PID.ON está establecido pero PIR resulta estar vacío, para reportar correctamente la interrupción pendiente más alta del IRR existente.
En una prueba de estrés de VM anidada, la siguiente ADVERTENCIA se activa en vmx_check_nested_events() cuando kvm_cpu_has_interrupt() reporta una interrupción pendiente pero la subsiguiente kvm_apic_has_interrupt() (que invoca vmx_sync_pir_to_irr() de nuevo) devuelve -1:
ADVERTENCIA: CPU: 99 PID: 57767 en arch/x86/kvm/vmx/nested.c:4449 vmx_check_nested_events+0x6bf/0x6e0 [kvm_intel]
Traza de Llamada:
kvm_check_and_inject_events
vcpu_enter_guest.constprop.0
vcpu_run
kvm_arch_vcpu_ioctl_run
kvm_vcpu_ioctl
__x64_sys_ioctl
do_syscall_64
entry_SYSCALL_64_after_hwframe
La causa raíz es una condición de carrera entre vmx_sync_pir_to_irr() en la vCPU objetivo y __vmx_deliver_posted_interrupt() en una vCPU remitente. El remitente realiza dos operaciones individualmente atómicas que no son una única transacción:
1. pi_test_and_set_pir(vector) -- establece el bit PIR
2. pi_test_and_set_on() -- establece PID.ON
El siguiente entrelazado desencadena el error:
vCPU remitente (IPI): vCPU objetivo (1ª sync_pir_to_irr):
B1: establecer PIR[vector]
A1: pi_clear_on()
A2: pi_harvest_pir() -> ve el bit B1
A3: xchg() -> consume el bit, PIR=0
(la 1ª sincronización devuelve el max_irr correcto)
B2: establecer PID.ON = 1
vCPU objetivo (2ª sync_pir_to_irr):
C1: pi_test_on() -> VERDADERO (de B2)
C2: pi_clear_on() -> ON=0
C3: pi_harvest_pir() -> PIR vacío
C4: max_irr = -1, retorno anticipado
IRR NO ESCANEADO
La interrupción no se pierde (reside en el IRR de la primera sincronización y se recupera en la siguiente iteración de vcpu_enter_guest()), pero el max_irr incorrecto causa una ADVERTENCIA espuria y un ciclo de VM-Enter/VM-Exit de L2 desperdiciado.
|