“シークレット”が危ない!?―GitHub Copilotがもたらす新たなセキュリティリスク

セキュリティ研究者は、Copilot、CodeWhispererからハードコードされた有効なシークレットを取り出すことに成功。シークレットの拡散に関連した新しい形のセキュリティリスクが見えてきた。
Yes, GitHub's Copilot can Leak (Real) Secrets

本記事は、GitHubなどから流出したシークレットをリアルタイム検知するサービスを提供するGitGuardian社のWebサイトで公開された記事をテリロジーワークスが日本語に翻訳したものです。

(原題)Yes, GitHub’s Copilot can Leak (Real) Secrets 

このところ、ChatGPTやOpenAIのGPT技術といった先進的言語モデルに伴う倫理上、プライバシー上の懸念に注目が集まっています。こうした懸念により、これら先進的言語モデルの使用による潜在的なリスクという、重大な問題が浮上しています。ただし、注意が必要なのはこうした汎用言語モデルだけではありません。コーディングアシスタントといった専門に特化したツールにも、そのツールならではの懸念があるのです。

関連情報: 使っていないから大丈夫!ではない。ChatGPTが組織にとってセキュリティ上の懸念になる理由

GitHubのブログ記事によると、GitHubのコード生成ツール、Copilotは、発表から一年ほどで、100万人もの開発者が使用し、20,000を超える企業・組織が採用。生成されたコード行数は30億行を超えています。

一方で、発表から此の方、著作権上の問題やプライバシー上の懸念といった法律的なリスクについて、多方面からセキュリティ上の懸念が指摘されています。もちろん、危険なコーディングの提案もその一つで、これについてはVladimir Radchenko氏によるMediumへの投稿「コード中へのシークレットの書き込みを促す危険な提案」等、各所で事例が報告されています。

このような新たに登場し、話題となっている生産性向上ツールについては、それに伴う潜在的リスクを正確に評価しようと、現在、セキュリティ研究者による調査が各所で行われています。

本ブログ記事では、香港中文大学の研究者らによる最近の調査を掘り下げ、GitHubのCopilotとAmazonのCodeWhispererを悪用し、これらのモデルトレーニング中に露出したシークレットの収集が可能かどうかについて検証します。

参考論文

Neural Code Completion Tools Can Memorize Hard-coded Credentials

GitGuardian発行の『2023 State of Secrets Sprawl』で取り上げているように、GitHubではハードコードされたシークレット、すなわちコード中に書き込まれたシークレットが蔓延しています。2022年は1,000万件ものシークレットが新たに検出され、前年の600万件から67%の増加となっています。

GitHub CopilotがGitHub上のデータでトレーニングされていることを考えると、コーディングアシスタントが何者かに悪用され、実際のシークレットがコードサジェスチョンで漏えいしてしまう可能性が懸念されます。

ハードコードされた認証情報の抽出

こうした仮説を検証するため、セキュリティ研究者たちはある実験を試みました。プロンプト生成アルゴリズムを構築し、LLM(大規模言語モデル)から認証情報を取り出そうという実験です。結論は言うまでもありません。GitHubのコード片(コードスニペット)から900件のプロンプト(訳注:AIへの指示)を構築したところ、なんとCopilotからは2,702件、CodeWhisperからは129件のシークレットの収集に成功したのです(誤検知については後述する特殊な手法で排除)。

驚きだったのは、そのうち200件、7.4% (CodeWhisperは18件、14%に相当)が、GitHub上での特定が可能な実際のハードコーディングされたシークレットであった点です。さすがに研究者たちも、これらシークレットが有効かどうかの検証は控えたようですが、それでもこうした大規模言語モデルが攻撃の手段として悪用される可能性があることが示されました。そのため、予測精度が向上すれば、流出した認証情報の抽出や不正利用の可能性は現実になると考えられます。

プロンプト・エンジニアリング・マシンの設計

