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

Ця техніка зловживає конвеєрами 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 — знаходить кандидатні бінарні файли за широкими регулярними виразами і виконує перший токен без будь-якої валідації довіреного шляху:

bash
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 (непробільний символ), які охоче відповідатимуть несистемним шляхам у місцях, доступних для запису користувачем:

bash
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 хвилин).

Кроки

  1. Розмістіть бінарний файл у шляху, що відповідає одному з дозволених регулярних виразів, наприклад /tmp/httpd або ./nginx
  2. Запустіть його від імені користувача з низькими привілеями і переконайтеся, що він відкриває будь-який слухаючий сокет
  3. Зачекайте на цикл discovery; привілейований collector автоматично виконає: /tmp/httpd -v (або подібне), запустивши вашу програму як root

Мінімальний демонстраційний приклад (використовуючи підхід NVISO)

bash
# 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}/ можуть показувати пряме виконання зловмисного шляху:

bash
/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 виконує несистемні шляхи

Примітки для захисників та впроваджувачів

Більш безпечний шаблон відповідності та виконання

bash
# 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

Посилання

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