X-Ops

Zapscape CVE-2026-64561: el tercer escape de KVM del año y el shadow MMU bajo ataque sistemático

El seis de agosto de 2026, el investigador de seguridad Hyunwoo Kim —conocido en línea como `@v4bel`— divulgó CVE-2026-64561, una vulnerabilidad de use-after-free en la unidad de gestión de memoria shadow del hipervisor KVM de Linux. El bug, bautizado públicamente como **Zapscape** por su descubridor, permite que una máquina virtual invitada con privilegios escape del límite de aislamiento de KVM y ejecute código como root en el kernel del host. La corrección upstream fue fusionada en el kernel de Linux el 21 de julio y backporteada a distribuciones de fabricantes a lo largo de la primera semana de agosto.

Este es el tercer escape público de guest a host de KVM del mismo investigador en tres meses. ITScape (CVE-2026-46316) se divulgó en junio, Januscape (CVE-2026-53359) en julio y ahora Zapscape en agosto. Los tres bugs comparten un área común —el shadow MMU de KVM y los caminos de código de virtualización anidada— pero cada uno es una causa raíz distinta con su propio parche. Tratar el aviso de este mes como un refrito de los bugs previos sería un error serio. El patrón es en sí mismo una señal: el shadow MMU de KVM está bajo revisión adversarial sostenida y sistemática, y los equipos de plataforma que ejecutan KVM a escala necesitan prestar atención.

Este artículo recorre qué es Zapscape, cómo funciona a nivel técnico, quién está expuesto y qué deben hacer los equipos de plataforma y seguridad en las próximas 48 horas.

Qué es realmente CVE-2026-64561

CVE-2026-64561 es un use-after-free en el camino de zap recursivo que KVM utiliza al reclamar páginas shadow. Los caminos de código relevantes son `direct_page_fault()` y la plantilla `FNAME(page_fault)` que respalda tanto al manejador de page fault regular como al de virtualización anidada. Ambas funciones llaman a `is_page_fault_stale()` para validar la raíz del MMU actual antes de invocar a `make_mmu_pages_available()` para reclamar páginas del MMU. El orden es el bug: la verificación de obsolescencia ocurre antes de la llamada que puede reclamar la propia raíz que se acaba de validar.

Cuando `make_mmu_pages_available()` se ejecuta, puede liberar la raíz que `is_page_fault_stale()` había marcado como válida. KVM entonces continúa construyendo mapeos o extrayendo entradas PTE bajo una raíz que ya ha sido reclamada. El efecto aguas abajo es que KVM puede escribir o leer memoria del kernel que ya no está semánticamente adjunta a un contexto MMU vivo. Con control cuidadoso sobre la reutilización de la memoria liberada, un atacante puede construir una primitiva de escritura en el espacio de direcciones del kernel del host.

El parche —fusionado como commit **2abd5287f083**— mueve la verificación de obsolescencia a **después** de `make_mmu_pages_available()`. Si la reclamación ha invalidado la raíz actual, KVM ahora retorna `RET_PF_RETRY` para reiniciar el fault en lugar de continuar bajo la raíz inválida.

Línea de tiempo de divulgación

La divulgación avanzó con una cadencia rápida y disciplinada. Kim reportó el problema a `security@kernel.org` el 11 de julio de 2026. Se publicó y fusionó un parche en el kernel upstream el 21 de julio. El problema se envió a la lista linux-distros el 1 de agosto bajo un embargo de cinco días, y CVE-2026-64561 fue asignado el 4 de agosto. La divulgación pública siguió el 6 de agosto. CloudLinux emitió su aviso y envió paquetes parcheados a sus clientes el 7 de agosto, un día después de la divulgación. Esta línea de tiempo es notable porque tiene la misma forma que la de los dos bugs previos del mismo investigador —rápida respuesta upstream, embargo breve, divulgación pública rápida— y muestra que el proceso de seguridad del kernel upstream está funcionando bien para esta clase de bug. El reto para los operadores downstream es igualar esa cadencia.

