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 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
이 기법은 실행 중인 프로세스의 명령줄을 파싱하여 서비스 버전을 추론한 뒤 후보 바이너리를 "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 검증 없이 첫 번째 토큰을 실행합니다:
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가 없음; 일치하는 이름의 발견된 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
- 허용적인 regex 중 하나와 일치하는 경로에 바이너리를 스테이징(배치), 예: /tmp/httpd 또는 ./nginx
- 저권한 사용자로 실행하고 어떤 listening socket이라도 열도록 확인
- discovery cycle을 기다려라; privileged 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
아티팩트 (자격 증명 기반) /tmp/VMware-SDMP-Scripts-{UUID}/ 아래에서 복구된 SDMP 래퍼 스크립트는 악성 경로를 직접 실행하는 것을 보여줄 수 있습니다:
/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
더 안전한 매칭 및 실행 패턴
# 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 – 이름만 대면, VMware가 권한을 상승시킵니다 (CVE-2025-41244)
- Broadcom의 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 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.