AWSとGoogle CloudのCLIツールで情報漏洩の脆弱性 LeakyCLIが発生
2024年4月16日にクラウドセキュリティ企業のOrca Securityは2023年11月に修正された ログの資格情報が公開されるAzure CLI の脆弱性(CVE-2023-36052)と同様の脆弱性がAWSとGoogle Cloud CLI で確認されたとして脆弱性名「LeakyCLI」と名付け注意喚起を公表しました。
目次
脆弱性「LeakyCLI」の概要
CLI コマンドは通常安全な環境で実行される事を想定していますが、CI/CD パイプラインと組み合わせると、セキュリティ上の脅威となる場合もあり、Azure CLI、AWS CLI、 Google Cloud CLIの一部コマンドが環境変数の形式で機密情報を公開する可能性があります。
また、GitHub Actionsなどのツールで公開される時に、サイバー攻撃者により機密情報(環境変数へ記載されている、パスワード、ユーザー名、認証キー)を収集される可能性があります。
なおOrca Securityはこの脆弱性を Google と AWS の両方に通知し、両者はこれは現在の設計に基づいて予想される動作であると考えていると回答しました。
Azure CLI、AWS CLI、 Google Cloud CLIは、開発者のローカルのプライベート環境で最もよく使用されますが、継続的インテグレーションおよび継続的デプロイ (CI/CD) 環境でも使用できます。
CI/CD ユースケースの簡単な例としては、マスターするプッシュ イベントがあるたびにソースコードを Lambda 関数にデプロイすることが挙げられます。
name: AWS CI
on:
push:
branches:
- master
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Set up AWS CLI
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ secrets.AWS_REGION }}
- name: deploy
run: |
npx ncc build src/index.js
zip -j deploy.zip ./dist/*
aws lambda update-function-code --function-name MyFunction --zip-file fileb://deploy.zip
問題はサーバーレス環境
主な問題はAzure Functions (修正済み)、 Google Cloud Functions、および AWS Lambda など、サーバーレス環境のものでした。これらのサービスのドキュメント化された API には、環境変数を含むリソースの設定を返すアクションが含まれています。
興味深いのは、構成 (環境変数を含む) を返すのが get または describe コマンドだけでなく、 update および delete コマンドでもあることです。これにより、実環境で重大な設定ミスが持ち込まれました。
AWS CLI の漏洩
例えば、以下コマンドは関連するコマンドの一部でなかった場合でも、既存の環境変数を標準出力に送り返します。
aws lambda get-function-configuration
aws lambda get-function
aws lambda update-function-configuration
aws lambda update-function-code
aws lambda publish-version
以下はセキュリティ上の理由から、機密データは隠されています
Google Cloud CLIの漏洩
gcloud functions deploy <func> --set-env-vars
gcloud functions deploy <func> --update-env-vars
gcloud functions deploy <func> --remove-env-vars
上記のコマンドは、定義済みまたは事前定義された環境変数を 標準出力に送り返します。また、高度なシナリオでは、ビルド ログに戻ります。
開発者がそれに気づいていない場合、クラウド関数に既存の環境変数が存在する可能性があるため、GitHub Actions / Cloud build 経由でシークレット情報のマスキング機能を利用しても機能しません。
脆弱性による情報漏洩の可能性を調査
AWS
Github 検索で、Github Actions、CircleCI、TravisCI 経由のリークを対象として次のコマンドを実行したところ、1,000 件を超えるヒットが発生。
"aws lambda" AND ("update-function-configuration" OR "update-function-code" OR "publish-version") AND (path:.github/workflows OR path:.circleci OR path:.travis)
その後、手順は手動になり、制限が加えられました。いくつかのリポジトリに入り、ビルド ログを調べました。Oraの調査チームは、パスワードやキーなど、環境変数の機密情報とみなされる情報を不用意に漏洩するプロジェクトを何十件も遭遇しました。
アカウント ID や S3 バケット名などの一部の AWS 固有のパラメータはプライベートとみなされませんが、顧客はこのメカニズムを使用して知らず知らずのうちに独自の値を公開しており
アカウント ID から IAM ロール、パスワードやキーに至るまでの機密情報が漏洩する可能性があるとのことです。
GCP
Github 検索では、Github Actions、CircleCI、TravisCI、そして今回は Cloudbuild 経由のリークを対象として次のコマンドを実行しましたが、結果は137 件がヒットしました。
"gcloud functions deploy" AND ("--set-env-vars" OR "--update-env-vars" OR "--remove-env-vars") AND (path:.github/workflows OR path:.circleci OR path:.travis OR path:cloudbuild)
ここでも、プロジェクト名、サービス アカウント、環境変数の形式で漏洩した機密データを見つけることができました。
関連するプロジェクトにアクセスせずにどうやってCloudbuildのログを取得できるのかと思うかもしれないが、GCPはcloudbuild Githubアプリを通じてcloudbuild GitHubインテグレーションを提供しており、ビルド・トリガーごとにオプトインでGitHub内でビルド・ログを閲覧できるようになっているとのこと。
今回は興味深い悪用例をあまり見つけることができなかったので、ローカルなシナリオを実証することにした。実際に例が見つかったという事実は、このユースケースを検証するものであり、内部情報漏洩の脅威をもたらす可能性があり、ローカルの特権昇格につながる可能性があるとのことです。
対策
前述した通りGoogle と AWS は現在の設計に基づいて予想される動作であるとしている為積極的な修正はされません。
AWSの推奨対策
- サーバーレス リソースの機密性の高い値を保存するために環境変数を使用しない。
代わりに、サーバーレス コードでプログラム的に CSP シークレット ストア (AWS Secrets Manager など) からシークレットを取得するようにする。 - ビルド ログの内容を調べて、機密情報が含まれていないことを確認します。 「/dev/null」 にパイプしてコマンド出力を抑制するなどのアプローチを検討する。
- ログへのアクセスと、ユースケースに応じたスコープ アクセスを考慮する。
GCPの推奨対策
- 「-no-user-output-enabled」フラグを使用して出力を抑制する
- gcloudデプロイコマンドに組み込まれている「Secrets Manager(-set-secretsおよび-update-secrets)」を使用して認証情報を保存する
(参考:「シークレットを構成する | Google Cloud Functions に関するドキュメント」)
過去発生したAzure の脆弱性CVE-2023-36052の概要
CVE-2023-36052は、Microsoft Azure CLIにおけるRESTコマンドの情報漏洩脆弱性です。この脆弱性を悪用されると、攻撃者は認証情報を含むログ情報にアクセスできる可能性があります。
※脆弱性は修正済み
この脆弱性により、どのような情報が漏えいする可能性があるのか
攻撃者がこの脆弱性を悪用した場合、影響を受ける CLI コマンドによって作成され、Azure DevOps および/または GitHub Actions によってパブリッシュされたログ ファイルからプレーンテキストのパスワードとユーザー名を復元する可能性があります。