VMware Tools service discovery LPE (CWE-426) via regex-based binary discovery (CVE-2025-41244)

Reading time: 8 minutes

tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks

Hierdie tegniek misbruik regex-gedrewe diensontdekking-pyplyne wat lopende proses-opdraglyne ontleed om diensweergawes af te lei en dan 'n kandidaat-binary met 'n "version" vlag uit te voer. Wanneer permissiewe patrone onbetroubare, deur 'n aanvaller beheerde paaie aanvaar (bv. /tmp/httpd), voer die bevoorregte versamelaar 'n ewekansige binary vanaf 'n onbetroubare ligging uit, wat lei tot lokale privilege-eskalasie. NVISO het dit gedokumenteer in VMware Tools/Aria Operations Service Discovery as CVE-2025-41244.

  • Impact: Lokale privilege-eskalasie na root (of na die bevoorregte discovery-rekening)
  • Hoof oorsaak: Onbetroubare Soekpad (CWE-426) + permissiewe regex-ooreenkoms van proses-opdraglyne
  • Geaffekteer: open-vm-tools/VMware Tools op 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 voer discovery-skripte binne die guest uit via VMware Tools met gekonfigureerde bevoorregte credentials.
  • Credential-less (modern): Discovery-logika hardloop binne VMware Tools, wat reeds bevoorreg is in die guest.

Albei modusse voer uiteindelik shell-logika uit wat prosesse met luisterende sockets deursoek, 'n pasende opdragpad via 'n regex onttrek, en die eerste argv-token met 'n version-vlag uitvoer.

Root cause and vulnerable pattern (open-vm-tools)

In open-vm-tools pas die serviceDiscovery plugin-skrip get-versions.sh kandidaat-binaries aan met breë regular expressions en voer die eerste token uit sonder enige trusted-path verifikasië:

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
}

Dit word aangeroep met permissiewe patrone wat \S (nie-witruimte) bevat, en wat maklik nie-stelselspaaie in gebruikers-skryfbare liggings sal pas:

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
  • Uittrekking gebruik grep -Eo en neem die eerste token: ${COMMAND%%[[:space:]]*}
  • Geen whitelist/allowlist van vertroude stelselpade; enige ontdekte listener met 'n ooreenstemmende naam word uitgevoer met -v/--version

Dit skep 'n onbetroubare soekpad-uitvoering-primitive: arbitrêre binaries geleë in gidse wat deur almal geskryf kan word (bv. /tmp/httpd) word deur 'n bevoorregte komponent uitgevoer.

Exploitation (both credential-less and credential-based modes)

Voorvereistes

  • Jy kan 'n onbevoorregte proses uitvoer wat 'n luistersok op die gas oopmaak.
  • Die ontdekkings-taak is geaktiveer en loop periodiek (histories ~5 minute).

Stappe

  1. Plaas 'n binary in 'n pad wat ooreenstem met een van die permissiewe regexe, bv. /tmp/httpd of ./nginx
  2. Voer dit as 'n laag-privilegie gebruiker uit en verseker dat dit enige luistersok oopmaak
  3. Wag vir die ontdekking-siklus; die bevoorregte versamelaar sal outomaties uitvoer: /tmp/httpd -v (of soortgelyk), wat jou program as root laat loop

Minimale demo (gebruik NVISO se benadering)

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

Tipiese prosesafstamming

  • 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

Artefakte (credential-based) Herstelde SDMP wrapper-skripte onder /tmp/VMware-SDMP-Scripts-{UUID}/ kan direkte uitvoering van die kwaadwillige pad toon:

bash
/tmp/httpd -v >"/tmp/VMware-SDMP-Scripts-{UUID}/script_-{ID}_0.stdout" 2>"/tmp/VMware-SDMP-Scripts-{UUID}/script_-{ID}_0.stderr"

Generalizing the technique: regex-driven discovery abuse (portable pattern)

Baie agents en monitoringsuites implementeer weergawe-/diensontdekking deur:

  • Prosesse met luister-sokette op te noem
  • Grepen van argv/kommando-lyne met permissiewe regexes (bv. patrone wat \S bevat)
  • Die gematchte pad uit te voer met 'n skynbaar onskadelike vlag soos -v, --version, -V, -h

As die regex onbetroubare paaie aanvaar en die pad uit 'n bevoorregte konteks uitgevoer word, kry jy CWE-426 Untrusted Search Path uitvoering.

Abuse recipe

  • Noem jou binêre soos algemene daemons wat die regex waarskynlik sal pas: httpd, nginx, mysqld, dataserver
  • Plaas dit in 'n skryfbare gids: /tmp/httpd, ./nginx
  • Maak seker dit pas by die regex en open enige poort om opgetel te word
  • Wag vir die geskeduleerde versamelaar; jy kry 'n outomatiese bevoorregte aanroep van -v

Masquerading note: Dit stem ooreen met MITRE ATT&CK T1036.005 (Match Legitimate Name or Location) om die kans op 'n pas en onopvallendheid te verhoog.

Reusable privileged I/O relay trick

  • Bou jou helper sodat dit by bevoorregte aanroep (-v/--version) verbind met 'n bekende rendezvous (bv. 'n Linux abstract UNIX socket soos @cve) en stdio na /bin/sh -i oorbrug. Dit vermy op-skyf artefakte en werk oor baie omgewings waar dieselfde binêre her-aanroep word met 'n vlag.

Detection and DFIR guidance

Hunting queries

  • Ongewone onderliggende prosesse van vmtoolsd of get-versions.sh soos /tmp/httpd, ./nginx, /tmp/mysqld
  • Enige uitvoering van nie-stelsel absolute paaie deur discovery-skripte (soek na spasies in ${COMMAND%%...} uitbreidings)
  • ps -ef --forest om voorouersbome te visualiseer: vmtoolsd -> get-versions.sh ->

On Aria SDMP (credential-based)

  • Kontroleer /tmp/VMware-SDMP-Scripts-{UUID}/ vir transiente skripte en stdout/stderr-artefakte wat uitvoering van aanvallerpaaie toon

Policy/telemetry

  • Waarsku wanneer bevoorregte versamelaars vanaf nie-stelsel voorvoegsels uitvoer: ^/(tmp|home|var/tmp|dev/shm)/
  • Lêer-integriteitsmonitering op get-versions.sh en VMware Tools-plugins

Mitigations

  • Patch: Pas Broadcom/VMware-opdaterings toe vir CVE-2025-41244 (Tools en Aria Operations SDMP)
  • Deaktiveer of beperk credential-less discovery waar moontlik
  • Valideer vertroude paaie: beperk uitvoering tot geallowliste gidsies (/usr/sbin, /usr/bin, /sbin, /bin) en slegs presiese bekende binêre
  • Vermy permissiewe regexes met \S; verkies geankerde, eksplisiete absolute paaie en presiese kommando-name
  • Laat privilegies val vir discovery-helpers waar moontlik; sandbox (seccomp/AppArmor) om impak te verminder
  • Monitor en waarsku oor vmtoolsd/get-versions.sh wat nie-stelsel paaie uitvoer

Notes for defenders and implementers

Veiliger pas- en uitvoerpatroon

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

Verwysings

tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks