Leaking data

更新 5/21/24: 記事末尾にアトラシアンの声明を追加。

アトラシアンの Bitbucket アーティファクトオブジェクトに平文として流出した認証の秘密を使って、AWS アカウントに侵入する脅威者が発見されました。

この問題は、脅威行為者が AWS にアクセスするために使用した Amazon Web Services (AWS) の秘密の最近の暴露を調査していた Mandiant によって発見されました。

この問題は調査中に発見されましたが、以前は保護されていると考えられていたデータが、公開リポジトリに平文で流出する可能性があることを示しています。

BitBucketの保護された変数

Bitbucketは、アトラシアンが運営するGit互換のウェブベースのバージョン管理リポジトリとホスティングサービスで、開発者にコード管理とコラボレーションのプラットフォームを提供している。

Bitbucket Pipelines は、ビルド、テスト、デプロイのプロセスを自動化する継続的デリバリー/デプロイ (CI/CD) サービスです。

システム管理者は、アプリを迅速にデプロイし、AWS CLI、SDK、その他のAWSツールを使用してリソースにアクセスするために、PipelinesをAWSに直接リンクすることが多い。

この自動化を促進するために、Bitbucketでは開発者がAWS認証秘密のような機密情報を「保護された変数」に保存し、他人にキーを公開することなく、コード内でそれらの変数を簡単に使用できるようにしています。

Storing secured variables in Bitbucket
Bitbucket
にセキュアな変数を保存する:Mandiant

BitBucketでセキュアな変数に設定されると、Bitbucket環境での値の公開を防ぐため、暗号化された形で保存される。

「Bitbucketのドキュメントによると、”変数をセキュアに設定することで、スクリプトでその変数を使用することができますが、その値はビルドログで隠されます(以下の例を参照)。

「セキュアな変数を編集したい場合は、新しい値を与えるか、削除するしかありません。 セキュア変数は暗号化された値として保存されます。”

しかし、Mandiantは、パイプラインの実行中に生成されるアーティファクトオブジェクトに、セキュアな変数を含む機密情報が平文で含まれている可能性があることを発見した。開発者は、これらの機密情報がアーティファクトファイルで公開されていることに気づいていない可能性があるため、ソースコードが公開リポジトリに公開され、脅威行為者がそれらを盗むことができる可能性があります。

平文での秘密

アーティファクトは、BitbucketプロジェクトのCI/CDプロセスを指定するために使用されるbitbucket-pipelines.yml設定ファイルで定義されます。

これらのファイルのディレクティブの1つにartifacts:があり、これは変数、ファイル、ディレクトリをアーティファクトオブジェクトにエクスポートして保持し、ビルドとテストプロセスのさらなるステップで使用するために使用されます。

Mandiant社によると、開発者はprintenvコマンドを使用して、すべての環境ファイルをテキストファイルに保存し、それをアーティファクトオブジェクトに渡して、ビルドプロセスの今後のステップで使用するのが一般的だという。

Exporting all environment variables to an artifact object
すべての環境変数をアーティファクト・オブジェクトにエクスポート
ソースはこちら:Mandiant

しかし、このようにすると、「セキュリティで保護された変数」が暗号化された形ではなく、平文でアーティファクトファイルにエクスポートされてしまいます。

このようなアーティファクト・ファイルが公共の場所に保存されている場合、脅威行為者はテキスト・ファイルを開いてすべての変数をプレーンテキストで見ることができます。

Text file exposing secrets in plain text
:マンディアント

「Mandiantは、開発チームがトラブルシューティングの目的で、WebアプリケーションのソースコードにBitbucketの成果物を使用した事例を見たが、開発チームが知らないうちに、それらの成果物には秘密鍵のプレーンテキスト値が含まれていた

「この結果、秘密鍵がインターネット上に公開され、攻撃者に不正アクセスされた。

Mandiantによると、CI/CDパイプラインを定義する「bitbucket-pipelines.yml」ファイルを誤って設定し、ログや成果物にセキュリティで保護された変数を含めることも考えられるという。

パイプラインスクリプトがデバッグ目的で環境変数をログに記録する場合、意図せずに機密情報をログに記録してしまう可能性があり、これらのログは通常アクセス可能な場所に保存されるため、再び秘密が暴露されるリスクがあります。

緩和策のヒント

Mandiant 社は、Bitbucket は機密を管理するようには設計されていないことを開発者に注意喚起しています。

開発者はまた、生成されたファイル内にプレーンテキストの秘密が含まれていないことを確認するために、成果物を注意深くレビューすることを推奨します。

最後に、パイプラインのライフサイクル全体にわたってコードスキャンを導入し、コードが本番環境に到達する前に、シークレットが暴露されるイベントをキャッチし、それらを削除することが推奨されます。

更新 5/21/24: アトラシアンは、Google が示した方法は開発者が行うには異例であり、セキュリティのベストプラクティスに反すると述べています。

「ユーザーがパイプラインのビルド中にセキュアな変数をファイルに出力するのは異例であり、この行為はセキュリティのベストプラクティスに反します。我々は、顧客がCI/CDの様々なユースケースを持っていることを理解しており、Bitbucketユーザーがパイプラインを構成する際にセキュリティのベストプラクティスに従うことを強く推奨する。また、シークレットスキャン、Snykを使ったコードスキャン、その他のサポートされているセキュリティ統合を追加することをお勧めします。さらに、Bitbucket は業界標準の慣習に従い、Pipelines 変数を暗号化し、ログでその出力をマスクすることで、不注意による秘密の漏えいを防ぎます。”- アトラシアン