Quién está expuesto

La vulnerabilidad solo es relevante cuando el shadow MMU de KVM está en el camino de código activo. Hay dos situaciones en las que eso ocurre:

1. **La virtualización anidada está habilitada** y se permite a la invitada L1 hospedar invitadas L2. El shadow MMU es lo que KVM usa para traducir direcciones físicas de invitada dentro del contexto de virtualización anidada L1. 2. **La CPU del host no tiene expuestas las extensiones de virtualización por hardware** de manera que permita tablas de páginas anidadas (EPT en Intel, NPT en AMD). En la práctica esto es raro en CPUs de servidor modernos, pero puede ocurrir en despliegues embebidos o especializados.

La nota de investigación de CloudLinux y el hilo de Hacker News observaron ambos que el KVM upstream tiene habilitado el parámetro de virtualización anidada por defecto tanto para Intel como para AMD desde Linux 4.20. Una distribución puede sobreescribir ese valor por defecto en cualquier dirección, pero la realidad práctica es que en un kernel upstream por defecto con KVM habilitado, la virtualización anidada puede estar activa a menos que alguien la haya desactivado explícitamente.

Restricciones adicionales estrechan aún más la población expuesta:

- **Sistemas AMD**: se ha demostrado una PoC pública de cadena completa usando SVM/NPT anidado. No hay condición adicional de hardware documentada. - **Sistemas Intel**: la PoC requiere que **ambas** longitudes de page-walk de EPT, 4 y 5, estén expuestas a la invitada L1. Hosts que exponen solo una de las dos longitudes no están demostrados directamente como explotables a través de este camino, aunque permanecen dentro del alcance de la clase más amplia de bugs del shadow MMU. - **Privilegio de invitada L1**: el escape demostrado requiere privilegio de nivel kernel dentro de la invitada L1. En la mayoría de sistemas operativos invitados eso significa root de invitada.

La combinación de estas restricciones significa que el perfil de despliegue de mayor riesgo es un proveedor de nube pública o hosting que expone virtualización anidada a sus inquilinos, o cualquier entorno donde usuarios no confiables pueden instanciar invitadas L1 que a su vez hospedan invitadas L2. La mayoría de despliegues de virtualización empresarial de propósito general no habilitan la virtualización anidada en absoluto y por lo tanto no están directamente expuestos a Zapscape a través de la PoC documentada. Sí están, sin embargo, expuestos a la clase más amplia de bugs del shadow MMU, y el patrón de tres escapes en tres meses aboga por desactivar la virtualización anidada donde no sea un requisito de negocio documentado.

El shadow MMU en contexto

KVM soporta dos implementaciones principales de MMU: el camino moderno asistido por hardware EPT/NPT, y el camino legacy emulado por software del shadow MMU. El shadow MMU precede a la disponibilidad generalizada de tablas de páginas anidadas en CPUs de servidor y se mantiene todavía por dos razones: es necesario para la virtualización anidada, y es el fallback cuando el paginado asistido por hardware no está disponible.

El trabajo del shadow MMU es traducir direcciones físicas de invitada a direcciones físicas del host manteniendo un conjunto paralelo de tablas de páginas que reflejan lo que la invitada cree que es la disposición de su memoria. Cuando la invitada modifica sus tablas de páginas, KVM intercepta la escritura y actualiza las entradas shadow correspondientes. Como la invitada puede estar ejecutando un workload complejo que toca muchas regiones de memoria rápidamente, el shadow MMU es sensible al rendimiento e históricamente ha sido un área donde se esconden bugs de correctitud. Los mantenedores de KVM han estado migrando caminos de código del shadow MMU a EPT/NPT de manera constante, pero el código shadow sigue en producción porque la virtualización anidada no puede correr sin él.

