
CVE-2026-59346 の PoC - VMware の VMXNET3 TSO セグメンテーションパスにおける 32 ビット整数オーバーフロー、ゲストからホストへのクラッシュ。
| CVE | CVE-2026-59346 |
| Writeup | cyberstan.co.uk/vmxnet3-tso-overflow |
| ZDI advisory | ZDI-26-647 |
| Vendor advisory | VMSA-2026-0007 |
| CVSSv3 | 9.3 (vendor) / 7.5 (ZDI) |
| Fixed in | Workstation / Fusion 26H1u1 |
| Reported via | Trend Micro Zero Day Initiative |
VMXNET3 の TSO セグメンテーションルーチンは、割り当てサイズを 32 ビットの imul を用いて seg_count * per_seg_size として計算します。真の積が 2^32 を超えると結果がラップアラウンドし、アロケータは切り詰められた値を受け取ります。続くセグメンテーションループは割り当てサイズではなく seg_count によって駆動されるため、ラップアラウンドした積から算出されたサイズのバッファに対して、セグメントごとに per_seg_size バイトを書き込みます。
このコードパスに対する以前の修正 (CVE-2025-41236) では、MSS、per_seg_size、またはその合計が 9216 を超えるパケットを拒否する境界チェックが追加されました。これらのチェックは個々のディスクリプタフィールドを制約しますが、実際にラップアラウンドする値である積を制約することはありません。9216 の制限をはるかに下回るパラメータでも、依然としてオーバーフローに到達します。
完全な根本原因分析、注釈付き逆アセンブリ、ヒープジオメトリについてはこちらをご覧ください: cyberstan.co.uk/vmxnet3-tso-overflow。
生の TX ディスクリプタを書き込むのに十分な権限を持つゲストユーザーは、ゲストが提供したパケットの内容を用いて、ホストの vmware-vmx プロセス内で大規模な範囲外書き込みを引き起こす可能性があります。この PoC では、書き込みは未マップメモリに到達するまで続き、ホストプロセスが SIGSEGV で終了し、VM が電源オフになります。
ベンダーはこの問題をハイパーバイザコンテキストでの任意コード実行を可能にするものと評価していますが、公開された PoC はメモリ安全性の違反のみを実証し、クラッシュで停止します。
vmware-vmx の VMXNET3 バックエンドを共有するすべての VMware デスクトップハイパーバイザ製品: Workstation、Fusion、および Player。VMXNET3 はモダンなゲストのデフォルトアダプタです。正式な影響バージョンリストについては VMSA-2026-0007 を参照してください。
この PoC は ゲスト内 で動作する Linux カーネルモジュールです。カーネル内ドライバの TSO ロジックをバイパスして VMXNET3 の TX リングディスクリプタを直接書き込み、その後ドアベル MMIO レジスタを叩きます。
# 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
ホストの vmware-vmx プロセスがクラッシュし、ゲストは電源オフになります。VM 内の未保存の状態は失われると想定してください。再実行したい場合は、事前にスナップショットを取得してください。
ゲストには VMXNET3 アダプタが必要です。lspci | grep -i vmxnet で確認するか、.vmx ファイル内の ethernet0.virtualDev = "vmxnet3" を確認してください。このモジュールは NIC と直接通信するため、インターフェースが起動しており vmxnet3 ドライバにバインドされている必要があります。
| Parameter | Default | Purpose |
|---|---|---|
ifname | eth0 | VMXNET3 アダプタにバックアップされたインターフェース |
dryrun | 0 | 1 はディスクリプタを書き込みますがドアベルをスキップするため、何もトリガーされません |
wait_ms | 0 | ディスクリプタ設定とドアベル書き込みの間の遅延 (ミリ秒) |
txwarm | 0 | オーバーフローパケットの前にリングを通す TSO パケット |
warmup | 0 | トリガー前に発行するホスト側の割り当て |
freechunk | 0 | トリガー前に作成し部分的に解放する同サイズの割り当て |
warmup と freechunk は、オーバーフローが発生する前にホストヒープを整形します。クラッシュを再現するために必須ではありません。割り当てレイアウトを調査している場合を除き、ゼロのままにしてください。
まずドライランで、ホストに触れることなく、モジュールがリングを見つけてパラメータを計算することを確認します:
insmod vmxnet3_tso_trigger.ko dryrun=1
dmesg | tail -20
rmmod vmxnet3_tso_trigger
期待される出力には、計算されたジオメトリと特定された TX リングが含まれます:
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
リングが見つからない場合、モジュールは TX ring not found をログに記録して中止します。これは通常、ドライバのレイアウトの違いを意味します。そのカーネルに合わせて find_tx_ring() の検索ヒューリスティックを調整する必要があります。
次に、必要に応じて非デフォルトのインターフェースで実際にトリガーします:
insmod vmxnet3_tso_trigger.ko ifname=eth1
ゲストはホストプロセスとともに停止するため、最後のメッセージがディスクに到達しない可能性があります。それらをキャプチャするには、ジャーナルに頼るのではなくコンソールを監視してください:
dmesg -w
ホスト側で VM の vmware.log を確認してクラッシュを確認します。vcpu-0 スレッド上のアロケータを通るバックトレースとともに PANIC: Unexpected signal: 11 が表示されます。
ifname はブリッジやセカンダリ e1000 アダプタではなく、VMXNET3 デバイスを指定する必要があります。need N entries but ring has M slots で中止します。| 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, VMXNET3 NIC |
分析で参照されているシンボルオフセットはビルド 25219725 に固有のものです。脆弱なパターンはビルド間で同じですが、オフセットは異なります。
vmxnet3_tso_trigger.c trigger module
Makefile out-of-tree kernel module build
乗算は 64 ビットで実行し、結果がアロケータに到達する前に境界を設ける必要があります。オーバーフローはどちらかのオペランドではなく積の性質であるため、個々のディスクリプタフィールドを制限するだけでは不十分です。
| Date | Event |
|---|---|
| 2026 | Trend Micro ZDI に報告 |
| Sept 2026 | Broadcom により 26H1u1 で修正 (VMSA-2026-0007) |
| Sept 2026 | ZDI-26-647 公開 |
修正がリリースされた後、協調的開示の下で公開されています。所有しているか、テストを許可されているシステムに対してのみ実行してください。ホストのハイパーバイザプロセスをクラッシュさせるため、気にかけているものに対して実行しないでください。
Stan S - cyberstan.co.uk · @0xCyberstan