piyolog

piyokangoの備忘録です。セキュリティの出来事を中心にまとめています。このサイトはGoogle Analyticsを利用しています。

Jenkinsの脆弱性 CVE-2024-23897 についてまとめてみた

2024年1月24日、Jenkins セキュリティチームは、CI/CDツール Jenkinsのセキュリティ情報を公開しました。修正された脆弱性の内 任意のファイル読み取りの脆弱性 CVE-2024-23897 は深刻度をCriticalと評価されており、既に実証コードも公開されています。ここでは関連する情報をまとめます。

脆弱性の概要

Jenkins Security Advisory 2024-01-24

  • Jenkinsにはスクリプトまたはシェル環境からJenkinsへアクセスするコマンドラインインターフェースの機能 (Jenkins CLI)が組み込まれており、脆弱性 CVE-2024-23897はこのCLIを介して任意のファイル読み取りが行えるというもの。さらに特定の条件下においてリモートコード実行が可能となる恐れがある。Jenkins セキュリティチームはこの脆弱性を深刻度をCritical(CVSS基本値 9.8)と評価している。
  • 脆弱性の影響および修正されたバージョンは以下の通り。
影響を受けるバージョン Jenkins 2.441 以前のバージョン
Jenkins LTS 2.426.2 以前のバージョン
修正されたバージョン Jenkins 2.442
Jenkins LTS 2.426.3
  • 修正版に更新することで、ファイルパスに続く文字をCLIコマンドのファイル内容に置き換えるコマンドパーサー機能が停止する。
  • 回避策は、CLIへのアクセス無効化。Jenkinsセキュリティチームは即時更新が難しい場合の対策として、再起動も必要がないことから回避策の適用を推奨。

CLIコマンド処理に脆弱性

  • JenkinsではCLIコマンドの処理を行う際にargs4jライブラリを使用しており、Jenkinsコントローラーに対するコマンド引数、オプションの解析を行っているが、パーサーにおいてコマンド引数内のファイルパスに続く文字をファイルの中身に置き換える機能(expandAtFiles)が既定で有効(Jenkins 2.441以前、LTS 2.426.2以前のバージョン無効不可)となっていた。
  • 任意のファイル読み取りが可能な範囲は、攻撃者の権限で差がある。全体の読み取り権限がない場合の読み取り可能な行数は使用できるCLIコマンドで異なっており、Jenkins セキュリティチームはプラグインがインストールされていない環境で3行の読み取りが可能なことを確認。これ以上の読み取り行数を増やす影響を及ぼすプラグインについては把握していないとしている。
全体の読み取り権限がある場合 攻撃者はファイル全体を読み取ることが可能。
全体の読み取り権限がない場合 攻撃者はファイルの最初の数行を読み取ることが可能。
  • 脆弱性の詳細については、2023年11月に脆弱性について報告を行ったSonarSource が詳細な記事を公開している。

www.sonarsource.com

任意ファイル読み取りから派生する攻撃パターン
  • 暗号キーを含むバイナリデータの読み取りが可能となっていることに加え、いくつかの条件を満たせばJenkinsの稼働する環境でリモートコード実行が可能となる恐れがある。SonarSourceからの情報提供を受け、Jenkinsセキュリティチームが把握している条件付きケースは次の通り。なお、同チームはあくまでも現時点で把握されているパターンであって、最終的なものではないとして、バイナリファイルが不要な攻撃手段が存在する可能性があるとも言及している。
CVE-2024-23897悪用により実行可能な攻撃 攻撃が成立する前提条件
Resource Root URL 経由のRCE攻撃① ・Resource Root URL機能が有効
・CLI WebSocket エンドポイントへのアクセスが可能
・バイナリシークレットの取得が可能
・全体読み取り権限保有ユーザー名を把握または推測可能
Resource Root URL 経由のRCE攻撃② ・Resource Root URL機能が有効
・バイナリシークレットの取得が可能
・ユーザーのアカウントAPIトークンを保有(全体読み取り権限不要)
Cookie(Remember me)偽造によるRCE攻撃

Cookie偽造し、 Webブラウザを使用してJenkins に不正ログインが可能となる他、管理者アカウントの Cookie が偽造されると、スクリプトコンソールにアクセスが可能。
・Remember me機能が有効(既定で有効)
・バイナリシークレットの取得が可能
・最初の数行超またはファイル全体の読み取りが可能
ビルドログを介したStored XSSによるRCE攻撃

シリアル化されたコンソールノートオブジェクトを偽造し、任意のHTMLとJavaScript をビルド ログに挿入することにより Stored XSS 攻撃が可能
・プルリクエストなどでビルドログの出力が可能
・バイナリシークレットの取得が可能
この攻撃は2017年2月1日で追加された保護をバイパスする。
CSRF保護のバイパスによるRCE攻撃

CSRF トークン (Crumb) は、有効なクラムを含む POST リクエストの送信を行うことでこれをバイパスしCSRF 攻撃に使用可能
・バイナリシークレットの取得が可能

さらに以下条件のいずれかに該当。
・デフォルトのクラム発行者を使用し、Java システムプロパティのhudson.security.csrf.DefaultCrumbIssuer.EXCLUDE_SESSION_IDが「true」設定
・クラム生成にStrict Crumb Issuer Pluginを使用し、"Check the session ID "オプションが無効
Jenkinsに保存されているSecretの復号 ・バイナリシークレットの取得が可能
・暗号化されたSecretにアクセス可能
Jenkinsのデータを削除 ・Resource Root URL機能が有効
・バイナリシークレットの取得が可能
・全体読み取り権限保有ユーザー名を把握または推測可能
Jenkinsのコントローラープロセス、エージェントプロセスのJava ヒープダンプのダウンロード ・Resource Root URL機能が有効
・バイナリシークレットの取得が可能
・全体読み取り権限保有ユーザー名を把握または推測可能
ファイル拡張子のないヒープダンプファイルの生成許可
  • 読み取ろうとするバイナリデータについて、どの程度の可能となるかは使用されているエンコーディングによって決まる。Jenkinsセキュリティチームの検証によれば、Linux、MacOSの多くが使用するUTF-8の場合、全バイト中約半分が不正なプレースホルダー値となっていた。Windows-1252では256個の値の内、5個のみ不正なものに置き換えられていた。なお、テレメトリで観測したJenkins 2.437以降においては、匿名で使用状況を報告するJenkinsインスタンスの約90%がUTF-8で運用されていた。

影響を受けるホスト多数か

  • CVE-2024-23897のPoCとされる情報が既にGithubなどにアップロードされており、だれでも検証することが可能な状態となっている。なお、piyokangoが確認したPoCは、任意ファイルの読み取りが可能かを検証するもので、リモートコード実行が可能かを直接確認するものではなかった。公開されたPoCの有効性について、検証(/etc/passwdの読み取り)した報告もある。
  • ShadowServerは、脆弱性の影響を受ける可能性のあるホストの稼働状況を調査しており、2024年1月28日時点で日本は約800台が稼働中。
  • ハニーポットに対して、攻撃の試行とみられるアクセスを観測したとの報告もある。
影響を受けるホストの稼働状況(Shadow Serverの調査より)

更新履歴

  • 2024年1月30日 AM 新規作成