クラウド環境
環境変数による機密情報保持の隠れた危険性を分析
DevOpsでは、アプリケーションの機密を守るために環境変数を使用していますが、サイバー犯罪者は不正活動のために、この変数を悪用していることがトレンドマイクロの分析により判明しました。
DevOpsでは、アプリケーションの機密を守るために環境変数を使用していますが、サイバー犯罪者は不正活動のために、この変数を悪用していることがトレンドマイクロの分析により判明しました。
環境変数の使用は、設定値へのアクセスを容易にできるため、DevOpsコミュニティでは一般的となっています。特に、コンテナ化された環境においては重要視されています。しかし、クラウドセキュリティの観点からは、環境変数を使用し、機密情報を処理することは避けるべきです。なぜなら、この方法は比較的容易に攻撃者に悪用される場合があり、また機密情報が内部に保存され漏えいする等、危険にさらされる可能性があるからです。
環境変数とは
環境変数とは、ある環境に対して有効な鍵ペアのセットを指します(通常は、シェルまたはサブシェル)。鍵ペアは様々な方法で定義することが可能であり、グローバルな定義の1つが「export」コマンドです。このコマンドは、Linux OSにおけるコンテナ型アプリケーションを起動する際の「-eパラメータ」使用時のシェルスクリプト内において一般的に使用されます。または、コンテナ構築前の「Dockerfile」におけるENVコマンドの実行時において使用されます。ここでは、環境変数は暗号化されておらず、プレーンテキストとして存在しています。
この定義が、「技術的にどのような意味を持つか」を確認するためには、環境変数のスコープの有効性を明らかにする必要があります。図2では、スコープはシェルスクリプトや遂行時の環境及びその子プロセスによって抑制されています。コンテナを使用する場合は、コンテナ・プロセスとその子プロセスの間にバウンダリが設定されます。また、特性としては、環境変数がすべての子プロセスの内部でコピーされます。
さらに、詳細を調べると、環境変数は実行中のプロセスのスタックとして一度コピーされ、その後、子プロセスを生成するためにコピーされることが確認できました。これは、以下の場合に環境変数が新しいプロセスにコピーされることを意味します。
- 開発者が、wrapperアプリケーションを実行した場合
- 開発者が、環境変数を設定するスクリプトを起動し、同時にこの設定を必要としない他のアプリケーションを起動した場合
なぜ機密情報のために環境変数を使用すべきではないのか
トレンドマイクロは、機密情報管理の重要性、重要なシステムへのアクセスの危険性、そして機密情報の漏洩とサプライチェーンの危険性について記事を掲載しています。それでは、理想的な機密情報の管理とはどのようなものでしょうか。私たちは、被害に遭わないために以下を推奨します。
- 暗号化されたストレージ:認証情報や機密情報を別のパスワードで保管する。
- 安全なチャネルを使用して転送する:機密情報の送信に使用するチャネルは、傍受されないように設定する。また、漏洩を防ぐ措置を講じる。
- 定期的な更新:データベースやサービスにおける認証情報は、期間を設定し、定期的に更新する。
- 短期間の使用:原則として、機密情報は限られた時間内でのみメモリに記憶するべきであり、使用後はメモリを削除する。
上記にある「短期間の使用」とは、機密情報が一時的にメモリに存在し、使用後は削除されることを意味します。これは、オペレーティングシステムの実行と関連付けることができ、機密情報がメモリの一部として他のプロセス内で発見されるのを効果的に防ぐことができます。
機密情報を保持した環境変数による悪影響
例として、コンテナ内で「MySQL」データベースを実行している環境を分析したところ、rootパスワードが格納されている環境変数の漏洩は、機密情報自体へのアクセスよりも、さらに深刻な影響を及ぼすことが判明しました。
機密性の高い環境変数を含む場合に、CSP(クラウド・サービス・プロバイダ)のデフォルトサービス内のサーバレス機能(エンドポイント、データベース、メッセージキューへのアクセスのようなイベントやトリガ経由)を実行すると、その実行自体がメモリの読み込み脆弱性に基づく、全てのサービスへの侵害やRCE(リモートコード実行)に繋がる可能性があります。弊社の過去の記事において掲載したように、それは、あたかもユーザが実行されるコードを自ら提供しているかのような悪影響を引き起こします。
機密情報の管理に環境変数を使用することの隠れた危険性は、ソリューション・アーキテクトにより、たった1つの情報が漏れただけでも、セキュリティ上のバウンダリを越えてしまう可能性があることです。すべての子プロセスにコピー&ペースト機能があるため、子プロセスとして別のプログラムを生成するすべてのアプリケーションが脆弱である可能性が高く、漏洩の確率は増加します。
環境変数の特性を考慮すると、アプリケーションを設計する際に環境変数を使用する場合や、開発者が機密情報を保存するために環境変数が再利用される際には、DevOpsチームがそれらを確認することが容易ではありません。そのため、開発者はアプリケーションを設計する際に、該当するプロパティとそのプログラミングの役割をしっかりと認識する必要があります。最善のシナリオとしては、機密情報の保存に環境変数を使用しないことでしょう。
クラウドサービスにおける環境変数内の機密情報の実態
クラウドサービスに関する調査やインシデントのモニタリングのなかで、一部のCSP(クラウド・サービス・プロバイダ)が認証プロトコルの異なるステップで環境変数を使用していることを確認しました。彼らのサービスの安全性を保つために、この問題に関しCSPと協議し、プロバイダ名は公には明らかにしないこととしました。
開発者がCLI (コマンドライン・インターフェース) ツール、あるいは「Visual Studio Code」などのプラットフォームにおいて拡張機能を使用する必要がある場合、初期設定のプロセスを実行します。ここでは、CSPの サービスへのアクセスを許可するためにパスワードまたはキーが要求されます。また、認証トークンは、トークンを含むローカル・ファイル(通常プレーンテキスト)または環境変数を介して、検証のために 2 つの方法で保存されます。
トレンドマイクロのサーバレスサービスの研究時に、開発者の機器内の環境変数が、サーバレス実施後の内部に同じ環境変数として存在する可能性を確認しました。発見された機密情報は、2019年に報告されたように、さまざまな場面で悪用される恐れがあります。攻撃者がサーバレスの環境においてCSPの公式CLIツールのダウンロードに成功すると、機密情報を介してサービスに付与された権限と特権が継承されます。
ハッカー集団が、機密データに簡単にアクセスできることから、クラウド、パイプライン、ツールがサイバー犯罪者の標的になることをトレンドマイクロは予測し、実際に少なくとも2つの事例を確認しています。最初のケースにおいては、ハッカー集団「TeamTNT」が既に侵入されていたクラウド環境を狙い、特に機密性の高い環境変数を探索していました。さらに、Pythonライブラリのコードが変更され、同じ機密変数の内容を取得し始めるというサプライチェーン攻撃も報告されています。
機密情報を環境変数に保持する手法の普及率
トレンドマイクロが、すべての情報源にアクセスすることは容易ではないため、この普及率についての報告は推定値となります。しかし、図9に示すように多くの開発者は、機密情報を環境変数として保持することが、秘密鍵やパスワードを扱う際に最も安全な方法であると考えていることが分かります。
トレンドマイクロは、機密情報を保存するためのより安全な選択肢として、環境変数に代わり「vault」(機密情報管理のためのツール)を利用すべきと考えます。また、機密情報は、必要時のみ暗号化されたチャネルを使って取得し、鍵ペアの使用後はメモリを消去することを提案します。この方法を用いることにより、機密情報はデプロイしたアプリケーション内にシングル・プロセスとして保存されます。そして、子プロセス(攻撃ベクトルを増大させる要因)への漏洩のリスクは回避されます。
環境変数と脆弱性
幸いにも、環境変数を機密情報の保存場所として安全と考えているのは少数です。しかし、ソフトウェア製品の開発やCSPの調査を通じ、いくつかの実例を観察してみると未だに、この問題は重要視されていません。
結論
本来であれば、アプリケーションの関数やデータに環境変数を使用することは安全、高速、かつ効率的であるはずです。また、保存されるデータは、認証情報、アクセストークン、ログインURL、接続文字列など攻撃に利用される可能性のある機密情報を排除することが大切です。DevOpsは、これを共通の認識として捉えていますが、過去に発生した事例では、これらが悪用され長期的に企業や組織に影響を与える可能性があったことが示唆されています。
被害に遭わないためには
トレンドマイクロでは、機密情報の管理に環境変数を使用する際の影響につき開発者が十分に理解することが大切と考えます。より安全な管理とそのための推奨事項を以下に列挙します。
トレンドマイクロのソリューション
最善のシナリオは、プロジェクトの内容やチームの規模に関係なく、安全な管理方法を選択することです。それは、環境変数として機密情報を保存することを完全に回避することを意味します。また、完全なシステムを構築することは大変難しい課題ですが、DevOpsの開発者は、リスクを最小限に抑え、サイバー犯罪者にアプリケーションにおける追加の攻撃ベクトルを提供しないためのツールが存在することを知っています。以下に列挙されたセキュリティのベスト・プラクティスは、リスクによる影響を軽減するのに役立ちます。
- 環境及びプロジェクトを保護するための CSP の推奨事項(該当するドキュメントに記載されている)に従う。
- 鍵やパスワードの保管に「vault」を使用する。これにより、追加のコストが発生する可能性があるが、ユーザ及びセキュリティ・チームは、認証情報の保管に対してセキュリティを強化することができる。
- カスタム・イメージを使用する。デフォルトのサービスでは、デプロイと開発のスピードと効率が向上するが、カスタム・コンテナイメージの設計とインプリメントにおいては、すぐに使用可能なソリューションと追加のセキュリティを実現する余地が広がる。
- 暗号化されたチャネルとパイプラインを使用する。環境変数の値をロックすることで、不正なアクセスがあった場合でも、パスワードやIDなどの機密情報を確実に保護することができる。
参考記事:
• 「Analyzing the Hidden Danger of Environment Variables for Keeping Secrets」
By: David Fiser, Alfredo Oliveira
翻訳:新井 智士(Core Technology Marketing, Trend Micro™ Research)