VMware Tools 서비스 검색 LPE (CWE-426) - regex 기반 바이너리 검색 취약점 (CVE-2025-41244)

Reading time: 7 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 지원하기

이 기법은 실행 중인 프로세스의 명령줄을 파싱하여 서비스 버전을 추론한 뒤 후보 바이너리를 "version" 플래그로 실행하는 regex 기반의 service discovery 파이프라인을 악용합니다. 허용적인 패턴이 /tmp/httpd 같은 신뢰할 수 없는 공격자가 제어하는 경로를 허용하면, 권한 있는 수집 프로세스가 신뢰되지 않은 위치의 임의 바이너리를 실행하여 로컬 권한 상승이 발생합니다. 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가 구성된 권한 있는 자격증명을 사용해 VMware Tools를 통해 게스트 내부에서 discovery 스크립트를 실행합니다.
  • Credential-less (modern): Discovery 로직이 이미 게스트 내에서 권한을 가진 VMware Tools 내에서 실행됩니다.

두 모드 모두 궁극적으로 리스닝 소켓이 있는 프로세스를 스캔하고, 정규식으로 일치하는 명령 경로를 추출한 뒤 첫 번째 argv 토큰을 버전 플래그와 함께 실행하는 셸 로직을 실행합니다.

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

open-vm-tools에서 serviceDiscovery 플러그인 스크립트 get-versions.sh는 넓은 정규식을 사용해 후보 바이너리를 매칭하고, 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 (공백이 아닌 문자)를 포함한 관대한 패턴으로 호출되어 사용자 쓰기 가능한 위치에 있는 비시스템 경로와 쉽게 매치됩니다:

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: arbitrary binaries located in world-writable directories (e.g., /tmp/httpd) get executed by a privileged component.

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

Preconditions

  • 게스트에서 listening socket을 여는 unprivileged 프로세스를 실행할 수 있어야 함.
  • discovery job이 활성화되어 주기적으로 실행되어야 함 (과거에는 약 5분).

Steps

  1. 허용적인 regex 중 하나와 일치하는 경로에 바이너리를 스테이징(배치), 예: /tmp/httpd 또는 ./nginx
  2. 저권한 사용자로 실행하고 어떤 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

아티팩트 (자격 증명 기반) /tmp/VMware-SDMP-Scripts-{UUID}/ 아래에서 복구된 SDMP 래퍼 스크립트는 악성 경로를 직접 실행하는 것을 보여줄 수 있습니다:

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)

많은 에이전트와 모니터링 스위트는 버전/서비스 검색을 다음 방식으로 구현합니다:

  • 리스닝 소켓을 가진 프로세스 열거
  • argv/command lines를 허용적인 regex로 Grepping(예: \S를 포함하는 패턴)
  • 일치한 경로를 -v, --version, -V, -h 같은 무해한 플래그로 실행

만약 regex가 신뢰할 수 없는 경로를 허용하고 그 경로가 권한 있는 컨텍스트에서 실행되면, CWE-426 Untrusted Search Path execution이 발생합니다.

악용 방법

  • 바이너리 이름을 regex가 매칭할 가능성이 높은 일반적인 데몬 이름처럼 지정: httpd, nginx, mysqld, dataserver
  • 쓰기 가능한 디렉토리에 배치: /tmp/httpd, ./nginx
  • regex에 매칭되고 열거되도록 임의의 포트를 오픈하도록 보장
  • 스케줄된 수집기를 기다리면 자동으로 권한 있는 -v 호출을 얻음

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

재사용 가능한 권한 있는 I/O 릴레이 기법

  • 헬퍼를 작성할 때 권한 있는 호출(-v/--version) 시 알려진 rendezvous(예: @cve 같은 Linux abstract UNIX socket)에 연결하고 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 ->

Aria SDMP(credential-based)에서

  • /tmp/VMware-SDMP-Scripts-{UUID}/를 검사하여 일시적 스크립트와 stdout/stderr 아티팩트에서 공격자 경로 실행 흔적을 확인

정책/telemetry

  • 권한 있는 수집기가 비시스템 접두사에서 실행되면 경보: ^/(tmp|home|var/tmp|dev/shm)/
  • get-versions.sh 및 VMware Tools plugins에 대한 파일 무결성 모니터링

Mitigations

  • Patch: CVE-2025-41244(Tools 및 Aria Operations SDMP)에 대한 Broadcom/VMware 업데이트 적용
  • 자격 증명 없이 실행되는 discovery를 가능하면 비활성화하거나 제한
  • 신뢰된 경로 검증: 실행을 허용된 디렉토리로 제한(/usr/sbin, /usr/bin, /sbin, /bin)하고 정확히 알려진 바이너리만 허용
  • \S 같은 허용적인 regex 회피; 앵커된(explicit) 절대 경로와 정확한 명령 이름을 선호
  • discovery 헬퍼의 권한을 가능한 한 낮추고, 영향 감소를 위해 sandbox(seccomp/AppArmor) 적용
  • vmtoolsd/get-versions.sh가 비시스템 경로를 실행하는지 모니터링 및 경보

Notes for defenders and implementers

더 안전한 매칭 및 실행 패턴

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 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE) Azure 해킹 배우기 및 연습하기: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks 지원하기