
PoC para CVE-2026-59346 - desbordamiento de entero de 32 bits en la ruta de segmentación TSO de VMXNET3 de VMware, fallo de guest a host.
Prueba de concepto de un desbordamiento de entero de 32 bits en la ruta de segmentación TSO de la NIC virtual VMXNET3 en vmware-vmx, alcanzable desde una VM invitada.
Este problema está parcheado. La PoC se publica únicamente con fines de investigación y defensivos. Provoca un fallo (SIGSEGV) en el lado del host y no intenta ejecutar código.
| CVE | CVE-2026-59346 |
| Análisis | cyberstan.co.uk/vmxnet3-tso-overflow |
| Aviso de ZDI | ZDI-26-647 |
| Aviso del proveedor | VMSA-2026-0007 |
| CVSSv3 | 9.3 (proveedor) / 7.5 (ZDI) |
| Corregido en | Workstation / Fusion 26H1u1 |
| Reportado a través de | Trend Micro Zero Day Initiative |
La rutina de segmentación TSO de VMXNET3 calcula el tamaño de su asignación como seg_count * per_seg_size usando un imul de 32 bits. Cuando el producto real supera 2^32, el resultado se desborda y el asignador recibe el valor truncado. El bucle de segmentación que sigue está controlado por seg_count, no por el tamaño de la asignación, por lo que escribe per_seg_size bytes por segmento en un búfer dimensionado a partir del producto desbordado.
Una corrección anterior para esta ruta de código (CVE-2025-41236) añadió comprobaciones de límites que rechazan paquetes donde MSS, per_seg_size o su suma superan 9216. Esas comprobaciones restringen los campos individuales del descriptor, pero nunca el producto, que es el valor que realmente se desborda. Parámetros muy por debajo del límite de 9216 siguen alcanzando el desbordamiento.
Análisis completo de la causa raíz, desensamblado anotado y geometría del heap: cyberstan.co.uk/vmxnet3-tso-overflow.
Un usuario invitado con privilegios suficientes para escribir descriptores TX en bruto puede provocar una escritura fuera de límites de gran tamaño en el proceso vmware-vmx del host con contenido extraído del paquete proporcionado por el invitado. En esta PoC la escritura continúa hasta alcanzar memoria no mapeada y el proceso del host muere con SIGSEGV, apagando la VM.
El proveedor calificó el problema como susceptible de permitir la ejecución de código arbitrario en el contexto del hipervisor; la PoC publicada demuestra únicamente la violación de seguridad de memoria y se detiene en el fallo.
Todos los productos de hipervisor de escritorio de VMware que comparten el backend VMXNET3 de vmware-vmx: Workstation, Fusion y Player. VMXNET3 es el adaptador predeterminado para las VM invitadas modernas. Consulte VMSA-2026-0007 para obtener la lista autorizada de versiones afectadas.
La PoC es un módulo del kernel de Linux que se ejecuta dentro del invitado. Escribe directamente los descriptores del anillo TX de VMXNET3, omitiendo la lógica TSO del controlador en el kernel, y luego activa el 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
El proceso vmware-vmx del host fallará y el invitado se apagará. Espere perder cualquier estado no guardado en la VM, y tome una instantánea primero si desea volver a ejecutarla.
El invitado necesita un adaptador VMXNET3. Compruébelo con lspci | grep -i vmxnet o confirme ethernet0.virtualDev = "vmxnet3" en el archivo .vmx. El módulo se comunica directamente con la NIC, por lo que la interfaz debe estar activa y vinculada al controlador vmxnet3.
| Parámetro | Predeterminado | Propósito |
|---|---|---|
ifname | eth0 | Interfaz respaldada por el adaptador VMXNET3 |
dryrun | 0 | 1 escribe los descriptores pero omite el doorbell, por lo que no se activa nada |
wait_ms | 0 | Retardo en ms entre la configuración del descriptor y la escritura del doorbell |
txwarm | 0 | Paquetes TSO que se envían por el anillo antes del paquete de desbordamiento |
warmup | 0 | Asignaciones del lado del host que se emiten antes de activar |
freechunk | 0 | Asignaciones del mismo tamaño que se crean y se liberan parcialmente antes de activar |
warmup y freechunk modelan el heap del host antes de que se produzca el desbordamiento. No son necesarios para reproducir el fallo; déjelos en cero a menos que esté investigando la disposición de las asignaciones.
Comience con una ejecución en seco para confirmar que el módulo encuentra el anillo y calcula los parámetros, sin tocar el host:
insmod vmxnet3_tso_trigger.ko dryrun=1
dmesg | tail -20
rmmod vmxnet3_tso_trigger
La salida esperada incluye la geometría calculada y el anillo 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
Si no se encuentra el anillo, el módulo registra TX ring not found y aborta. Eso suele significar una diferencia en la disposición del controlador; la heurística de búsqueda en find_tx_ring() necesita ajustarse para ese kernel.
Luego actívelo de verdad, en una interfaz no predeterminada si es necesario:
insmod vmxnet3_tso_trigger.ko ifname=eth1
El invitado muere junto con el proceso del host, por lo que es posible que los últimos mensajes no lleguen al disco. Para capturarlos, observe la consola en lugar de confiar en el journal:
dmesg -w
Confirme el fallo desde el lado del host en el vmware.log de la VM, que mostrará un PANIC: Unexpected signal: 11 con un backtrace a través del asignador en el hilo vcpu-0.
ifname debe nombrar el dispositivo VMXNET3, no un puente ni un adaptador e1000 secundario.need N entries but ring has M slots si el anillo TX no puede contener la cadena de descriptores.| Host | Ubuntu 24.04 LTS, kernel 6.17.0, glibc 2.39 |
| Hipervisor | VMware Workstation Pro 25.0.1 (build 25219725) |
| Invitado | Alpine Linux, kernel 6.12, NIC VMXNET3 |
Los desplazamientos de símbolos a los que se hace referencia en el análisis son específicos de la build 25219725. El patrón vulnerable es el mismo en todas las builds, pero los desplazamientos variarán.
vmxnet3_tso_trigger.c trigger module
Makefile out-of-tree kernel module build
La multiplicación debe realizarse en 64 bits, con el resultado acotado antes de que llegue al asignador. Limitar los campos individuales del descriptor no es suficiente, ya que el desbordamiento es una propiedad del producto y no de ninguno de los operandos.
| Fecha | Evento |
|---|---|
| 2026 | Reportado a Trend Micro ZDI |
| Sept 2026 | Parcheado por Broadcom en 26H1u1 (VMSA-2026-0007) |
| Sept 2026 | Publicado ZDI-26-647 |
Publicado bajo divulgación coordinada, después de que se distribuyera una corrección. Ejecútelo solo contra sistemas que posea o esté autorizado a probar. Provocará el fallo del proceso del hipervisor del host, así que no lo apunte a nada que le importe.
Stan S - cyberstan.co.uk · @0xCyberstan