CVE-2026-98468
En el kernel de Linux se ha resuelto la siguiente vulnerabilidad:
KVM: arm64: Corregir una advertencia espuria por una condición de carrera benigna durante la destrucción de la segunda etapa
Se usó kvmtool para establecer un invitado L1 con 8 CPU y 8 GiB de RAM, un invitado L2 con 4 CPU y 4 GiB de RAM y un invitado L3 con 2 CPU y 2 GiB de RAM, todos los cuales fueron finalizados después.
Bajo presión de memoria en el host L0 se observaron advertencias debidas a la migración desencadenada por la compactación:
La cual, a su vez, fue desencadenada por una notificación MMU para la invalidación del host:
Leer descripción completaMostrar menos
En competencia con la destrucción por parte de L0 de las tablas de páginas de la segunda etapa:
Resulta que existe una condición de carrera benigna que provoca una advertencia espuria:
Hilo A - notificación: migración | Hilo B - notificación: liberación -------------------------------|--------------------------------- < kvm->mmu_lock retenido > | stage2_apply_range() | obtiene mmu->pgt, comprueba !NULL | ... | kvm_arch_flush_shadow_all() cond_resched_rwlock_write(); | < contención, duerme kvm->mmu_lock > < libera kvm->mmu_lock > | < adquiere kvm->mmu_lock > | ... | kvm_free_stage2_pgd() | mmu->pgt = NULL | < invalida la MMU > | ... | < libera kvm->mmu_lock > [ planificado ] | stage2_apply_range() | < bucle al siguiente > | obtiene mmu->pgt, comprueba !NULL | es NULL, devuelve -EINVAL | __unmap_stage2_range() | WARN_ON(-EINVAL) <--- totalmente espuria: la carrera se gestionó correctamente.
Corregir la advertencia espuria actualizando stage2_apply_range() para que ya no trate la destrucción concurrente de las tablas de páginas al liberar el cerrojo como un error; tanto si el recorrido está destruyendo las tablas de páginas como si hace otra cosa, esto es un motivo legítimo para abortar la operación sin error.
Así se mantiene la advertencia para todas las demás circunstancias.
En la práctica, solo __unmap_stage2_range() hace realmente algo con el error, por lo que esto solo afecta a esa función.
Detalles técnicos trazas, registros y código del informe original
WARNING: arch/arm64/kvm/mmu.c:336 at __unmap_stage2_range+0x64/0x80,
CPU#5: kcompactd0/66
mmu_notifier_invalidate_range_start()
-> ... -> kvm_mmu_notifier_invalidate_range_start()
-> kvm_mmu_unmap_gfn_range()
-> kvm_unmap_gfn_range()
-> kvm_nested_s2_unmap()
-> kvm_stage2_unmap_range()
-> __unmap_stage2_range()
-> stage2_apply_range()
<- -EINVAL, lo que desencadena un WARN_ON()
exit_mm()
-> mmput()
-> __mmput()
-> exit_mmap()
-> mmu_notifier_release()
-> ... -> kvm_mmu_notifier_release()
-> kvm_flush_shadow_all()
-> kvm_arch_flush_shadow_all()
-> kvm_free_stage2_pgd()
-> [ adquiere kvm->mmu_lock para escritura ]
-> mmu->pgt = NULL [ entre otras tareas ]
-> [ libera kvm->mmu_lock para escritura ]Traducción automática del texto original de NVD (en inglés).
CVSS
NVD no ha asignado puntuación CVSS a esta CVE (habitual desde el cambio de política de abril de 2026).
Probabilidad de explotación (EPSS)
- Probabilidad de explotación en los próximos 30 días
- 0.20 %
- Percentil entre todas las CVEs puntuadas
- 9
- Fecha de la puntuación
- 20/10/2026
EPSS (Exploit Prediction Scoring System, de FIRST) estima la probabilidad de que una vulnerabilidad sea explotada en 30 días. Complementa a CVSS (impacto) y a CISA KEV (explotación confirmada).
Tecnologías afectadas (1)
⚠ Inferidas por IA a partir de la descripción — NVD aún no ha analizado esta CVE; no son CPE verificados.
Referencias
Mostrar las 4 referencias
JSON original (NVD)
Mostrar
{
"id": "CVE-2026-98468",
"cveTags": [],
"metrics": {},
"affected": [
{
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
"affectedData": [
{
"repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
"vendor": "Linux",
"product": "Linux",
"versions": [
{
"status": "affected",
"version": "ec14c272408af43d392f65f55e66f3b94fc61921",
"lessThan": "f44a92633136b409ebb9b7036fceb7e11de60a20",
"versionType": "git"
},
{
"status": "affected",
"version": "ec14c272408af43d392f65f55e66f3b94fc61921",
"lessThan": "c23ed110d27ba99cf3a881986514f79aacedf476",
"versionType": "git"
},
{
"status": "affected",
"version": "ec14c272408af43d392f65f55e66f3b94fc61921",
"lessThan": "330346dda3bf5f8a3b06723024f7d906326270cf",
"versionType": "git"
},
{
"status": "affected",
"version": "ec14c272408af43d392f65f55e66f3b94fc61921",
"lessThan": "38b70fc453c3112f1a62583b89903ae41116cc27",
"versionType": "git"
}
],
"programFiles": [
"arch/arm64/kvm/mmu.c"
],
"defaultStatus": "unaffected"
},
{
"repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
"vendor": "Linux",
"product": "Linux",
"versions": [
{
"status": "affected",
"version": "6.11"
},
{
"status": "unaffected",
"version": "0",
"lessThan": "6.11",
"versionType": "semver"
},
{
"status": "unaffected",
"version": "6.12.112",
"versionType": "semver",
"lessThanOrEqual": "6.12.*"
},
{
"status": "unaffected",
"version": "6.18.55",
"versionType": "semver",
"lessThanOrEqual": "6.18.*"
},
{
"status": "unaffected",
"version": "7.2.9",
"versionType": "semver",
"lessThanOrEqual": "7.2.*"
},
{
"status": "unaffected",
"version": "7.3",
"versionType": "original_commit_for_fix",
"lessThanOrEqual": "*"
}
],
"programFiles": [
"arch/arm64/kvm/mmu.c"
],
"defaultStatus": "affected"
}
]
}
],
"published": "2026-10-18T16:16:57.293",
"references": [
{
"url": "https://git.kernel.org/stable/c/330346dda3bf5f8a3b06723024f7d906326270cf",
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
},
{
"url": "https://git.kernel.org/stable/c/38b70fc453c3112f1a62583b89903ae41116cc27",
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
},
{
"url": "https://git.kernel.org/stable/c/c23ed110d27ba99cf3a881986514f79aacedf476",
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
},
{
"url": "https://git.kernel.org/stable/c/f44a92633136b409ebb9b7036fceb7e11de60a20",
"source": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
}
],
"vulnStatus": "Received",
"descriptions": [
{
"lang": "en",
"value": "In the Linux kernel, the following vulnerability has been resolved:\n\nKVM: arm64: Fix spurious warning for benign stage 2 teardown race\n\nkvmtool was used to establish an L1 guest with 8 CPUs and 8 GiB of RAM, an\nL2 guest with 4 CPUs and 4 GiB of RAM and an L3 guest with 2 CPUs and 2 GiB\nof RAM, all of which was then exited.\n\nUnder memory pressure in the L0 host warnings were observed due to\nmigration triggered by compaction:\n\nWARNING: arch/arm64/kvm/mmu.c:336 at __unmap_stage2_range+0x64/0x80,\nCPU#5: kcompactd0/66\n\nWhich was, in turn, triggered by an MMU notifier for the host invalidation:\n\nmmu_notifier_invalidate_range_start()\n -> ... -> kvm_mmu_notifier_invalidate_range_start()\n -> kvm_mmu_unmap_gfn_range()\n -> kvm_unmap_gfn_range()\n -> kvm_nested_s2_unmap()\n -> kvm_stage2_unmap_range()\n -> __unmap_stage2_range()\n -> stage2_apply_range()\n \t <- -EINVAL, triggering a WARN_ON()\n\nRacing with L0's teardown of stage 2 page tables:\n\nexit_mm()\n -> mmput()\n -> __mmput()\n -> exit_mmap()\n -> mmu_notifier_release()\n\t -> ... -> kvm_mmu_notifier_release()\n -> kvm_flush_shadow_all()\n -> kvm_arch_flush_shadow_all()\n\t -> kvm_free_stage2_pgd()\n\t\t -> [ acquire kvm->mmu_lock for write ]\n\t\t -> mmu->pgt = NULL [ among other tasks ]\n\t\t -> [ release kvm->mmu_lock for write ]\n\nIt turns out there is a benign race resulting in a spurious warning:\n\n\tThread A - notify: migration | Thread B - notify: release\n\t-------------------------------|---------------------------------\n\t< kvm->mmu_lock held > |\n\tstage2_apply_range() |\n\t get mmu->pgt, check !NULL |\n\t ... | kvm_arch_flush_shadow_all()\n\t cond_resched_rwlock_write(); | < contend, sleep kvm->mmu_lock >\n\t< drop kvm->mmu_lock > | < acquire kvm->mmu_lock>\n | ...\n\t\t\t\t | kvm_free_stage2_pgd()\n | mmu->pgt = NULL\n\t\t\t\t | < invalidate MMU >\n\t\t\t\t | ...\n\t\t\t\t | < release kvm->mmu_lock >\n\t[ scheduled ]\t\t |\n\tstage2_apply_range() |\n\t < loop to next > |\n\t get, mmu->pgt, check !NULL |\n\t is NULL, return -EINVAL |\n __unmap_stage2_range() |\n\t WARN_ON(-EINVAL) <--- entirely spurious - the race was handled\n correctly.\n\nFix the spurious warning by updating stage2_apply_range() to no longer\ntreat concurrent PGT teardown on lock release as an error - whether the\nwalker is tearing down page tables or doing something else this is a\nlegitimate reason to abort the operation without error.\n\nThis keeps the warning in place for all other circumstances.\n\nIn practice only __unmap_stage2_range() actually does anything with the\nerror so this only impacts that."
}
],
"lastModified": "2026-10-19T10:18:56.957",
"sourceIdentifier": "416baaa9-dc9f-4396-8d5f-8c081fb06d67"
}