
PoC pour CVE-2026-59346 - dépassement d'entier 32 bits dans le chemin de segmentation TSO de VMXNET3 de VMware, plantage invité-vers-hôte.
Preuve de concept pour un débordement d'entier 32 bits dans le chemin de segmentation TSO de la carte réseau virtuelle VMXNET3 dans vmware-vmx, atteignable depuis une VM invitée.
Ce problème est corrigé. Le PoC est publié à des fins de recherche et de défense uniquement. Il déclenche un crash côté hôte (SIGSEGV) et ne tente pas d'exécution de code.
| CVE | CVE-2026-59346 |
| Writeup | cyberstan.co.uk/vmxnet3-tso-overflow |
| Avis ZDI | ZDI-26-647 |
| Avis éditeur | VMSA-2026-0007 |
| CVSSv3 | 9.3 (éditeur) / 7.5 (ZDI) |
| Corrigé dans | Workstation / Fusion 26H1u1 |
| Signalé via | Trend Micro Zero Day Initiative |
La routine de segmentation TSO de VMXNET3 calcule sa taille d'allocation comme seg_count * per_seg_size en utilisant un imul 32 bits. Lorsque le produit réel dépasse 2^32, le résultat déborde, et l'allocateur reçoit la valeur tronquée. La boucle de segmentation qui suit est pilotée par seg_count, et non par la taille d'allocation, de sorte qu'elle écrit per_seg_size octets par segment dans un tampon dimensionné à partir du produit après débordement.
Un correctif antérieur pour ce chemin de code (CVE-2025-41236) a ajouté des vérifications de limites rejetant les paquets où MSS, per_seg_size, ou leur somme dépassent 9216. Ces vérifications contraignent les champs individuels du descripteur mais jamais le produit, qui est la valeur qui déborde réellement. Des paramètres bien en dessous de la limite de 9216 atteignent toujours le débordement.
Analyse complète de la cause racine, désassemblage annoté et géométrie du tas : cyberstan.co.uk/vmxnet3-tso-overflow.
Un utilisateur invité disposant de privilèges suffisants pour écrire des descripteurs TX bruts peut provoquer une importante écriture hors limites dans le processus hôte vmware-vmx avec un contenu issu du paquet fourni par l'invité. Dans ce PoC, l'écriture se poursuit jusqu'à atteindre de la mémoire non mappée et le processus hôte meurt avec SIGSEGV, éteignant la VM.
L'éditeur a classé le problème comme permettant l'exécution de code arbitraire dans le contexte de l'hyperviseur ; le PoC publié ne démontre que la violation de sûreté mémoire et s'arrête au crash.
Tous les produits hyperviseurs de bureau VMware partageant le backend VMXNET3 de vmware-vmx : Workstation, Fusion et Player. VMXNET3 est la carte par défaut pour les invités modernes. Voir VMSA-2026-0007 pour la liste faisant autorité des versions affectées.
Le PoC est un module noyau Linux qui s'exécute à l'intérieur de l'invité. Il écrit directement les descripteurs de l'anneau TX VMXNET3, contournant la logique TSO du pilote en noyau, puis sonne le registre MMIO doorbell.
# Inside the guest VM, as root:
# Kernel headers
apk add linux-virt-dev # Alpine
# apt install linux-headers-$(uname -r) # Debian / Ubuntu
make
insmod vmxnet3_tso_trigger.ko
Le processus hôte vmware-vmx plantera et l'invité s'éteindra. Attendez-vous à perdre tout état non sauvegardé dans la VM, et prenez un instantané au préalable si vous souhaitez le réexécuter.
L'invité a besoin d'une carte VMXNET3. Vérifiez avec lspci | grep -i vmxnet ou confirmez ethernet0.virtualDev = "vmxnet3" dans le fichier .vmx. Le module communique directement avec la carte réseau, donc l'interface doit être active et liée au pilote vmxnet3.
| Paramètre | Défaut | Rôle |
|---|---|---|
ifname | eth0 | Interface adossée à la carte VMXNET3 |
dryrun | 0 | 1 écrit les descripteurs mais saute le doorbell, donc rien n'est déclenché |
wait_ms | 0 | Délai en ms entre la configuration des descripteurs et l'écriture du doorbell |
txwarm | 0 | Paquets TSO à faire passer dans l'anneau avant le paquet de débordement |
warmup | 0 | Allocations côté hôte à effectuer avant le déclenchement |
freechunk | 0 | Allocations de même taille à effectuer et à libérer partiellement avant le déclenchement |
warmup et freechunk façonnent le tas de l'hôte avant que le débordement ne se produise. Ils ne sont pas nécessaires pour reproduire le crash ; laissez-les à zéro sauf si vous étudiez la disposition des allocations.
Commencez par une exécution à blanc pour confirmer que le module trouve l'anneau et calcule les paramètres, sans toucher à l'hôte :
insmod vmxnet3_tso_trigger.ko dryrun=1
dmesg | tail -20
rmmod vmxnet3_tso_trigger
La sortie attendue inclut la géométrie calculée et l'anneau TX localisé :
tso_v8: per_seg=6240 (0x1860), HDR_TOTAL=6222, MSS=1
tso_v8: PARAMS: alloc=... overflow=... seg_count=... paylen=...
tso_v8: ring at priv+N: base=... sz=... n2f=... gen=...
tso_v8: DRYRUN -- descriptors written but NOT triggered
Si l'anneau n'est pas trouvé, le module journalise TX ring not found et abandonne. Cela signifie généralement une différence de disposition du pilote ; l'heuristique de recherche dans find_tx_ring() doit être ajustée pour ce noyau.
Puis déclenchez pour de vrai, sur une interface non par défaut si nécessaire :
insmod vmxnet3_tso_trigger.ko ifname=eth1
L'invité meurt avec le processus hôte, donc les derniers messages peuvent ne pas atteindre le disque. Pour les capturer, surveillez la console plutôt que de vous fier au journal :
dmesg -w
Confirmez le crash côté hôte dans le vmware.log de la VM, qui affichera un PANIC: Unexpected signal: 11 avec une trace d'appels passant par l'allocateur sur le thread vcpu-0.
ifname doit désigner le périphérique VMXNET3, pas un pont ni une carte e1000 secondaire.need N entries but ring has M slots si l'anneau TX ne peut pas contenir la chaîne de descripteurs.| Hôte | Ubuntu 24.04 LTS, noyau 6.17.0, glibc 2.39 |
| Hyperviseur | VMware Workstation Pro 25.0.1 (build 25219725) |
| Invité | Alpine Linux, noyau 6.12, carte VMXNET3 |
Les décalages de symboles référencés dans l'analyse sont spécifiques au build 25219725. Le motif vulnérable est le même d'un build à l'autre, mais les décalages différeront.
vmxnet3_tso_trigger.c trigger module
Makefile out-of-tree kernel module build
La multiplication doit être effectuée en 64 bits, avec le résultat borné avant d'atteindre l'allocateur. Plafonner les champs individuels du descripteur ne suffit pas, car le débordement est une propriété du produit et non de l'un ou l'autre des opérandes.
| Date | Événement |
|---|---|
| 2026 | Signalé à Trend Micro ZDI |
| Sept 2026 | Corrigé par Broadcom dans 26H1u1 (VMSA-2026-0007) |
| Sept 2026 | ZDI-26-647 publié |
Publié dans le cadre d'une divulgation coordonnée, après la sortie d'un correctif. Ne l'exécutez que contre des systèmes que vous possédez ou êtes autorisé à tester. Cela plantera le processus hyperviseur hôte, donc ne le pointez vers rien qui vous importe.
Stan S - cyberstan.co.uk · @0xCyberstan