エクスプロイト&脆弱性
Jenkins Args4jの脆弱性「CVE-2024-23897」:ファイルの内容が流出するリスク
オープンソースの開発自動化サーバとして著名な「Jenkins」が、ファイル読み取りの脆弱性「CVE-2024-23897」を抱えていることが判明しました。
オープンソースの開発自動化サーバとして著名な「Jenkins」が、ファイル読み取りの脆弱性「CVE-2024-23897」を抱えていることが判明しました。Jenkinsでは、スクリプトやシェルによって操作を行うためのコマンドラインインターフェース(CLI:Command-Line Interface)が提供されています。ユーザが本インターフェース経由でコマンドを送信すると、Jenkinsのコントローラが、その内容や引数、オプションを解析するためにライブラリ「args4j」を使用します。本ライブラリに潜んでいた脆弱性が「CVE-2024-23897」であり、未認証のユーザであっても、システム中に存在するあらゆるファイルの先頭数行を読み取れるようになります。一方、認証済みのユーザであれば、ファイル全体を読み取ることも可能となります。
本脆弱性の深刻性を踏まえると、Jenkinsをご利用の場合は、セキュリティ対策を早急に実施することが強く推奨されます。
脆弱性の詳細
- 問題の機能:メソッド「expandAtFiles」
- 内容:当該のコマンド解析機能は、「@」に続くファイルパスの箇所を、当該ファイルの内容で置き換える
- 本機能のデフォルト設定:有効
- 影響を受けるバージョン:Jenkins 2.441またはそれ以前、LTS(長期サポート)2.426.2またはそれ以前
脆弱性を突く攻撃シナリオ
攻撃手段:任意のファイル読み出し
- 内容:攻撃者がJenkinsコントローラのファイルシステムから任意のファイルを不正に読み取る。その際の文字エンコードとして、Jenkinsコントローラ・プロセスのデフォルト設定を用いる。
- ユーザ権限に応じた影響:Jenkinsの権限「Overall/Read」を有する攻撃者であれば、ファイル全体を読み取れる。当該権限のない攻撃者でも、ファイルの先頭数行を読み取れる。読み取り可能な行数は、使用可能なCLI用コマンドに依存する。
アタックサーフェス(攻撃対象領域)
- 非営利セキュリティ団体「ShadowServer」の調査により、修正未適用のJenkinsインスタンスが45,000件以上特定された
- ShadowServerのダッシュボード
深刻度:重大(Jenkinsからの勧告:CVSS 10)、高(NVDの評価:CVSS 7.5)
ファイル読み取りを超えた影響:リモートコード実行の可能性
本脆弱性では、「任意のファイル読み取り」を引き金にさまざまな事象が発生し、図1に示すリモートコード実行(RCE:Remote Code Execution)に至る可能性があります。詳細については、Jenkinsの勧告文で詳しく述べられています。
最近の攻撃事例
調査の結果、本脆弱性を利用した攻撃がさまざまな地域から行われていることが判明しました。図2に、Shadowserverのデータに基づく攻撃元IPアドレスの地域分布を示します。図の内容より、オランダを起点とする攻撃が多いことが見て取れます。一方、標的の地域分布は図3の通りであり、特に南アフリカが狙われる傾向にあります。
確認された事例の大半は、概念実証(POC:Proof-Of-Concept)スキャナの利用に繋がるものです。さらに今回は、脆弱性「CVE-2024-23897」を突く攻撃の手段やコードが販売、取引されている状況にも遭遇しました。その中には、未認証状態でのRCE攻撃を主張するものさえ含まれていました(攻撃できるように謳っているだけで、詐欺の可能性もある)。
脆弱性の分析
脆弱性「CVE-2024-23897」を突く攻撃は、HTTP、WebSocket、またはSSH通信を介して行われます。中でも、HTTP、WebSocketによる攻撃の可能性が高いと考えられます。
HTTPのエンドポイントは、デフォルトで2種のPOSTリクエストを求めます。第1のリクエストによってコマンドや引数をサーバ側に「アップロード」します。次に、第2のリクエストによって当該コマンドの実行を要求し、さらにその結果を「ダウンロード」します。
リクエストの受信に際しては、以降の流れによって各メソッド(機能)が呼び出されます。
まず、CliCrumbExecutionのメソッドがエンドポイントの検証を行います。次に、FullDuplexHttpServiceのメソッドがリクエストや応答データの処理を行います(PlainCLIProtocolはリクエストの作成時にも使用)。最後に、CmdLineParserのメソッドがCLI経由の入力データからコマンドや引数を抽出します。この抽出処理に、先述の脆弱なライブラリ「args4j」が使用されます。
JenkinsのPlainCLIProtocol
JenkinsのJavaクラス「PlainCLIProtcol」が扱うバイナリデータには、さまざまなオペコード(Jenkinsにおける操作の種類を表す番号)が格納されています。
各オペコードには、ブーリアン型のプロパティ値「clientSide」が設定されます。その値がTrueの場合はクライアントからサーバへの通信であることを、Falseの場合はサーバからクライアントへの通信であることを示します。JenkinsのCLIプロトコルでは、クライアント・サーバ間で行われるさまざまな操作を、これらオペコードによって分類します。
Jenkinsによるバイナリデータの構造
Jenkinsが扱うバイナリデータは、「フレーム」と呼ばれる単位に分割されます。図8に、その具体例を示します(Alex Williamsによる)。
上図の通り、本プロトコルでは1つ1つのメッセージをフレームに格納して送信します。各フレームを構成するフィールドの内容を、下記に示します。
フレーム長(4バイト):「フレーム長」と「オペコード」を除いたフレームの大きさを示す。4バイトの符号付き整数値で表し、バイトオーダーとしてビッグエンディアンを使用する。
オペコード(1バイト):メッセージのオペコードを表す。
データ(可変):指定のオペコードに対応するデータを表す。図8の通り、オペコードに応じて「データ長」と「データ実体」に分けられる場合や、省略される場合(例:第5フレーム)もある。
脆弱性の主因となったコード
下図に、本脆弱性の主因となったライブラリ「Args4j」のコードを示します。
正常に利用した場合の動作
Jenkins-cli (Jenkins用コマンドラインインターフェース)における「@」の主な用途は、ユーザ名やパスワード、またはBearerトークンを含むファイルを指定することです。
Jenkins-cliの要認証コマンド「version」を未認証のまま実行すると、下記のエラーが表示されます。
オプション「-auth」を使用し、「@」に続けてパスワードファイルを指定すると、下記のように、コマンド「version」の実行結果が正常に表示されます。
脆弱性を突くシナリオ
Jenkins-cliで利用可能なコマンド(例:version)の引数に「@」を指定すると、図13のような結果が表示されます。
図中、「引数を指定できません(No argument is allowed)」というエラー文が表示されること自体は、正常な動作です。コマンド「version」は、本来、引数を受け取らないためです。しかし、直後にファイル「/etc/passwd」の内容(「root」で始まる箇所)が流出しています。
本シナリオで流出しうるデータの量は、コマンドの引数パターンに依存します。例えば、引数としてリストを指定できる場合、ファイル内容の全体が流出する恐れもあります。
$ java -jar jenkins-cli.jar -s http://172.17.0[.]1:8080/ -auth admin:pass reload-job @/etc/passwd
ファイル内容を複数行に渡って流出させるコマンドとしては、すでによく知られている「connect-node」の他、「reload-job」も確認されました。
以上の他、delete-job、delete-node、disconnect-node、offline-node、online-nodeなどのコマンドが利用される可能性があります。
攻撃に利用される代替コマンド:未認証ユーザの場合
攻撃に利用される代替コマンド:認証済みユーザの場合
Windowsからの攻撃用リクエスト
下図に示す攻撃用リクエストは、Windows端末からLinuxのJenkinsサーバを狙ったものです。文字エンコードとして「Windows-1252」が指定されていることが見て取れます。
Linuxからの攻撃用リクエスト
下図に、Linux端末からLinuxのJenkinsサーバを狙った際の攻撃用リクエストを示します。文字エンコードとして「UTF-8」が指定されています。
WebSocket通信による攻撃用リクエスト
下図に、WebSocket通信による攻撃用リクエストを示します。ユーザ入力の部分(コマンドや引数)は、データのマスク化によって見えなくなります。
まとめ
今回の脆弱性「CVE-2024-23897」は、Jenkinsのバージョン2.442およびLTS 2.426.3で修正されました。この修正により、コマンド解析に際しての危険な機能が削除されました。Jenkinsをご利用の方は、セキュリティインシデントを防ぐため、今回の修正パッチをできる限り早く適用することを推奨します。
トレンドマイクロのソリューション
下記のソリューションは、脆弱性「CVE-2024-23897」に対する攻撃を的確に検知し、ご利用のシステムを保護します。
「Trend Vision One Endpoint Security」、「Trend Cloud One - Workload Security and Endpoint Security」、「Deep Security and Vulnerability Protection」のIPSルール
- 1011966 - Jenkins Arbitrary File Read Vulnerability Over HTTP (CVE-2024-23897):JenkinsへのHTTP通信で任意のファイルが読み取られる脆弱性
- 1011976 - Jenkins Arbitrary File Read Vulnerability Over WebSocket (CVE-2024-23897):JenkinsへのWebSocket通信で任意のファイルが読み取られる脆弱性
「Trend Micro Cloud One - Network Security & TippingPoint」のフィルタ
- 43766: HTTP: Jenkins CI Server Arbitrary File Read Vulnerability:Jenkins CIサーバにおいてHTTP経由で任意のファイルが読み取られる
「Trend Vision One Network Sensor」、「Trend Micro Deep Discovery Inspector(DDI)」のルール
- 4997 - CVE-2024-23897 - Jenkins Authentication Bypass Exploit - HTTP (Request):Jenkinsにおける認証回避 - HTTPリクエスト
参考記事:
Jenkins Args4j CVE-2024-23897: Files Exposed, Code at Risk
By: Arun Shaji
翻訳:清水 浩平(Core Technology Marketing, Trend Micro™ Research)