El hecho de que se hayan encontrado tres escapes de guest a host en tres meses por un investigador trabajando sobre el código del shadow MMU debe leerse como una indicación de que el área merece más atención, no menos.

Detección y caza

A diferencia de un CVE típico de aplicación web, un escape de hipervisor KVM no produce indicadores limpios de compromiso a nivel de aplicación. El código malicioso corre dentro de la invitada L1, dispara un fault dentro del kernel del host, y o bien bloquea el host o ejecuta código controlado por el atacante con privilegio de kernel del host. No hay una entrada de log que diga "invitada escapó" por defecto.

Lo que sí puedes cazar:

- **Bloqueos del kernel del host** en hosts KVM que se correlacionan en el tiempo con actividad no confiable de invitada L1. KVM a menudo imprimirá una advertencia antes del bloqueo si el shadow MMU detecta la corrupción. - **Módulos de kernel fuera del árbol o inesperados** cargados en hosts KVM tras un evento de root de invitada. Un exploit exitoso típicamente cargará un módulo de kernel o escribirá a un archivo persistente como parte de establecer acceso persistente al host. - **Drift de configuración** en `/etc/modprobe.d/kvm.conf`, `/etc/modprobe.d/kvm_intel.conf` o `/etc/modprobe.d/kvm_amd.conf`. Un atacante con root en el host puede re-habilitar la virtualización anidada o alterar parámetros del módulo para asegurar que el exploit siga siendo viable. - **Tráfico de egress** desde hosts KVM hacia destinos que no forman parte de flujos normales de backup, monitoreo o gestión de paquetes. Un exploit de kernel de host típicamente hará beacon hacia el exterior para C2 o intentará exfiltrar datos. - **Escrituras a disco** en `/boot`, `/etc` o directorios de módulos de kernel desde el userland del host KVM.

Consultas prácticas de caza para un SIEM o un backend de búsqueda de logs:

```sql -- Reinicios súbitos o kernel panics de hosts KVM en los últimos 30 días SELECT host, event_time, kernel_version FROM host_events WHERE event_type IN ('kernel_panic', 'unexpected_reboot', 'kvm_bug') AND event_time > now() - interval '30 days' ORDER BY event_time DESC;

-- Módulos de kernel nuevos en hosts KVM que no coinciden con baseline SELECT host, module_name, load_time FROM kernel_module_events WHERE host_role = 'kvm-host' AND module_name NOT IN (SELECT module_name FROM kernel_module_baseline WHERE host_role = 'kvm-host');

-- Egress desde hosts KVM hacia destinos no allowlisteados SELECT host, dst_ip, dst_port, bytes_out FROM netflow WHERE host_role = 'kvm-host' AND dst_ip NOT IN (SELECT ip FROM egress_allowlist) AND bytes_out > 1000000 ORDER BY bytes_out DESC; ```

Para organizaciones que disponen de los recursos, la señal de mayor fidelidad es un trace del kernel del host recogido vía `perf` o `bpf` que registre cada evento `kvm_exit` y `kvm_entry` correlacionado contra la identidad de la invitada. La corrupción del shadow MMU produce un patrón de acceso distintivo, y el tooling construido para investigación de seguridad de hipervisores puede adaptarse para detección en producción.

Mitigación y remediación

El playbook de mitigación para Zapscape es directo pero requiere disciplina operacional.

