Legit Securityは、GitHub Copilot Chat AIアシスタントに存在した脆弱性について詳細を明らかにしました。この脆弱性により、機密データの漏洩やCopilotの応答を完全に制御できる状態になっていました。
Content Security Policy(CSP)のバイパスとリモートプロンプトインジェクションを組み合わせることで、Legit SecurityのOmer Mayraz氏は、プライベートリポジトリからAWSキーやゼロデイバグを漏洩させたり、他のユーザーに対するCopilotの応答に影響を与えたりすることができました。
Copilot Chatは、コードの説明や提案を提供するよう設計されており、ユーザーはHTMLコメントを使って、レンダリングされたMarkdownからコンテンツを非表示にすることができます。
隠されたコメントは、通常通りリポジトリ所有者へのプルリクエスト通知をトリガーしますが、コメントの内容は表示されません。しかし、このプロンプトは他のユーザーのコンテキストにも注入されます。
Mayraz氏が説明しているように、隠しコメント機能により、ユーザーはCopilotに対して他のユーザーに悪意のあるパッケージを含むコード提案を表示させることが可能になります。
Mayraz氏はまた、ユーザーのプライベートリポジトリへアクセスし、その内容をエンコードしてURLに付加するような指示を含むプロンプトを作成できることも発見しました。
「そして、ユーザーがそのURLをクリックすると、データが私たちの元に流出します」と彼は述べています。
しかし、GitHubの厳格なCSPは、プラットフォームが所有していないドメインからの画像やその他のコンテンツの取得をブロックするため、被害者のチャットにHTMLの<img>タグを注入してもデータ漏洩を防いでいます。
READMEやMarkdownファイルに外部画像が含まれている場合、GitHubはそれらを解析してURLを特定し、オープンソースプロジェクトCamoを使って各ファイルの匿名URLプロキシを生成します。
外部URLはCamoプロキシURLに書き換えられ、ブラウザが画像をリクエストすると、CamoプロキシはURL署名をチェックし、GitHubによって署名されたURLの場合のみ元の場所から外部画像を取得します。
これにより、任意のURLを使ったデータの流出が防がれ、画像取得には管理されたプロキシが使われることでセキュリティが確保され、READMEに画像が表示される際に画像URLが公開されることもありません。
「被害者のチャットに注入するすべての<img>タグには、事前に生成された有効なCamo URL署名が含まれていなければなりません。そうでなければ、GitHubのリバースプロキシはコンテンツを取得しません」とMayraz氏は述べています。
この保護を回避するため、研究者はアルファベットのすべての文字や記号の辞書を作成し、それぞれに対応するCamo URLを事前生成して、注入するプロンプトにその辞書を埋め込みました。
彼は、各リクエストに1×1の透明ピクセルで応答するウェブサーバーを作成し、リポジトリから機密情報を漏洩させるために利用できるすべての文字や記号のCamo URL辞書を作成し、その後、脆弱性を引き起こすプロンプトを構築しました。
Mayraz氏は、プライベートリポジトリからゼロデイやAWSキーを流出させる攻撃の実証(PoC)動画も公開しています。
8月14日、GitHubはCamoを使った機密ユーザー情報の漏洩を禁止することで、この問題に対処したと研究者に通知しました。
翻訳元: https://www.securityweek.com/github-copilot-chat-flaw-leaked-data-from-private-repositories/