O bug está precisamente em vgic_its_invalidate_cache(), que percorre o cache de tradução por ITS com xa_for_each() e chama vgic_put_irq() no ponteiro iterado, em vez de fazê-lo no valor retornado com segurança por xa_erase(). Vários contextos podem entrar nesta função sob diferentes bloqueios, então a condição de corrida é totalmente alcançável a partir de um convidado, misturando o manuseio de comandos ITS, uma escrita em GITS_CTLR e a limpeza de EnableLPIs em um redistribuidor
.
Embora escapes de guest-to-host sejam raros, eles são a classe mais perigosa de bugs de hipervisor, pois quebram a fronteira de isolamento da qual a computação em nuvem depende. Escapes públicos anteriores de KVM visavam x86, geralmente via QEMU ou código específico da AMD . O ITScape é o primeiro exploit funcional a demonstrar uma fuga de uma VM convidada arm64 sem privilégios através do próprio código KVM no kernel — sem a necessidade de bugs no emulador de espaço de usuário
.
Para provedores de nuvem que executam hosts Graviton, Ampere Altra ou qualquer KVM arm64 com cargas de trabalho multi-inquilino, um convidado pode:
A maioria das equipes de segurança classificou a vulnerabilidade acima de CVSS 9.0, refletindo sua gravidade crítica .
O código vulnerável está no caminho de invalidação do cache de tradução LPI. Quando o kernel precisa limpar entradas do cache, ele itera pelo XArray com xa_for_each() e chama vgic_put_irq() para liberar a contagem de referência em cada entrada. O problema é que xa_for_each() retorna entradas que podem já ter sido apagadas por uma operação concorrente — como um comando DISCARD ITS emitido por uma vCPU diferente. O loop de invalidação ainda libera a referência naquela entrada já removida, causando uma liberação dupla e, finalmente, um use-after-free
.
Uma vulnerabilidade anterior no mesmo código, CVE-2024-26598, havia resolvido parcialmente um UAF no caminho de acerto do cache de tradução LPI, aumentando a contagem de referência dentro de vgic_its_check_cache() antes de liberar o bloqueio. Essa correção não cobriu o caminho de invalidação, deixando a condição de corrida explorável através de uma sequência de gatilho diferente
.
A correção upstream modifica vgic_its_invalidate_cache() para que vgic_put_irq() seja chamada apenas no valor retornado por xa_erase(), não em cada entrada que o iterador toca. A mensagem do commit diz: "KVM: arm64: vgic-its: Libere a referência do cache de tradução apenas para a entrada apagada"
.
Como xa_erase() atomicamente remove e retorna a entrada antiga — ou retorna NULL se a entrada já tiver desaparecido — a correção garante que a contagem de referência seja decrementada exatamente uma vez, eliminando a janela de liberação dupla. O patch foi integrado ao kernel upstream no início de junho de 2026 e rapidamente puxado para a série estável 6.x por volta de 8 a 10 de junho de 2026
. Grandes distribuições, incluindo Red Hat, SUSE e Debian, emitiram correções retroportadas para seus ramos de kernel suportados
.
Hyunwoo Kim divulgou publicamente um exploit funcional no GitHub por volta de 9 a 10 de junho de 2026. O repositório inclui o código-fonte completo, instruções de reprodução passo a passo e uma descrição técnica da técnica de exploração . O exploit aciona a condição de corrida coordenando threads de vCPU que simultaneamente emitem comandos DISCARD e fazem buscas no cache de tradução LPI, mirando com precisão o use-after-free para a execução de código no host.
A disponibilidade pública de uma PoC confiável significa que scanners de exploit comoditizados e atacantes do mundo real podem "armar" a vulnerabilidade com mínimo esforço, encurtando a janela entre a divulgação e os ataques ativos.
Se você opera infraestrutura KVM arm64 multi-inquilino — AWS Graviton, Ampere Altra ou qualquer plataforma similar — trate isso como um ciclo de patch de emergência imediato.