
PoC für CVE-2026-59346 – 32-Bit-Ganzzahlüberlauf im TSO-Segmentierungspfad von VMXNET3 in VMware, Gast-zu-Host-Absturz.
Proof-of-Concept für einen 32-Bit-Integer-Overflow im TSO-Segmentierungspfad der virtuellen VMXNET3-NIC in vmware-vmx, erreichbar aus einer Gast-VM.
Dieses Problem ist gepatcht. Das PoC wird ausschließlich zu Forschungs- und Verteidigungszwecken veröffentlicht. Es löst einen hostseitigen Absturz (SIGSEGV) aus und versucht keine Codeausführung.
| CVE | CVE-2026-59346 |
| Writeup | cyberstan.co.uk/vmxnet3-tso-overflow |
| ZDI-Advisory | ZDI-26-647 |
| Hersteller-Advisory | VMSA-2026-0007 |
| CVSSv3 | 9.3 (Hersteller) / 7.5 (ZDI) |
| Behoben in | Workstation / Fusion 26H1u1 |
| Gemeldet über | Trend Micro Zero Day Initiative |
Die TSO-Segmentierungsroutine von VMXNET3 berechnet ihre Allokationsgröße als seg_count * per_seg_size unter Verwendung eines 32-Bit-imul. Wenn das tatsächliche Produkt 2^32 überschreitet, läuft das Ergebnis über, und der Allocator erhält den abgeschnittenen Wert. Die nachfolgende Segmentierungsschleife wird von seg_count gesteuert, nicht von der Allokationsgröße, sodass sie per_seg_size Bytes pro Segment in einen Puffer schreibt, dessen Größe auf dem übergelaufenen Produkt basiert.
Ein früherer Fix für diesen Codepfad (CVE-2025-41236) fügte Grenzwertprüfungen hinzu, die Pakete ablehnen, bei denen MSS, per_seg_size oder deren Summe 9216 überschreiten. Diese Prüfungen beschränken die einzelnen Deskriptorfelder, aber niemals das Produkt, also den Wert, der tatsächlich überläuft. Parameter, die deutlich unter dem Grenzwert von 9216 liegen, erreichen den Overflow weiterhin.
Vollständige Root-Cause-Analyse, annotierte Disassembly und Heap-Geometrie: cyberstan.co.uk/vmxnet3-tso-overflow.
Ein Gastbenutzer mit ausreichenden Rechten zum Schreiben roher TX-Deskriptoren kann einen großen Out-of-Bounds-Schreibvorgang im Host-Prozess vmware-vmx verursachen, wobei der Inhalt aus dem vom Gast gelieferten Paket stammt. In diesem PoC läuft der Schreibvorgang, bis er nicht gemappten Speicher erreicht, und der Host-Prozess stirbt mit SIGSEGV, wodurch die VM ausgeschaltet wird.
Der Hersteller stufte das Problem als Möglichkeit zur Ausführung beliebigen Codes im Hypervisor-Kontext ein; das veröffentlichte PoC demonstriert nur die Speichersicherheitsverletzung und endet beim Absturz.
Alle VMware-Desktop-Hypervisor-Produkte, die dasselbe VMXNET3-Backend in vmware-vmx verwenden: Workstation, Fusion und Player. VMXNET3 ist der Standardadapter für moderne Gäste. Die maßgebliche Liste der betroffenen Versionen finden Sie in VMSA-2026-0007.
Das PoC ist ein Linux-Kernelmodul, das innerhalb des Gastes läuft. Es schreibt VMXNET3-TX-Ring-Deskriptoren direkt und umgeht dabei die TSO-Logik des In-Kernel-Treibers, und läutet dann das Doorbell-MMIO-Register.
# Innerhalb der Gast-VM, als root:
# Kernel-Header
apk add linux-virt-dev # Alpine
# apt install linux-headers-$(uname -r) # Debian / Ubuntu
make
insmod vmxnet3_tso_trigger.ko
Der Host-Prozess vmware-vmx wird abstürzen und der Gast wird ausgeschaltet. Rechnen Sie mit dem Verlust nicht gespeicherter Zustände in der VM, und erstellen Sie zuerst einen Snapshot, wenn Sie es erneut ausführen möchten.
Der Gast benötigt einen VMXNET3-Adapter. Prüfen Sie dies mit lspci | grep -i vmxnet oder bestätigen Sie ethernet0.virtualDev = "vmxnet3" in der .vmx-Datei. Das Modul kommuniziert direkt mit der NIC, daher muss das Interface aktiv und an den Treiber vmxnet3 gebunden sein.
| Parameter | Standard | Zweck |
|---|---|---|
ifname | eth0 | Interface, das vom VMXNET3-Adapter unterstützt wird |
dryrun | 0 | 1 schreibt die Deskriptoren, überspringt aber das Doorbell, sodass nichts ausgelöst wird |
wait_ms | 0 | Verzögerung in ms zwischen Deskriptor-Setup und Doorbell-Schreibvorgang |
txwarm | 0 | TSO-Pakete, die vor dem Overflow-Paket durch den Ring geschickt werden |
warmup | 0 | Hostseitige Allokationen, die vor dem Auslösen ausgeführt werden |
freechunk | 0 | Gleich große Allokationen, die vor dem Auslösen erstellt und teilweise freigegeben werden |
warmup und freechunk formen den Host-Heap, bevor der Overflow auftritt. Sie sind nicht erforderlich, um den Absturz zu reproduzieren; lassen Sie sie auf null, es sei denn, Sie untersuchen das Allokationslayout.
Beginnen Sie mit einem Dry Run, um zu bestätigen, dass das Modul den Ring findet und Parameter berechnet, ohne den Host zu beeinträchtigen:
insmod vmxnet3_tso_trigger.ko dryrun=1
dmesg | tail -20
rmmod vmxnet3_tso_trigger
Die erwartete Ausgabe enthält die berechnete Geometrie und den gefundenen TX-Ring:
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
Wenn der Ring nicht gefunden wird, protokolliert das Modul TX ring not found und bricht ab. Das bedeutet normalerweise eine Abweichung im Treiberlayout; die Suchheuristik in find_tx_ring() muss für diesen Kernel angepasst werden.
Lösen Sie es dann tatsächlich aus, bei Bedarf auf einem nicht standardmäßigen Interface:
insmod vmxnet3_tso_trigger.ko ifname=eth1
Der Gast stirbt zusammen mit dem Host-Prozess, sodass die letzten Meldungen möglicherweise nicht auf die Festplatte gelangen. Um sie zu erfassen, beobachten Sie die Konsole, anstatt sich auf das Journal zu verlassen:
dmesg -w
Bestätigen Sie den Absturz von der Host-Seite aus im vmware.log der VM, das einen PANIC: Unexpected signal: 11 mit einem Backtrace durch den Allocator im Thread vcpu-0 zeigen wird.
ifname muss das VMXNET3-Gerät benennen, nicht eine Bridge oder einen sekundären e1000-Adapter.need N entries but ring has M slots ab, wenn der TX-Ring die Deskriptorkette nicht aufnehmen kann.| Host | Ubuntu 24.04 LTS, Kernel 6.17.0, glibc 2.39 |
| Hypervisor | VMware Workstation Pro 25.0.1 (Build 25219725) |
| Gast | Alpine Linux, Kernel 6.12, VMXNET3-NIC |
Die in der Analyse referenzierten Symbol-Offsets sind spezifisch für Build 25219725. Das anfällige Muster ist über Builds hinweg dasselbe, aber die Offsets werden abweichen.
vmxnet3_tso_trigger.c Trigger-Modul
Makefile Out-of-Tree-Kernelmodul-Build
Die Multiplikation muss in 64 Bit durchgeführt werden, wobei das Ergebnis begrenzt werden muss, bevor es den Allocator erreicht. Die Begrenzung der einzelnen Deskriptorfelder ist nicht ausreichend, da der Overflow eine Eigenschaft des Produkts und nicht eines der beiden Operanden ist.
| Datum | Ereignis |
|---|---|
| 2026 | Gemeldet an Trend Micro ZDI |
| Sept. 2026 | Gepatcht von Broadcom in 26H1u1 (VMSA-2026-0007) |
| Sept. 2026 | ZDI-26-647 veröffentlicht |
Veröffentlicht im Rahmen der koordinierten Offenlegung, nachdem ein Fix ausgeliefert wurde. Führen Sie es nur gegen Systeme aus, die Ihnen gehören oder für die Sie eine Testautorisierung haben. Es wird den Host-Hypervisor-Prozess zum Absturz bringen, richten Sie es also nicht auf etwas, das Ihnen wichtig ist.
Stan S - cyberstan.co.uk · @0xCyberstan