
PoC per CVE-2026-59346 - overflow di interi a 32 bit nel percorso di segmentazione TSO di VMXNET3 di VMware, crash da guest a host.
Proof-of-concept per un overflow di interi a 32 bit nel percorso di segmentazione TSO della NIC virtuale VMXNET3 in vmware-vmx, raggiungibile da una VM guest.
Questo problema è stato corretto. Il PoC è pubblicato solo per scopi di ricerca e difensivi. Provoca un crash lato host (SIGSEGV) e non tenta l'esecuzione di codice.
| CVE | CVE-2026-59346 |
| Writeup | cyberstan.co.uk/vmxnet3-tso-overflow |
| Advisory ZDI | ZDI-26-647 |
| Advisory del vendor | VMSA-2026-0007 |
| CVSSv3 | 9.3 (vendor) / 7.5 (ZDI) |
| Corretto in | Workstation / Fusion 26H1u1 |
| Segnalato tramite | Trend Micro Zero Day Initiative |
La routine di segmentazione TSO di VMXNET3 calcola la dimensione dell'allocazione come seg_count * per_seg_size usando un imul a 32 bit. Quando il prodotto reale supera 2^32 il risultato va in wrap e l'allocatore riceve il valore troncato. Il ciclo di segmentazione che segue è guidato da seg_count, non dalla dimensione dell'allocazione, quindi scrive per_seg_size byte per segmento in un buffer dimensionato sul prodotto andato in wrap.
Una correzione precedente per questo percorso di codice (CVE-2025-41236) aveva aggiunto controlli sui limiti che rifiutano i pacchetti in cui MSS, per_seg_size o la loro somma superano 9216. Tali controlli vincolano i singoli campi del descrittore ma mai il prodotto, che è il valore che effettivamente va in wrap. Parametri ben al di sotto del limite di 9216 raggiungono comunque l'overflow.
Analisi completa della causa radice, disassembly annotato e geometria dell'heap: cyberstan.co.uk/vmxnet3-tso-overflow.
Un utente guest con privilegi sufficienti per scrivere descrittori TX grezzi può causare una vasta scrittura fuori dai limiti nel processo host vmware-vmx con contenuto tratto dal pacchetto fornito dal guest. In questo PoC la scrittura procede finché non raggiunge memoria non mappata e il processo host termina con SIGSEGV, spegnendo la VM.
Il vendor ha classificato il problema come tale da consentire l'esecuzione di codice arbitrario nel contesto dell'hypervisor; il PoC pubblicato dimostra solo la violazione della sicurezza della memoria e si ferma al crash.
Tutti i prodotti hypervisor desktop VMware che condividono il backend VMXNET3 di vmware-vmx: Workstation, Fusion e Player. VMXNET3 è l'adattatore predefinito per i guest moderni. Consultare VMSA-2026-0007 per l'elenco autorevole delle versioni interessate.
Il PoC è un modulo del kernel Linux che viene eseguito all'interno del guest. Scrive direttamente i descrittori dell'anello TX di VMXNET3, aggirando la logica TSO del driver in-kernel, quindi attiva il registro MMIO del 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
Il processo host vmware-vmx andrà in crash e il guest si spegnerà. Si prevede la perdita di qualsiasi stato non salvato nella VM; fare prima uno snapshot se si desidera rieseguirlo.
Il guest necessita di un adattatore VMXNET3. Verificare con lspci | grep -i vmxnet o confermare ethernet0.virtualDev = "vmxnet3" nel file .vmx. Il modulo comunica direttamente con la NIC, quindi l'interfaccia deve essere attiva e associata al driver vmxnet3.
| Parametro | Predefinito | Scopo |
|---|---|---|
ifname | eth0 | Interfaccia supportata dall'adattatore VMXNET3 |
dryrun | 0 | 1 scrive i descrittori ma salta il doorbell, quindi non viene attivato nulla |
wait_ms | 0 | Ritardo in ms tra la configurazione dei descrittori e la scrittura del doorbell |
txwarm | 0 | Pacchetti TSO da far passare attraverso l'anello prima del pacchetto di overflow |
warmup | 0 | Allocazioni lato host da effettuare prima dell'attivazione |
freechunk | 0 | Allocazioni della stessa dimensione da creare e rilasciare parzialmente prima dell'attivazione |
warmup e freechunk modellano l'heap dell'host prima che l'overflow si verifichi. Non sono necessari per riprodurre il crash; lasciarli a zero a meno che non si stia analizzando il layout delle allocazioni.
Iniziare con una dry run per confermare che il modulo trovi l'anello e calcoli i parametri, senza toccare l'host:
insmod vmxnet3_tso_trigger.ko dryrun=1
dmesg | tail -20
rmmod vmxnet3_tso_trigger
L'output previsto include la geometria calcolata e l'anello TX individuato:
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
Se l'anello non viene trovato il modulo registra TX ring not found e si interrompe. Di solito ciò significa una differenza nel layout del driver; l'euristica di ricerca in find_tx_ring() deve essere adattata per quel kernel.
Poi attivare per davvero, su un'interfaccia non predefinita se necessario:
insmod vmxnet3_tso_trigger.ko ifname=eth1
Il guest muore insieme al processo host, quindi gli ultimi messaggi potrebbero non raggiungere il disco. Per catturarli, osservare la console invece di affidarsi al journal:
dmesg -w
Confermare il crash dal lato host nel vmware.log della VM, che mostrerà un PANIC: Unexpected signal: 11 con un backtrace attraverso l'allocatore sul thread vcpu-0.
ifname deve indicare il dispositivo VMXNET3, non un bridge o un adattatore e1000 secondario.need N entries but ring has M slots se l'anello TX non può contenere la catena di descrittori.| Host | Ubuntu 24.04 LTS, kernel 6.17.0, glibc 2.39 |
| Hypervisor | VMware Workstation Pro 25.0.1 (build 25219725) |
| Guest | Alpine Linux, kernel 6.12, NIC VMXNET3 |
Gli offset dei simboli a cui si fa riferimento nell'analisi sono specifici per la build 25219725. Il pattern vulnerabile è lo stesso tra le build, ma gli offset differiranno.
vmxnet3_tso_trigger.c trigger module
Makefile out-of-tree kernel module build
La moltiplicazione deve essere eseguita a 64 bit, con il risultato limitato prima che raggiunga l'allocatore. Limitare i singoli campi del descrittore non è sufficiente, poiché l'overflow è una proprietà del prodotto e non di uno dei due operandi.
| Data | Evento |
|---|---|
| 2026 | Segnalato a Trend Micro ZDI |
| Settembre 2026 | Corretto da Broadcom in 26H1u1 (VMSA-2026-0007) |
| Settembre 2026 | Pubblicato ZDI-26-647 |
Pubblicato nell'ambito della divulgazione coordinata, dopo il rilascio di una correzione. Eseguirlo solo contro sistemi di propria proprietà o per i quali si è autorizzati a eseguire test. Provocherà il crash del processo hypervisor dell'host, quindi non puntarlo contro nulla a cui si tiene.
Stan S - cyberstan.co.uk · @0xCyberstan