研究の目的は、プロンプトの適切な工夫により攻撃者はシークレットの抽出が可能かどうかを検証することです。この可能性を検証するため、研究者はプロンプト検証マシン、通称「Hard-coded Credential Revealer」(HCR)を開発しました。

このマシンは、記憶シークレット(訳注:パスワード等のユーザーしか知り得ない情報のこと)が吐き出される可能性を最大化するよう設計されています。それには、モデルにシークレットを”強制的に”吐き出させる強力なプロンプトの構築が必要です。このようなプロンプトの構築は、正規表現のパターンを使ってGitHub上でシークレットがコード中に書き込まれたファイルを探すところから始まります。次に、オリジナルのハードコードシークレットに変更を加え、HCRマシンからモデルに対しコードを提案するよう要求します。

the Hard-coded Credential Revealer (HCR)

もちろん、このモデルはありもしない「架空の」認証情報を出力することが多いため、有効な認証情報を抽出するわずかな可能性のために何度もリクエストを実行する必要があります。 

また、実際に使用中の認証情報を見つけ、システムにログインするまでには、多くのプロンプトをテストする必要があります。 

今回の調査では、GitHub上のコードスニペットの特定に、18種類のシークレット(AWSアクセスキー、Google OAuthアクセストークン、GitHub OAuthアクセストークン等)に対応する、18のパターンを使用しています。

18種類のシークレットは全体を網羅しているとはいえませんが(GitGuardianのシークレットスキャナーは、350種類以上のシークレットの検出が可能です)、ソフトウェア開発者に広く使われ、特定が容易なサービスは網羅できています。

次に、このシークレットをオリジナルファイルから削除し、コーディングアシスタントを使って新しい文字列を提案します。これらの提案は、4つのフィルターを通ることで、誤検知が可能な限り排除されます。

シークレットは次の場合に破棄されます:

– 正規表現のパターンと一致しない

