CVE-2026-90040 in Linuxinformación

Resumen

por VulDB • 2026-09-17

En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:

KVM: SEV: Invalidar forzadamente VMSA SNP si su página gmem subyacente es eliminada (zapped)

Se conecta una llamada a `gmem_invalidate_range()` para las VMs SNP y se utiliza para forzar que los vCPUs recarguen/vuelvan a verificar el VMSA proporcionado por la invitada si la página gmem subyacente está siendo invalidada, por ejemplo, cuando se ejecuta PUNCH_HOLE. Se usa la misma lógica central para manejar las invalidaciones como lo hace VMX con la página de acceso APIC, ya que ambos conceptos son casi idénticos: insertar la dirección física de una página en la estructura de control del vCPU:

1. Tomar instantánea (snapshot) del contador de secuencia de invalidación 2. Obtener el pfn (en este caso desde guest_memfd) 3. Adquirir mmu_lock para lectura 4. Solicitar recarga si es necesario reintentar, de lo contrario confirmar el cambio.

Tenga en cuenta que la acción de volver a solicitar (#4) es necesaria ya que la lógica de reintento de KVM es imprecisa (fuzzy), es decir, puede generar falsos positivos. Si la página guest_memfd ha sido liberada, en algún momento una recarga posterior fallará al obtener un PFN desde guest_memfd, y KVM fallará con KVM_RUN. Si el reintento se debió a un falso positivo, KVM reintentará hasta que no haya eventos de notificador MMU relevantes (y reintentará en el bucle "externo", es decir, liberará bloqueos y programará la ejecución según sea necesario).

¡Nota #2! Tenga cuidado al invalidar VMSA cuando un memslot relevante se ELIMINA o MUEVE, ya que las invalidaciones en respuesta a PUNCH_HOLE dependen de los enlaces de memslots (KVM no sabe qué rangos GFN deben ser invalidados sin una vinculación). Y más importante aún, el mapeo de VMSA requiere un memslot; es decir, debe ser invalidado si sus memslots desaparecen, independientemente del estado del inode guest_memfd subyacente.

El fallo al invalidar control.vmsa_pa del vCPU (que es verificado por pre_sev_run()) puede impedir que KVM libere correctamente la página, ya que el firmware rechazará RMPUPDATE para reclamar la página con FAIL_INUSE si el vCPU se está ejecutando activamente, es decir, si la página VMSA está en uso. Esto a su vez conduce a un #PF (Page Fault) de RMP en el siguiente uso, ya que la página seguirá asignada a la VM SNP.

SEV-SNP: RMPUPDATE failed for PFN 78d198, pg_level: 1, ret: 3 SEV-SNP: PFN 0x78d198, RMP entry: [0xfff0000000144001 - 0x000000000000000f]
CPU: 3 UID: 0 PID: 31345 Comm: sev_snp_vmsa_pu Tainted: G U O Tainted: [U]=USER, [O]=OOT_MODULE
Hardware name: Google, Inc. Arcadia_IT_80/Arcadia_IT_80, BIOS 34.86.0-102 01/25/2026 Call Trace: <TASK> dump_stack_lvl+0x54/0x70 rmpupdate+0x12c/0x140 rmp_make_shared+0x3b/0x60 sev_gmem_invalidate+0xe0/0x170 [kvm_amd]
delete_from_page_cache_batch+0x1d8/0x220 truncate_inode_pages_range+0x120/0x3d0 kvm_gmem_fallocate+0x19a/0x270 [kvm]
vfs_fallocate+0x1bc/0x1f0 __x64_sys_fallocate+0x48/0x70 do_syscall_64+0x10a/0x480 entry_SYSCALL_64_after_hwframe+0x4b/0x53 RIP: 0033:0x496c7e </TASK> ------------[ cut here ]------------
SEV: Failed to update RMP entry for PFN 0x78d198 error -14 WARNING: arch/x86/kvm/svm/sev.c:5160 at sev_gmem_invalidate+0x126/0x170 [kvm_amd], CPU#3: sev_snp_vmsa_pu/31345
CPU: 3 UID: 0 PID: 31345 Comm: sev_snp_vmsa_pu Tainted: G U O Tainted: [U]=USER, [O]=OOT_MODULE
Hardware name: Google, Inc. Arcadia_IT_80/Arcadia_IT_80, BIOS 34.86.0-102 01/25/2026 RIP: 0010:sev_gmem_invalidate+0x12b/0x170 [kvm_amd]
Call Trace: <TASK> delete_from_page_cache_batch+0x1d8/0x220 truncate_inode_pages_range+0x120/0x3d0 kvm_gmem_fallocate+0x19a/0x270 [kvm]
vfs_fallocate+0x1bc/0x1f0 __x64_sys_fallocate+0x48/0x70 do_syscall_64+0x10a/0x480 entry_SYSCALL_64_after_hwframe+0x4b/0x53 RIP: 0033:0x496c7e </TASK> irq event stamp: 20689 hardirqs last enabled at (20699): [<ffffffff8e76092c>] __console_unlock+0x5c/0x60
hardirqs last disabled at (20708): [<ffffffff8e760911>] __console_unlock+0x41/0x60
softirqs last enabled at (20722): [<ffffffff8e6cd74e>] __irq_exit_rcu+0x7e/0x140
softirqs last disabled at (20717): [<ffffffff8e6cd74e>] __irq_exit_rcu+0x7e/0x140
---[ end trace 0000000000000000 ]---
BUG: unable to handle page fault for address: ffff99 ---truncated---

Be aware that VulDB is the high quality source for vulnerability data.

Responsable

Linux

Reservar

2026-09-11

Divulgación

2026-09-17

Moderación

aceptado

Artículo

VDB-405876

CPE

listo

EPSS

0.00000

KEV

no

Actividades

muy bajo

Fuentes

Want to stay up to date on a daily basis?

Enable the mail alert feature now!