Jenkins の RCE 脆弱性 CVE-2024-43044 が FIX:PoC も提供される

CVE-2024-43044: Critical Jenkins Vulnerability Exposes Servers to RCE, PoC Exploit Published

2024/09/01 SecurityOnline — Jenkin の重大な脆弱性 CVE-2024-43044 (CVSS 8.8)技術的詳細PoC エクスプロイト・コードが、Conviso Labs のセキュリティ研究者により公開された。数多くの開発パイプラインにおいて不可欠な Jenkins は、攻撃者にとって格好の標的となっている。この脆弱性が悪用され、Jenkins サーバが侵害された場合には、クレデンシャルの盗難/無許可のコード修正/デプロイの中断などの、広範な攻撃アクションの足場とされる可能性が生まれる。新たに公開された脆弱性 CVE-2024-43044 は、このようなリスクの深刻さを例証している。


脆弱性 CVE-2024-43044 は、Jenkins コントローラからエージェントがファイルを読み取ることを可能にする、任意のファル読み取りの脆弱性として分類されている。根本的な原因は、エージェントへの JAR ファイルの送信をコントローラが許可するという、Jenkins の機能に起因する。この脆弱性は、エージェントが要求するファイル・パスを、コントローラ上で呼び出されるClassLoaderProxy#fetchJarメソッドが制限しないことに起因する。この制限の欠如により、コントローラのファイル・システム上において、不正なファイル・アクセスが可能になってしまう。


Conviso Labs の研究者たちは、この脆弱性の悪用のプロセスを、以下のように説明している。まず、この悪用プロセスは、hudson.remoting.RemoteClassLoader を活用するところから始まる。このRemoteClassLoader は、チャネルを介してリモート・ピアからクラスファイルをロードする。それを悪用する攻撃者は、hudson.remoting.RemoteInvocationHandler にリンクされた RemoteClassLoader内の Proxy オブジェクトにアクセスする。このハンドラは、fetchJar メソッドを呼び出すため、コントローラへの RPC (Remote Procedure Call) がトリガーされる。

private static class Exploit extends MasterToSlaveCallable<Void, Exception> {
    private final URL controllerFilePath;
    private final String expectedContent;
 
    public Exploit(URL controllerFilePath, String expectedContent) {
        this.controllerFilePath = controllerFilePath;
        this.expectedContent = expectedContent;
    }
    @Override
    public Void call() throws Exception {
        final ClassLoader ccl = Thread.currentThread().getContextClassLoader();
        final Field classLoaderProxyField = ccl.getClass().getDeclaredField("proxy");
        classLoaderProxyField.setAccessible(true);
        final Object theProxy = classLoaderProxyField.get(ccl);
        final Method fetchJarMethod = theProxy.getClass().getDeclaredMethod("fetchJar", URL.class);
        fetchJarMethod.setAccessible(true);
        final byte[] fetchJarResponse = (byte[]) fetchJarMethod.invoke(theProxy, controllerFilePath);
        assertThat(new String(fetchJarResponse, StandardCharsets.UTF_8), is(expectedContent));
        return null;
    }
}

コントローラ側では、ユーザが制御する URL を検証せずに、fetchJar メソッドがリソースを読み込むため、さらに深刻な事態が生じる。この重大な見落としにより、攻撃者はエージェント -> コントローラのアクセス制御システムをバイパスできるようになる。この制御システムは、コントローラへ向けたエージェントからの不正アクセスを防止するために設計されたセキュリティ機能であり、Jenkins バージョン 2.326 以降において、デフォルトで有効化されている。

Conviso Labs による PoC エクスプロイト・コードが、CVE-2024-43044 の深刻さを示している。攻撃シーケンスは以下の通りである:

  1. 参照の取得:まず、hudson.remoting.RemoteClassLoader参照を取得する。
  2. ファイルの読み取り:この参照を使用して、攻撃者はファイル・リーダーを作成し、コントローラから特定のファイルにアクセスする。
  3. データ抽出:攻撃者は、指定されたユーザーのクッキーを偽造するために、3つの重要なファイルを読み取る。
  4. ユーザー列挙: 次に、ID/タイムスタンプ/シード/ハッシュなどの詳細情報を含む、Jenkins ユーザーのリストを読み取る。
  5. クッキーの偽造:収集したデータを使用して、攻撃者は Jenkins スクリプト・エンジンへのアクセスが得られるまで、さまざまなユーザーの “remember-me” クッキーを偽造する。
  6. コマンドの実行:スクリプト・エンジンへのアクセスにより、攻撃者は Jenkins サーバー上でシステム・コマンドを実行できる。
  7. クレデンシャルのダンプ:最終的に、このエクスプロイトはユーザー名とハッシュを、John the Ripper のようなツールを使ってクラッキングできる形式でダンプする。

すでに Jenkins バージョン 2.471 と、LTS (long-term support) バージョン 2.452.4/2.462.1 において、この脆弱性 CVE-2024-43044は対処されている。Jenkins ユーザーに対して強く推奨されるのは、上記のバージョンへと直ちにアップデートし、この脆弱性がもたらすリスクを軽減することだ。