1. **Parchear el kernel del host.** Aplicar la corrección upstream (commit 2abd5287f083) o un backport del fabricante. Para la mayoría de distribuciones esto es un ciclo rutinario de `apt upgrade` o `dnf update`. Para organizaciones que ejecutan kernels personalizados o kernels de soporte de largo plazo que aún no tienen el backport, contactar con el fabricante para un ETA o planificar un backport manual. 2. **Auditar si la virtualización anidada es necesaria.** La mitigación de mayor impacto es desactivar la virtualización anidada en cada host KVM que no tenga un requisito de negocio documentado para ella. El ajuste relevante es el parámetro de módulo `nested` para `kvm_intel` o `kvm_amd`. Establecerlo a `N` en `/etc/modprobe.d/`. Esta es la misma mitigación recomendada para Januscape y sigue siendo la postura recomendada para la clase más amplia de bugs del shadow MMU. 3. **Validar que la virtualización anidada está realmente desactivada.** Un `cat /sys/module/kvm_intel/parameters/nested` o `cat /sys/module/kvm_amd/parameters/nested` debería devolver `0` o `N`. Un `1` o `Y` significa que el módulo cargado permite virtualización anidada, lo cual pone al host dentro de la superficie potencial de ataque. No prueba explotabilidad por sí solo, ya que el estado de parche del kernel, las capacidades de CPU del host, el modelo de CPU virtual expuesto a L1 y si una invitada no confiable puede crear L2 siguen importando. 4. **Para hosts que deben mantener la virtualización anidada habilitada**, asegurar que las invitadas L1 no puedan hospedar invitadas L2 no confiables. En la práctica esto significa un límite arquitectónico claro: virt anidada encendida para un laboratorio interno de pruebas o un entorno de CI controlado, apagada para cualquier carga multi-inquilino de cloud o hosting. 5. **Hosts Intel que deban mantener la virtualización anidada habilitada** deberían verificar que solo una de las longitudes de page-walk de EPT, 4 o 5, esté expuesta a las invitadas L1. Si ambas longitudes están expuestas, el camino de exploit Intel documentado es alcanzable.

La lección más amplia es que la virtualización anidada es una característica de nicho con un código base legacy complicado, y el patrón recurrente de escapes del shadow MMU aboga fuertemente por dejarla apagada donde sea posible.

El panorama mayor: tres escapes en tres meses

ITScape en junio, Januscape en julio, Zapscape en agosto. Cada uno es un bug distinto con un parche distinto, y no hay un parche único que cubra los tres. Lo que los une es el investigador y el área del kernel objetivo. El patrón importa porque nos dice que el shadow MMU de KVM está siendo auditado sistemáticamente por alguien con la habilidad de encontrar bugs reales, y que es probable que vengan más hallazgos en esta área.

Para equipos de plataforma, la implicación operacional es que el shadow MMU debería ser tratado como un área de parcheo de mayor prioridad de la que ha sido históricamente. Para equipos de seguridad, la implicación es que la caza por clase de bug alrededor de KVM y la virtualización anidada es una inversión productiva. Para fabricantes, la implicación es que los defaults de virtualización anidada y el mantenimiento continuo del shadow MMU merecen una mirada fresca.

La buena noticia es que la respuesta upstream a cada uno de los tres bugs ha sido rápida, los parches han sido limpios y el proceso de divulgación ha sido disciplinado. El reto es igualar esa cadencia en las capas de distribución downstream, infraestructura y operaciones.

Cierre

Zapscape no es el primer escape de KVM del año y no será el último. El mismo investigador ha producido tres en tres meses. Cada uno es un bug real que merece atención real. El playbook de mitigación se entiende bien: parchear el kernel, auditar si la virtualización anidada es necesaria y apagarla donde no lo sea. La pregunta más difícil es si las organizaciones deberían mantener la virtualización anidada habilitada en absoluto en 2026, dado el interés adversarial demostrado en el código subyacente. Para la mayoría de entornos productivos la respuesta es no. Para el pequeño número de entornos que genuinamente la necesitan —laboratorios internos, CI controlado, workloads específicos de investigación— la respuesta es sí, con el entendimiento de que el modelo de amenaza incluye la clase de bug del shadow MMU y la cadencia de parcheo tiene que estar a la altura.

Las fuentes verificadas son Maxinames (CloudLinux), Cyber Security News, TuxCare, Hacker News (Swati Khandelwal), Penligent y DesdeLinux.