
PoC para CVE-2026-59346 - estouro de inteiro de 32 bits no caminho de segmentação TSO do VMXNET3 da VMware, travamento de guest para host.
Prova de conceito para um estouro de inteiro de 32 bits no caminho de segmentação TSO da NIC virtual VMXNET3 em vmware-vmx, alcançável a partir de uma VM convidada.
Este problema está corrigido. O PoC é publicado apenas para fins de pesquisa e defesa. Ele provoca um crash no lado do host (SIGSEGV) e não tenta execução de código.
| CVE | CVE-2026-59346 |
| Writeup | cyberstan.co.uk/vmxnet3-tso-overflow |
| Aviso ZDI | ZDI-26-647 |
| Aviso do fornecedor | VMSA-2026-0007 |
| CVSSv3 | 9.3 (fornecedor) / 7.5 (ZDI) |
| Corrigido em | Workstation / Fusion 26H1u1 |
| Reportado via | Trend Micro Zero Day Initiative |
A rotina de segmentação TSO do VMXNET3 calcula o tamanho da sua alocação como seg_count * per_seg_size usando um imul de 32 bits. Quando o produto real excede 2^32, o resultado sofre wrap, e o alocador recebe o valor truncado. O laço de segmentação que se segue é controlado por seg_count, não pelo tamanho da alocação, então ele escreve per_seg_size bytes por segmento em um buffer dimensionado a partir do produto com wrap.
Uma correção anterior para esse caminho de código (CVE-2025-41236) adicionou verificações de limites rejeitando pacotes em que MSS, per_seg_size, ou sua soma excedem 9216. Essas verificações restringem os campos individuais do descritor, mas nunca o produto, que é o valor que de fato sofre wrap. Parâmetros bem abaixo do limite de 9216 ainda alcançam o estouro.
Análise completa da causa raiz, disassembly anotado e geometria do heap: cyberstan.co.uk/vmxnet3-tso-overflow.
Um usuário convidado com privilégio suficiente para escrever descritores TX brutos pode causar uma grande escrita fora dos limites no processo vmware-vmx do host com conteúdo proveniente do pacote fornecido pelo convidado. Neste PoC a escrita prossegue até atingir memória não mapeada e o processo do host morre com SIGSEGV, desligando a VM.
O fornecedor classificou o problema como permitindo execução de código arbitrário no contexto do hypervisor; o PoC publicado demonstra apenas a violação de segurança de memória e para no crash.
Todos os produtos de hypervisor desktop da VMware que compartilham o backend VMXNET3 do vmware-vmx: Workstation, Fusion e Player. O VMXNET3 é o adaptador padrão para convidados modernos. Consulte VMSA-2026-0007 para a lista autoritativa de versões afetadas.
O PoC é um módulo de kernel Linux que roda dentro do convidado. Ele escreve descritores do anel TX do VMXNET3 diretamente, contornando a lógica TSO do driver em kernel, e então aciona o registrador 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
O processo vmware-vmx do host irá crashar e o convidado será desligado. Espere perder qualquer estado não salvo na VM, e tire um snapshot primeiro se quiser executá-lo novamente.
O convidado precisa de um adaptador VMXNET3. Verifique com lspci | grep -i vmxnet ou confirme ethernet0.virtualDev = "vmxnet3" no arquivo .vmx. O módulo fala diretamente com a NIC, então a interface deve estar ativa e vinculada ao driver vmxnet3.
| Parâmetro | Padrão | Propósito |
|---|---|---|
ifname | eth0 | Interface suportada pelo adaptador VMXNET3 |
dryrun | 0 | 1 escreve os descritores mas pula o doorbell, então nada é acionado |
wait_ms | 0 | Atraso em ms entre a configuração do descritor e a escrita no doorbell |
txwarm | 0 | Pacotes TSO a empurrar pelo anel antes do pacote de estouro |
warmup | 0 | Alocações no lado do host a emitir antes de acionar |
freechunk | 0 | Alocações do mesmo tamanho a fazer e liberar parcialmente antes de acionar |
warmup e freechunk moldam o heap do host antes que o estouro ocorra. Eles não são necessários para reproduzir o crash; deixe-os em zero a menos que você esteja investigando o layout de alocação.
Comece com uma execução a seco para confirmar que o módulo encontra o anel e calcula os parâmetros, sem tocar no host:
insmod vmxnet3_tso_trigger.ko dryrun=1
dmesg | tail -20
rmmod vmxnet3_tso_trigger
A saída esperada inclui a geometria calculada e o anel TX localizado:
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 o anel não for encontrado, o módulo registra TX ring not found e aborta. Isso geralmente significa uma diferença no layout do driver; a heurística de busca em find_tx_ring() precisa de ajuste para esse kernel.
Então acione de verdade, em uma interface não padrão se necessário:
insmod vmxnet3_tso_trigger.ko ifname=eth1
O convidado morre junto com o processo do host, então as últimas mensagens podem não chegar ao disco. Para capturá-las, observe o console em vez de confiar no journal:
dmesg -w
Confirme o crash pelo lado do host no vmware.log da VM, que mostrará um PANIC: Unexpected signal: 11 com um backtrace passando pelo alocador na thread vcpu-0.
ifname deve nomear o dispositivo VMXNET3, não uma bridge ou um adaptador e1000 secundário.need N entries but ring has M slots se o anel TX não puder conter a cadeia de descritores.| Host | Ubuntu 24.04 LTS, kernel 6.17.0, glibc 2.39 |
| Hypervisor | VMware Workstation Pro 25.0.1 (build 25219725) |
| Convidado | Alpine Linux, kernel 6.12, NIC VMXNET3 |
Os deslocamentos de símbolos referenciados na análise são específicos para o build 25219725. O padrão vulnerável é o mesmo entre builds, mas os deslocamentos irão diferir.
vmxnet3_tso_trigger.c trigger module
Makefile out-of-tree kernel module build
A multiplicação precisa ser realizada em 64 bits, com o resultado limitado antes de chegar ao alocador. Limitar os campos individuais do descritor não é suficiente, já que o estouro é uma propriedade do produto e não de qualquer um dos operandos.
| Data | Evento |
|---|---|
| 2026 | Reportado à Trend Micro ZDI |
| Set 2026 | Corrigido pela Broadcom em 26H1u1 (VMSA-2026-0007) |
| Set 2026 | ZDI-26-647 publicado |
Publicado sob divulgação coordenada, após o lançamento de uma correção. Execute-o apenas contra sistemas que você possui ou está autorizado a testar. Ele irá crashar o processo do hypervisor do host, então não aponte-o para nada com que você se importe.
Stan S - cyberstan.co.uk · @0xCyberstan