
PoC для CVE-2026-59346 — 32-битное целочисленное переполнение в пути сегментации TSO VMXNET3 от VMware, крах из гостевой системы в хост-систему.
Proof-of-concept для 32-битного целочисленного переполнения в пути сегментации TSO виртуального сетевого адаптера VMXNET3 в vmware-vmx, достижимого из гостевой ВМ.
Эта уязвимость исправлена. PoC опубликован исключительно в исследовательских и защитных целях. Он вызывает сбой на стороне хоста (SIGSEGV) и не пытается выполнить код.
| CVE | CVE-2026-59346 |
| Разбор | cyberstan.co.uk/vmxnet3-tso-overflow |
| Рекомендация ZDI | ZDI-26-647 |
| Рекомендация вендора | VMSA-2026-0007 |
| CVSSv3 | 9.3 (вендор) / 7.5 (ZDI) |
| Исправлено в | Workstation / Fusion 26H1u1 |
| Сообщено через | Trend Micro Zero Day Initiative |
Процедура сегментации TSO в VMXNET3 вычисляет размер выделяемой памяти как seg_count * per_seg_size, используя 32-битный imul. Когда истинное произведение превышает 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, выключая ВМ.
Вендор оценил уязвимость как допускающую выполнение произвольного кода в контексте гипервизора; опубликованный PoC демонстрирует только нарушение безопасности памяти и останавливается на сбое.
Все настольные гипервизорные продукты VMware, использующие бэкенд VMXNET3 в vmware-vmx: Workstation, Fusion и Player. VMXNET3 — адаптер по умолчанию для современных гостевых систем. Авторитетный список затронутых версий см. в VMSA-2026-0007.
PoC представляет собой модуль ядра Linux, работающий внутри гостевой системы. Он записывает TX-дескрипторы кольца VMXNET3 напрямую, обходя логику TSO драйвера в ядре, а затем подаёт сигнал через 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
Хост-процесс vmware-vmx завершится сбоем, и гостевая система выключится. Ожидайте потери любых несохранённых данных в ВМ; сделайте снимок заранее, если хотите запустить это повторно.
Гостевой системе нужен адаптер VMXNET3. Проверьте с помощью lspci | grep -i vmxnet или убедитесь, что в файле .vmx указано ethernet0.virtualDev = "vmxnet3". Модуль обращается к сетевому адаптеру напрямую, поэтому интерфейс должен быть поднят и привязан к драйверу vmxnet3.
| Параметр | По умолчанию | Назначение |
|---|---|---|
ifname | eth0 | Интерфейс, связанный с адаптером VMXNET3 |
dryrun | 0 | 1 записывает дескрипторы, но пропускает doorbell, поэтому ничего не срабатывает |
wait_ms | 0 | Задержка в мс между настройкой дескрипторов и записью в doorbell |
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
Подтвердите сбой со стороны хоста в файле vmware.log данной ВМ, где будет показано PANIC: Unexpected signal: 11 с обратной трассировкой через аллокатор в потоке vcpu-0.
ifname должен указывать на устройство VMXNET3, а не на мост или вторичный адаптер e1000.need N entries but ring has M slots, если TX-кольцо не может вместить цепочку дескрипторов.| Хост | Ubuntu 24.04 LTS, ядро 6.17.0, glibc 2.39 |
| Гипервизор | VMware Workstation Pro 25.0.1 (сборка 25219725) |
| Гостевая система | Alpine Linux, ядро 6.12, сетевой адаптер VMXNET3 |
Смещения символов, упомянутые в анализе, специфичны для сборки 25219725. Уязвимый шаблон одинаков во всех сборках, но смещения будут различаться.
vmxnet3_tso_trigger.c trigger module
Makefile out-of-tree kernel module build
Умножение необходимо выполнять в 64 битах, а результат должен быть ограничен до того, как он попадёт в аллокатор. Ограничения отдельных полей дескриптора недостаточно, поскольку переполнение является свойством произведения, а не какого-либо из операндов.
| Дата | Событие |
|---|---|
| 2026 | Сообщено в Trend Micro ZDI |
| Сентябрь 2026 | Исправлено Broadcom в 26H1u1 (VMSA-2026-0007) |
| Сентябрь 2026 | Опубликовано ZDI-26-647 |
Опубликовано в рамках скоординированного раскрытия, после выпуска исправления. Запускайте только против систем, которыми вы владеете или которые вам разрешено тестировать. Это приведёт к сбою хост-процесса гипервизора, поэтому не направляйте его на что-либо, что вам дорого.
Stan S - cyberstan.co.uk · @0xCyberstan