
この脆弱性は、Jenkins のビルドパラメータからのユーザー制御入力が、Git チェックアウトコマンドに安全でない形で注入されるために発生します。
ユーザー入力はビルドパラメータ(例: gitParameters)として提供され、悪意のあるシェルコマンドを含む可能性があります。
このパラメータは GitParameterValue(StringParameterValue を拡張)にラップされ、その buildEnvironment() メソッドは、無害化処理を行わずにビルドコンテキスト内の環境変数として公開します。
SCM チェックアウトプロセス中に、Jenkins は build.getEnvironment() を介してビルド環境変数を読み込みます。
チェックアウトに使用されるブランチ名(localBranchName)は、これらの環境変数から取得されます。
その後、ブランチ名は CheckoutCommand.branch() メソッドに直接渡されます。
最後に、CheckoutCommand.execute() が基盤となる Git CLI コマンドを呼び出しますが、このコマンドはブランチ名を検証またはエスケープせずに連結します。
これによりコマンドインジェクションが可能になり、攻撃者が Jenkins ビルドホスト上で任意のシェルコマンドを実行できるようになります。
ユーザー入力(例: HTTP POST の JSON ペイロード)を処理するメソッド createValue は、Jenkins がリクエストを介してユーザー指定のパラメータ値(例: "selected": "master; rm -rf /")を受け入れる場所です。
入力は、入力のサニタイズや検証を行わずに、StringParameterValue を拡張する GitParameterValue にラップされます。
つまり、生のユーザーデータがビルドパラメータとして受け入れられ、ParameterValue インスタンスとして保存されるということです。

StringParameterValue を拡張する GitParameterValue クラスは、StringParameterValue から継承しますが、サニタイズ処理は追加されません。
コンストラクタチェーンにより、ユーザー入力は、後で Jenkins が環境変数を構築するために使用するオブジェクトに格納されます。
これにより、悪意のある入力が Jenkins のビルド環境変数に伝播します。
"
StringParameterValue クラスとその buildEnvironment メソッドは、このメソッドが重要であり、パラメータをビルドコンテキスト内の環境変数として公開します。
"
env.put(name, value);
env.put(name.toUpperCase(Locale.ENGLISH), value);
値はサニタイズされていないユーザー入力であるため、悪意のある入力が Jenkins の環境変数に入り込み、Git コマンドなどの後続のプロセスからアクセス可能になります。
GitSCM プラグインの _checkout メソッドは、build.getEnvironment(listener) を呼び出して、先に設定された悪意のある環境変数を含む環境変数を収集します。
これらの変数を使用してブランチ名(localBranchName 経由)を取得し、それを CheckoutCommand に渡します。
悪意のあるパラメータからの環境変数は、チェックアウトプロセスに直接流れ込みます。

CheckoutCommand の作成と、ユーザー入力によるブランチ/ref の設定では、CheckoutCommand.branch(localBranchName) がサニタイズされていない環境変数を使用します。
localBranchName はユーザー制御の環境変数に由来するため、チェックアウトに任意のコマンドを注入し、execute() が呼び出されたときのコマンドインジェクションの土台を築きます。

Git CLI コマンドを実行する CheckoutCommand.execute() メソッドは、注入されたブランチ文字列がエスケープやサニタイズなしでシステムの Git CLI に直接渡される最終ステップです。その結果、悪意のあるペイロードがシェルコマンドとして実行され、Jenkins ホスト上でのリモートコード実行が可能になります。
この分析は、Jenkins の Git Parameter Plugin が Git SCM プラグインと組み合わさることで、重大なコマンドインジェクションの脆弱性につながる可能性があることを明らかにしています。ユーザー制御のパラメータ値を環境変数として安全でない形で公開し、その後適切なサニタイズなしに Git CLI コマンドに直接渡すことにより、攻撃者は Jenkins ビルドサーバー上で任意のコマンドを実行できます。
この信頼連鎖の崩壊—最初の悪意のある JSON ペイロードから最終的なシェル実行まで—は、継続的インテグレーションシステムにおける厳格な入力検証とビルドパラメータの安全な処理の重要性を浮き彫りにしています。
ユーザーと管理者は、Jenkins とすべてのプラグインを更新済みのバージョンで実行していることを確認し、シェルコマンドに影響を与えるパラメータを注意深く監査する必要があります。入力のサニタイズ、許可されたブランチのホワイトリスト化、ビルド環境の分離などの緩和策により、リスクを軽減できます。
このフローを理解することで、セキュリティ専門家や開発者は、Jenkins または類似の CI/CD プラットフォームにおける同様のインジェクション脆弱性を検出、防止、および修復するために必要な洞察を得ることができます。

