ソフトウェア開発のビルドからテスト、そしてデプロイまでを自動化するオープンソースの継続的インテグレーション(CI)ツール「Jenkins」は、DevOpsなどの開発者に広く利用されています。Jenkinsのモジュール型アーキテクチャは、基本となる機能に「プラグイン」を追加して拡張することによって最大限活用できる仕組みになっています。Jenkinsコミュニティが提供するプラグインのサイト「Plugins Index」では、本記事執筆時点で1,600以上のプラグインが公開されています。しかし、公開されているプラグインの一部は、認証情報を暗号化せず、プレーンテキスト形式で保存することが確認されています。この状態では、情報漏えいが発生した場合、この認証情報を攻撃者に不正利用され、企業の機密情報へ知らぬ間にアクセスされる可能性があります。Jenkinsでは以前にCVE-2018-1000861などの脆弱性を利用した攻撃により不正マイニングやランサムウェア感染といった被害が発生しており、速やかな対応を推奨いたします。
2019年7月11日と8月7日に、上述のプレーンテキスト形式で保存される認証情報に関する問題他に対処するためのセキュリティアドバイザリがJenkinsから発表しました。本記事では、情報漏えいの脆弱性を持つプラグインに焦点を当てて説明します。
脆弱性番号 | プラグイン名 | セキュリティアドバイザリ詳細 (2019/9/12現在) |
CVE-2019-10348 | Gogs | Gogs Plugin バージョン1.0.15未満のバージョンは安全でない可能性有。 警告:プレーンテキスト形式で保存される認証情報 |
CVE-2019-10350 | Port Allocator | 最新バージョン1.8は安全でない可能性有。 プラグインの保守管理者が求められている。 警告:プレーンテキスト形式で保存される認証情報 |
CVE-2019-10351 | Caliper CI | 警告:プレーンテキスト形式で保存される認証情報 |
CVE-2019-10378 | TestLink | 最新バージョン3.16は安全でない可能性有。警告:プレーンテキスト形式で保存される認証情報 |
CVE-2019-10385 | eggPlant | 非推奨のプラグイン 警告:プレーンテキスト形式で保存される認証情報 |
留意点として、本記事執筆時点ではプラグイン「Port Allocator」、「TestLink」、および「Caliper CI」の脆弱性は未修正です。プラグイン「eggPlant」の現在のバージョンは、機密性を考慮すると安全ではないため非推奨とみなされています。
■認証情報の保存方法
これらのJenkinsプラグインの脆弱性は、ユーザ認証情報を窃取するために利用される可能性があります。Extended Read権限またはマスターファイルシステムへのアクセス権を持つユーザの認証情報が漏えいすると、特に、他のプラットフォームまたはサービスでも漏えいした認証情報と同じものを使用していた場合、他の統合サービスへのアクセスも攻撃者に許してしまう可能性があります。
Jenkinsプラグインの設定は通常、ルート「 $JENKINS_HOME 」内にXMLファイルの形式で保存され、各プラグインに必須の構造と設定を定義します。また、プラグインの設定は「$ JENKINS_HOME / jobs / new-job / config.xml」のようにジョブ設定ファイルの一部として保存される場合もあります。認証情報がプラグイン設定の一部である場合、暗号化された形式で保存することになっていますが、「Gogs」、「Port Allocator」、「Caliper CI」、「TestLink」、「eggPlant」の場合、認証情報は暗号化されず、以下の図1に示されているようにプレーンテキストで保存されます。
図1:プレーンテキストで保存されたAPIトークン
認証情報を安全に保存するための適切な方法は、Credentialsプラグインのような独立した別の認証情報プロバイダを利用することです。Credentialsを利用すると、「credentialsId」によって設定ファイルが参照されます。目的やその他の要件によっては、これも暗号化して認証情報を保存することのできる、クラス「Secret」を使用することができます。
ユーザが設定ファイルを読み取ることが可能な場合、プラグイン「credentialsId」による参照のみが表示されます。 実際の認証情報は参照元のファイル内に保存されています。
図2: CredentialsIdによる参照
暗号化した認証情報の保存に使用される「Credentials」は、Jenkins既定の推奨プラグイン一覧にも含まれています。 次に、認証情報の保存について説明します。
図3:Credentialsによる認証情報の保存
Credentialsプラグインは、暗号化された認証情報を「$ JENKINS_HOME / credentials.xml」に保存します。
図4:暗号化された認証情報が{}内に保存される
図4では、「base64」でエンコードされたパスワードが、赤い中括弧{}内に示されている部分に格納されています。Base64は、テキストデータを処理するように設計されたプラットフォーム上でバイナリデータを入力、保存、および転送するエンコード方式です。base64方式のデコーダーを使用することにより、以下の図5のように特定の非表示文字がエンコードされていることがわかります。
図5:base64方式でエンコードされた非表示文字
実際には、暗号化されたパスワードと暗号化メタデータがbase64方式を使用してエンコードされます。
これらの情報を復号する際に使用される鍵は、Jenkinsインスタンスごとにハードコーディングされています。ここで使用される鍵はJenkinsのインストールごとに異なるため、セキュリティ上の安全性を向上します。鍵は暗号化されてファイル「$ JENKINS_HOME / secrets / hudson.util.Secret」に保存されます。すべてのインスタンスを開く単一のマスターキーはありません。「hudson.util.Secret」ファイルは、マスターキーから派生した鍵を使用してAESで暗号化されます。この鍵もJenkinsのインストールごとに違うものが使用されます。
これらのことから、保存された認証情報の漏えいを防ぐには、ディレクトリ「$ JENKINS_HOME / secrets」を不要なアクセスから保護することが重要であると言えます。マスターでジョブまたはビルドを実行すると、Jenkins全体のセキュリティに影響するアクティビティ、例えばプラグインのインストール、新しいジョブの作成、認証情報やその他の機密情報の読み取りと抽出などが発生する可能性があります。さらに、マスターで実行されるジョブは、限られたアクセス権限しか持たないユーザに管理者権限を与え、シェルコマンドを使用して企業が持つすべての機密情報を出力することも可能にします。
■被害に遭わないためには
Jenkinsのプラグインによってプレーンテキストで保存された認証情報が、セキュリティ上の脅威につながる可能性があります。管理者は、ディレクトリ「$ JENKINS_HOME / secrets」にアクセス可能なユーザは、ディレクトリに保存されている認証情報へもアクセスが許可されていることに注意を払いましょう。また、ディレクトリ「$ JENKINS_HOME / hudson.util.Secret」と「$ JENKINS_HOME / secrets / master.key」は共に保存されたパスワードの復号に利用されるため、これが漏えいすると保存されたパスワードが復号される可能性があります。
JenkinsはすべてのDevOpsツールと同様にセキュリティを考慮して使用する必要があります。 デフォルトの設定ではセキュリティチェックは実施されないため、Jenkinsは、ユーザの認証やアクセス権限の管理、大規模なシステムではマスターノードでビルドしないことなど、ユーザ自身がベストプラクティスを講じることを推奨しています。どうしてもジョブをマスターノードで実行する必要がある場合、Jenkinsは、ユーザの権限によってジョブの実行またはノードの設定を制限するプラグイン「Job Restrictions」の使用を勧めています。
■トレンドマイクロの対策
トレンドマイクロは、アプリケーションを安全にビルドし、さまざまな環境に迅速にデプロイして実行するDevOpsチームを支援します。「Hybrid Cloud Security」は、DevOps 体制を支えるセキュリティチームに対して、「XGen」アプローチにより、物理・仮想・クラウドの混在環境における最適なセキュリティを提供します。総合サーバセキュリティ製品「Trend Micro Deep Security™」およびコンテナイメージを保護する「Deep Security Smart Check」により、デプロイおよび実行時にコンテナイメージをスキャンすることが可能です。
参考記事:
- 「Hiding in Plain Text: Jenkins Plugin Vulnerabilities」
By David Fiser (Senior Cyber Threat Researcher)
翻訳: 下舘 紗耶加(Core Technology Marketing, Trend Micro™ Research)