– エントロピーが十分ではない(ランダム性が十分ではない、例:AKIAXXXXXXXXXXXXXXXX

– パターンが認識可能(例:AKIA3A3A3A3A3A3A3A3A

– 一般的な単語を含んでいる(例:AKIAIOSFODNN7EXAMPLE

上記のテストをすべてパスしたシークレットは「有効」、つまり現状に即した場合、本物のシークレット(トレーニングデータのどこかでハードコードされている)である可能性が高いということになります。

検証結果

Copilotによる8,127件の提案の中から、有効なシークレット2,702件が抽出されました。よって、全体的な有効率は、2702/8127 = 33.2%。つまり、Copilotは、プロンプト1回あたりの有効シークレット件数は、2702/900 = 3.0個、ということになります。

CodeWhispererは全部で736個のコードスニペットを提案し、その中から129個の有効なシークレットを特定。よって有効率は129/736 = 17.5%となります。

注意:本研究における有効なシークレットとはそのシークレットが本物であるという意味ではありません。フィルターを問題なく通過し、結果として本物のシークレットに相当する属性を持つシークレットという意味になります。

では、こうしたシークレットが実際に使用可能な本物の認証情報かどうかを判断するにはどうすればいいのでしょうか。論文の中で著者達は、倫理的な理由から、検証したのは有効な認証情報のごく一部と説明していました(Stripe Test Keysのような開発者がプログラムをテストするためのテストキー)。

それよりも、著者達が求めているのは、収集された有効な認証情報の正当性を検証する方法です。GitHub上でシークレットが出現する、記憶域(memorization)を評価する必要があるのです。

本研究の後半では、有効なシークレットの特徴に焦点を当てています。GitHubのコード検索機能を使って有効なシークレットを検索し、強力な記憶シークレット(最初に削除されたシークレットと全く同じシークレット)と脆弱な記憶シークレット(ほかの(複数の)リポジトリから抽出されたシークレット)を選別しています。最終的に、GitHub上にはあり得ない、別のソースから取り込まれた可能性のあるシークレットが残ります。

結果

この研究論文から、GitHub CopilotやAmazon CodeWhispererといったコーディングアシスタントツールによる、重大なプライバシーリスクが明らかになりました。調査結果では、こうしたモデルがトレーニングデータに存在するオリジナルのシークレットを漏えいするだけでなく、どこか別の場所のトレーニングコーパスで遭遇した別のシークレットをサジェスト(提案)してしまう可能性が示唆されています。結果、機密情報が外部にさらされ、重大なプライバシー上の懸念が生じることになります。

例えば、ハードコードされたシークレットが、開発者により漏えいされてしまった場合、たとえそのシークレットをGit履歴から削除しても、同研究で述べられているプロンプト手法を用いることで抽出が可能です。この研究では、こうしたモデルが、トレーニングデータで見つかった有効かつ運用中のシークレットをサジェスト(提案)できることを示しています。

こうした調査結果は、武漢大学の研究者らによる別の研究、Security Weaknesses of Copilot Generated Code in GitHubで裏付けられています。この研究では、CopilotでGitHubプロジェクトから生成した435のコードスニペットを分析し、複数のセキュリティスキャナーを使って脆弱性を特定しています。

この研究によると、プログラミング言語に関係なく、Copilotが生成したコードスニペットの35.8%にセキュリティ上の脆弱性が見られたということです。こうした問題点をCommon Weakness Enumerations(CWE)で分類したところ、「ハードコードされた認証情報」(CWE-798)がコードスニペットの1.15%に存在することが確認されました。これは特定された600件のCWEの1.5%に相当します。

対策

LLMに対するプライバシー攻撃に対応するには、プログラマーと機械学習エンジニアの両方の協力が必要です。

ハードコードされた認証情報の出現を回避する手段として、研究論文の著者らは、一元的な認証情報管理ツールとコードスキャンを使用し、ハードコードされた認証情報がコード中に入り込ませないことを推奨しています。

コーディングアシスタントモデルの開発には様々なステージがありますが、アプローチはステージごとに異なります:

– 事前学習前:トレーニングデータをクリーニング処理することで、ハードコードされた認証情報を排除する。

– トレーニングまたはファインチューニング工程:(Differential Privacy:DP)のようなアルゴリズムによる防御手法を採用することで、プライバ差分プライバシーシーを担保する。DPはモデルのプライバシーを確保する手段として非常に効果的である。

– 推論工程: モデルアウトプットを後処理することで、シークレットを除去できる。

まとめ

今回の研究からは、GitHub CopilotやAmazon CodeWhispererといったコーディングアシスタントツールに伴う重大なリスクが明らかになりました。研究者たちは、プロンプトを巧みに構築し、GitHub上で入手できるコードを分析することで、モデルから膨大な量のハードコードシークレットを抽出することに成功しました。

こうした脅威への対策として、プログラマーは一元的な認証情報管理ツールとコードスキャンを使用し、ハードコードされた認証情報を入り込ませないようにすることを推奨します。機械学習エンジニアは、トレーニングデータからハードコードされた認証情報を排除する、差分プライバシー(DP)のようなプライバシー保護のための手法を適用する、推論工程においてシークレットを除去するといった対策を講じてください。

今回の調査結果では、CopilotとCodeWhispererだけでなく、AIを活用したあらゆるコーディングアシスタントツールにおけるセキュリティ対策の必要性がクローズアップされています。開発者は、こうした問題に対策をした上でツールをリリースする必要があります。

まとめると、大規模言語モデルおよびコーディングアシスタントツールに伴うプライバシーリスクへの対応ならびに機密情報の保護には、プログラマー、機械学習エンジニア、ツール開発者が協力して取り組む必要があります。一元的な認証情報管理、コードスキャン、ハードコードされた認証情報のトレーニングデータからの除去といった推奨された対策を実行することで、プライバシーリスクは効果的に軽減できます。これらツールならびにこれらツールが扱うデータのセキュリティとプライバシーを確保するには、プログラマー、機械学習エンジニア、ツール開発者といったステークホルダーが一丸となり、協力し合うことが何より重要です。