code scanning 用の Copilot Autofix について
GitHub Copilot Autofix は code scanning の拡張機能であり、新たなセキュリティの脆弱性の発生を回避できるよう、code scanning アラートを修正するのに役立つターゲットを絞った推奨事項をユーザーに提供します。 潜在的な修正は、コードベース、および code scanning 分析からのデータを使用して、大規模な言語モデル (LLM) によって自動的に生成されます。 GitHub Copilot Autofix は CodeQL 分析で使用でき、サードパーティ ツールの ESLint をサポートしています (サードパーティ サポートは パブリック プレビュー 段階にあり、変更される可能性があります)。
メモ
GitHub Copilot Autofix の使用には、GitHub Copilot のサブスクリプションは不要です。 Copilot Autofix は、GitHub.com のすべてのパブリック リポジトリだけでなく、GitHub Code Security のライセンスを持つ organization や Enterprise が所有する内部またはプライベート リポジトリでも使用できます。
Copilot Autofix は既存のソース コードに関連する潜在的な修正を生成し、アラートの説明と場所をアラートを修正できる可能性のあるコード変更に変換します。 Copilot Autofix は内部の GitHub Copilot API を使って OpenAI の大規模言語モデル GPT-4.1 と連携します。これはコードの修正提案とそれらの修正の説明テキストを生成するのに十分な生成機能を備えています。
Copilot Autofix は既定で許可され、CodeQL を使用するすべてのリポジトリで有効になっていますが、Copilot Autofix をオプトアウトして無効にすることを選択できます。 Enterprise レベル、organization レベル、およびリポジトリ レベルで Copilot Autofix を無効にする方法については、「コード スキャンの Copilot Autofix を無効にする」を参照してください。
組織のセキュリティの概要ダッシュボードでは、所定の期間に組織内のオープンおよびクローズされた pulll request で生成されたコード候補の合計数を表示できます。 詳しくは、「セキュリティの分析情報の表示」をご覧ください。
開発者エクスペリエンス
Code scanning ユーザーは既に、セキュリティ アラートを確認して、pull request を分析できます。 ただし、開発者は安全なコーディングに関するトレーニングをほとんど受けていないことが多いため、これらのアラートを修正するにはかなりの労力が必要です。 まず、アラートの場所と説明を読んで理解し、その理解に基づいてソース コードを編集して脆弱性を修正する必要があります。
Copilot Autofix は、ベスト プラクティスに関する情報にコードベースとアラートの詳細を組み合わせて開発者に潜在的な修正を提案することで、開発者が作業を開始する際の障壁を下げます。 開発者は、脆弱性に関する情報の検索から開始するのではなく、コードベースについて潜在的なソリューションを示すコード候補から開始します。 開発者は、潜在的な修正を評価して、それがコードベースにベストのソリューションであるかどうかを判断し、意図する動作が維持されることを確認します。
提案された修正、または変更した修正をコミットした後、開発者は、pull request を統合する前に、コードベースが継続的インテグレーション テスト (CI) に引き続きパスし、アラートが解決済みとして表示されることを常に確認する必要があります。
CodeQL code scanning のサポートされている言語
Copilot Autofix は C#、C/C++、Go、Java/Kotlin、Swift、JavaScript/TypeScript、Python、および Ruby のために、既定およびセキュリティ拡張した CodeQL クエリ スイートに含まれる一部のクエリについて修正の生成をサポートします。 これらのクエリ スイートの詳細については、「CodeQL クエリ スイート」を参照してください。
修正候補の生成プロセス
リポジトリに対して Copilot Autofix が有効になっている場合、検出された code scanning アラートから LLM に入力が送信されます。 LLM が潜在的な修正を生成できる場合、修正は推奨として表示されます。
GitHub は、code scanning 分析から、さまざまなデータを LLM に送信します。 次に例を示します。
- CodeQL アラート データ (SARIF 形式)。 詳しくは、「Code scanningの SARIF サポート」をご覧ください。
- ブランチの現在のバージョンからのコード。
- それぞれのソースの場所、シンクの場所、アラート メッセージで参照されていたりフロー パスに含まれていたりするすべての場所の周辺のコードの短いスニペット。
- これらの場所のいずれかに関係する各ファイルの最初の最大 10 行。
- 問題を特定した CodeQL クエリのヘルプ テキスト。 例については、「CodeQL query help」(CodeQL クエリ ヘルプ) を参照してください。
Copilot Autofix の提案が生成され、code scanning のバックエンド内に格納されます。 候補として表示されます。 コードベースで code scanning を有効にして pull request を作成する以外に、ユーザー操作は必要ありません。
修正プログラムを生成するプロセスでは、上記の範囲を超えて顧客データが収集または利用されることはありません。 したがって、この機能の使用は、Advanced Security に関連付けられている既存のご契約条件によって管理されます。 さらに、Copilot Autofix によって処理されるデータが LLM のトレーニング目的のために使用されることは絶対にありません。 Advanced Security のご契約条件について詳しくは、Free、Pro、Team のドキュメントの「追加の製品および機能に適用される GitHub 条件」をご覧ください。
Copilot Autofix の制限と非決定性
code scanningのアラートに対する Copilot Autofix は、あらゆる状況のすべてのアラートに対して修正を生成できるわけではありません。 この機能はベスト エフォート ベースで動作し、常に成功する保証はありません。
Copilot Autofix の提案が生成されない可能性がある場合
いくつかの要因により、Copilot Autofix が修正の提案を正常に生成できない場合があります。
- "非決定性": 基になる大規模言語モデルは生成モデルであるため、決定論的ではありません。__ つまり、アラートとコードが同じであっても、実行可能な提案を生成できない場合、または試行により提案が異なる場合があります。
- "問題の複雑さとコンテキスト": 複雑な複数ファイルのコードベース全体でデータ フローをトレースする必要があるものや、微妙なロジックの欠陥を表すものなど、一部のセキュリティ アラートでは、モデルの解決が困難な場合があります。__
- "ファイル サイズ": 影響を受けるコードが非常に大きなファイルまたはリポジトリ内にある場合、LLM に提供されるコンテキストが切り捨てられる可能性があります。__ モデルは、周囲のコード ロジックを理解し、修正を安全に適用するために十分なコンテキストを必要とし、このコンテキストが制限されていると、機能は修正を試みません。
- "言語とフレームワークのカバレッジ": Copilot Autofix は、増え続ける言語と CodeQL アラートのリストに対応していますが、可能性のあるすべてのアラートの種類や言語をカバーしてはいません。__
候補の品質
GitHub は自動テスト ハーネスを使用することで、Copilot Autofix からの提案の品質を継続的に監視します。 これにより、LLM が生成した候補が、モデルの発展に伴ってどのように変化するかを把握できます。
テスト ハーネスには、強調表示されたコードがテスト カバレッジを持つさまざまなパブリック リポジトリの 2,300 を超えるアラートのセットが含まれています。 これらのアラートに対する候補は、コードベースにコミットする前にどの程度良好であるか、つまりどれくらい開発者が編集する必要があるかを確認するためにテストされます。 多くのテスト アラートでは、LLM が生成した候補をそのままコミットしてアラートを修正し、既存のすべての CI テストに引き続きパスすることも可能です。
さらに、有害である可能性をチェックするためにシステムはストレス テストされ (多くの場合、レッド チーム テストと呼ばれます)、LLM のフィルタリング システムは、有害な可能性のある提案がユーザーに表示されるのを防ぐのに役立ちます。
GitHub で候補をテストする方法
結果コードで code scanning とリポジトリの単体テストを実行する前に、提案されたすべての変更を編集されていない状態で統合することで、候補の有効性をテストします。
- code scanning アラートは提案によって修正されましたか?
- 修正によって、新しい code scanning アラートが発生しましたか?
- 修正によって、code scanning が検出できる構文エラーが発生しましたか?
- 修正によって、いずれかのリポジトリ テストの出力が変化しましたか?
さらに、成功した提案の多くをスポット的にチェックし、新しい問題を発生させずにアラートが修正されることを確認します。 これらのチェックの 1 つまたは複数が失敗した場合、提案された修正プログラムは、多くの場合、ほぼ正しいが、ユーザーが特定して手動で実行できるいくつかの軽微な変更が必要なことが、手動トリアージで示されました。
他のプロジェクトの有効性
テスト セットには、さまざまな種類のプロジェクトとアラートが含まれています。 Copilot Autofix でサポートされている言語を使用する他のプロジェクト用の提案も同様のパターンに従うことになると予想されます。
- Copilot Autofix は、アラートの大半にコードの提案を追加する可能性があります。
- 開発者が候補を評価すると、編集せずに、または軽微な更新で修正の大部分をコミットすることで、コードのより広いコンテキストを反映できると想定しています。
- コードベースまたは脆弱性に対する重大な誤解に基づくのは、提案された修正のごく一部です。
ただし、各プロジェクトとコードベースは一意であるため、提案された修正をコミットする前に開発者が編集する必要がある割合は多くなります。 Copilot Autofix は code scanning アラートを解決するのに役立つ貴重な情報を提供しますが、提案された変更を評価し、コードのセキュリティと正確性を確保するのは最終的にユーザーの責任です。
メモ
サポートされている言語の修正生成は、LLM の運用能力に依存します。 さらに、提案された各修正は、pull request に追加される前にテストされます。 修正候補がない場合、または修正候補が内部テストに不合格の場合、候補は表示されません。
候補の制限事項
Copilot Autofix からの提案を確認する際には、変更を受け入れる前に、常に AI の制限を考慮し、必要に応じて変更を編集する必要があります。 また、code scanning 用の Copilot Autofix を有効にする前に、リポジトリの CI テストと依存関係の管理を更新することも検討する必要があります。 詳細については、「候補の制限の緩和」を参照してください。
コード候補の制限事項
- 人間の言語: システムは主に英語データを使用します。これには、システムに送信されるプロンプト、データセット内の LLM が認識するコード、内部評価に使用されるテスト ケースが含まれます。 LLM が生成した提案は、他の言語で記述され他の文字セットを使用するソース コードとコメントでは、成功率が低くなる可能性があります。
- 構文エラー: 構文的に正しくないコード変更による修正をシステムが提案する可能性があるため、pull request について構文チェックを実行することが重要です。
- 場所エラー: 構文的に正しいコードであっても正しくない場所の修正をシステムが提案する可能性があります。つまり、ユーザーが場所を編集せずに修正を受け入れると、構文エラーが発生します。
- セマンティック エラー: 構文的に有効であるが、プログラムのセマンティクスを変更する修正をシステムが提案する可能性があります。 システムは、コードの動作に関するプログラマーやコードベースの意図を理解しません。 テスト カバレッジを適切に設定すると、開発者は修正によってコードベースの動作が変化しないことを確認できます。
- セキュリティの脆弱性と誤りの基になる修正: 基になるセキュリティ脆弱性を修復できなかったり、新しいセキュリティ脆弱性が発生したりする修正をシステムが提案する可能性があります。
- 部分的な修正: セキュリティの脆弱性に部分的にしか対処しない、または意図されているコード機能を部分的にしか保持しない修正をシステムが提案する可能性があります。 システムはコードベース内のコードのごく一部のみを見るので、必ずしもグローバルに最適または正しいソリューションを生成するとは限りません。
依存関係の候補の制限事項
提案された修正には、コードベースの依存関係の変更が含まれている場合があります。 依存関係管理システムを使用する場合、開発者が確認できるように変更が自動的にハイライトされます。 pull request をマージする前に、依存関係の変更がセキュリティで保護され、コードベースの意図されている動作が維持されることを必ず確認します。
- 新しい依存関係または更新された依存関係: 提案された修正の一部として、ソフトウェアの依存関係の追加または更新をシステムが提案する可能性があります。 たとえば、JavaScript プロジェクトが npm から依存関係を追加するように
package.json
ファイルを変更することを提案する場合などです。 - サポートされていない依存関係またはセキュリティで保護されていない依存関係: システムは、既存の依存関係のどのバージョンがサポートされているか、セキュリティで保護されているかを認識しません。
- 捏造された依存関係: より広範なエコシステムで公開されている依存関係に関しては、システムの知識は不完全です。 これにより、攻撃者が統計的にもっともらしい依存関係名で悪意のあるソフトウェアを公開すると、このソフトウェアへの新しい依存関係を追加する提案につながる可能性があります。
候補の制限の緩和
Copilot Autofix からの提案の制限を緩和する最善の方法は、ベスト プラクティスに従うことです。 たとえば、pull request の CI テストを使用して機能要件が影響を受けないことを確認することや、依存関係レビュー API やアクションなどの依存関係管理ソリューションを使用することです。 詳しくは、「依存関係の確認について」をご覧ください。
pull request の作成者は、同僚や自動ツールによって提案されたかどうかにかかわらず、レビュー コメントやコード変更の提案にどのように対応するかについて責任を負うことを忘れないでください。 開発者は、コードの変更に関する提案を常に批判的に見る必要があります。 必要に応じて、提案された変更を編集して、結果コードとアプリケーションが正しく、セキュリティで保護され、パフォーマンス基準を満たし、アプリケーションの他のすべての機能要件と非機能要件を満たすようにする必要があります。