
Exploit PoC pour CVE-2026-64561, une use-after-free de la shadow MMU de KVM/x86 permettant une évasion de l'invité vers l'hôte avec exécution de code en tant que root du noyau sur l'hôte.

Ce document décrit la vulnérabilité Zapscape (CVE-2026-64561) découverte et signalée par Hyunwoo Kim (@v4bel). Il s'agit d'une vulnérabilité d'évasion KVM qui permet à un invité de s'échapper vers l'hôte dans un environnement KVM/x86 et d'exécuter des commandes sur l'hôte avec le privilège noyau (root).
Zapscape est une vulnérabilité de type use-after-free dans l'émulation shadow MMU de KVM/x86, plus précisément dans le chemin de zap récursif qui s'exécute lorsque les shadow pages sont récupérées. Elle peut déclencher le bug avec uniquement des actions côté invité pour corrompre la shadow page du noyau hôte, et elle peut menacer l'isolation invité-hôte des hôtes KVM/x86 qui acceptent des invités non fiables et exposent la virtualisation imbriquée, en particulier les clouds publics x86 multi-locataires.
Pour les informations techniques détaillées, voir ici.
[!NOTE] Après avoir signalé cette vulnérabilité à [email protected], l'embargo convenu a pris fin, donc l'exploit est publié sur oss-security et ce document Zapscape est publié. Pour la chronologie de divulgation, voir le document de détail technique.
Le PoC est écrit pour cibler AMD, et pour des tests sûrs, il est recommandé de l'exécuter sous QEMU TCG. Le PoC a la structure suivante.
L0: Linux 7.1.3 + KVM_AMD on an x86_64 CPU (AMD SVM/NPT) emulated by QEMU TCG. The escape target
└─ L1: the guest poc creates. Switching long -> PAE aliases one shadow page as both child and pinned root, and L1 then escalates the UAF into L0 kernel code-exec
└─ L2: the guest L1 VMRUNs. Its memory touches trigger L0's quota reclaim -> recursive zap with no root_count guard -> UAF
Ce PoC n'est pas un exploit weaponisé qui s'exécute immédiatement dans un environnement cloud, mais un code de démonstration qui reproduit la vulnérabilité et la chaîne d'exploitation complète sur QEMU TCG. Pour l'utiliser dans un véritable environnement cloud, les actions L1 effectuées par le PoC doivent être déplacées dans un module noyau invité, et l'exploit doit être porté pour correspondre au kconfig du noyau hôte. Ce n'est pas une tâche difficile.
# gcc -O2 -g -static -pthread poc.c -o poc
# ./qemu.sh bzImage initramfs.cpio.gz
/$$$$$$$$ /$$$$$$ /$$$$$$$
|_____ $$ /$$__ $$| $$__ $$
/$$/ | $$ \ $$| $$ \ $$
/$$/ | $$$$$$$$| $$$$$$$/
/$$/ | $$__ $$| $$____/
/$$/ | $$ | $$| $$
/$$$$$$$$| $$ | $$| $$
|________/|__/ |__/|__/
[+] /Zapscape created by the target KVM host kernel (owner uid=0, mode=0644).
[+] exploit completed - verify with: ls -la /Zapscape
zapscape(uid=65534)$ ls -la /Zapscape
-rw-r--r-- 1 root root 0 Jul 29 05:27 /Zapscape
zapscape(uid=65534)$
Ce PoC est destiné à fournir des informations précises. Ne l'utilisez pas sur des systèmes que vous n'êtes pas autorisé à tester.
Zapscape (CVE-2026-64561) couvre la plage allant de f95eec9bed76 (2020-07-08) à 2abd5287f083 (2026-07-21).
Identique à Januscape (CVE-2026-53359) :
/dev/kvm est accessible en écriture par tous (0666), donc un utilisateur non privilégié peut également utiliser cette vulnérabilité comme LPE pour obtenir root. Lorsqu'elle est utilisée comme LPE, les ioctls VMM côté hôte sont disponibles, donc l'exploitation devient plus facile et plus stable.Elle se produit dans le même shadow MMU, mais c'est une vulnérabilité distincte avec une cause racine différente.
Cela dit, contrairement à Januscape, sur Intel elle ne peut être déclenchée que lorsque les longueurs de page walk EPT 4 et 5 sont toutes deux exposées à L1. C'est un point important lors de l'évaluation de la portée affectée, il faut donc le comprendre précisément. Voir le document de détail technique.
Non. Comme pour Januscape, elle se produit dans KVM intégré au noyau, donc elle est déclenchée indépendamment de l'émulation de QEMU. De ce fait, elle peut également menacer les grands clouds publics qui implémentent et utilisent leur propre pile de virtualisation.
Oui. Le privilège noyau L1 est requis. Lorsque vous obtenez une instance sur un cloud public, vous avez généralement root sur votre propre VM, donc cette condition est satisfaite. Dans un scénario sans root invité, elle doit être chaînée avec une LPE telle que Dirty Frag.
Oui. Je recommande de mettre en place un processus de correctifs durable pour les hyperviseurs hôtes. L'hiver vient.
J'espère que non.