Copilot自動修正についてcode scanning
GitHub Copilot 自動修正 は code scanning の拡張であり、ユーザーが新しいセキュリティの脆弱性の導入を回避できるように、 code scanning アラートを修正するのに役立つ、対象を絞った推奨事項をユーザーに提供します。 潜在的な修正は、コードベースのデータと code scanning 分析からのデータを使用して、大規模な言語モデル (LLM) によって自動的に生成されます。
GitHub Copilot 自動修正 は、 CodeQL 分析に使用できます。
メモ
GitHub Copilot 自動修正 の使用には、GitHub Copilot のサブスクリプションは不要です。 Copilot自動修正 は、GitHub.com のすべてのパブリック リポジトリだけでなく、GitHub Code Security のライセンスを持つ organization や Enterprise が所有する内部またはプライベート リポジトリでも使用できます。
Copilot自動修正 は、既存のソース コードに関連する潜在的な修正プログラムを生成し、アラートの説明と場所を、アラートを修正できるコード変更に変換します。
Copilot自動修正では、OpenAI の大規模な言語モデル GitHub Copilotとやり取りする内部GPT-5.1 API が使用されます。この API には、コードで推奨される修正プログラムと、それらの修正プログラムの説明テキストの両方を生成するための十分な生成機能があります。
Copilot自動修正 は既定で許可され、 CodeQLを使用するすべてのリポジトリで有効になっていますが、 Copilot自動修正をオプトアウトして無効にすることもできます。 エンタープライズ レベル、組織レベル、リポジトリ レベルで Copilot自動修正 を無効にする方法については、 [AUTOTITLE](/code-security/code-scanning/managing-code-scanning-alerts/disabling-autofix-for-code-scanning) を参照してください。
組織のセキュリティ概要ダッシュボードでは、指定した期間に組織内のオープンおよびクローズ済みプル リクエストに対して生成されたコード提案の合計数を確認できます。 詳しくは、「セキュリティの分析情報の表示」をご覧ください。
開発者エクスペリエンス
Code scanning ユーザーは、プル要求を分析するためのセキュリティ アラートを既に確認できます。 ただし、開発者は安全なコーディングに関する十分なトレーニングを受けていないことが多く、これらのアラートを修正するには多大な労力が必要になります。 まずアラートの場所と説明を読み理解し、その理解に基づいてソース コードを編集して脆弱性を修正する必要があります。
Copilot自動修正 は、ベスト プラクティスに関する情報とコードベースとアラートの詳細を組み合わせて開発者に潜在的な修正を提案することで、開発者へのエントリの障壁を減らします。 脆弱性に関する情報を検索するところから始める代わりに、開発者は自身のコードベースに対する修正候補を示すコード提案から作業を開始できます。 開発者は、その修正候補がコードベースにとって最適な解決策かどうか、また意図した動作が維持されているかどうかを評価します。
提案された修正、または変更を加えた修正をコミットした後は、プル リクエストをマージする前に、コードベースの継続的インテグレーション (CI) テストが引き続き成功していることと、アラートが解決済みとして表示されていることを必ず確認してください。
サポートされている言語 CodeQLcode scanning
Copilot自動修正では、CodeQLの既定のクエリ スイートとセキュリティ拡張C#、C/C++、Go、Java/Kotlin、Swift、JavaScript/TypeScript、Python、Ruby、Rust他の %}と Rubyクエリ スイートに含まれるクエリのサブセットの修正生成がサポートされています。 これらのクエリ スイートの詳細については、「[AUTOTITLE](/code-security/code-scanning/managing-your-code-scanning-configuration/codeql-query-suites#built-in-codeql-query-suites)」を参照してください。
提案生成プロセス
リポジトリに対して Copilot自動修正 が有効になっている場合は、識別されたアラート code scanning LLM に入力を送信します。 LLM が修正候補を生成できる場合、その修正は提案として表示されます。
GitHubは、code scanning分析からLLMに多様なデータを送信します。 例えば次が挙げられます。
-
CodeQL アラート データ (SARIF 形式)。 詳しくは、「[AUTOTITLE](/code-security/code-scanning/integrating-with-code-scanning/sarif-support-for-code-scanning)」をご覧ください。 -
ブランチの現在のバージョンのコード。
- 各ソース位置、シンク位置、およびアラート メッセージで参照されている、またはフロー パスに含まれているすべての位置周辺の短いコード スニペット。
- これらの位置に関連する各ファイルの先頭約 10 行。
-
問題を特定した CodeQL クエリのヘルプ テキスト。 例については、クエリのヘルプCodeQL参照してください。
Copilot自動修正提案はすべて生成され、code scanning バックエンド内に格納されます。 それらは提案として表示されます。 コードベースで code scanning を有効にしてプル要求を作成する以外に、ユーザーの操作は必要ありません。
修正生成のプロセスでは、上記で定義された範囲を超えて顧客データを収集または利用することはありません。 したがって、この機能の使用は、 Advanced Securityに関連付けられている既存の使用条件によって管理されます。 さらに、 Copilot自動修正 によって処理されるデータは、LLM のトレーニング目的では厳密には使用されません。 Advanced Security使用条件の詳細については、「追加の製品および機能に適用される GitHub 条件 Free、Pro、&Team のドキュメントを参照してください。
の制限事項と非決定性 Copilot自動修正
Copilot自動修正
code scanningアラートでは、あらゆる状況のすべてのアラートに対して修正プログラムを生成することはできません。 この機能はベスト エフォート ベースで動作し、常に成功する保証はありません。
Copilot自動修正候補が生成されない場合
いくつかの要因により、 Copilot自動修正 が推奨される修正プログラムを正常に生成できなくなる可能性があります。
-
_非決定性:_ 基盤となる大規模言語モデルは生成モデルであるため、非決定的です。 つまり、アラートとコードが同じであっても、実行可能な提案を生成できない場合、または試行により提案が異なる場合があります。 -
_問題の複雑さとコンテキスト:_ 複雑な複数ファイルのコードベースにまたがるデータ フローの追跡が必要なセキュリティ アラートや、微妙なロジックの欠陥を示すアラートなどは、モデルで解決するのが困難な場合があります。 -
_ファイル サイズ:_ 影響を受けるコードが非常に大きなファイルやリポジトリ内にある場合、LLM に提供されるコンテキストが切り詰められる可能性があります。 モデルは、周囲のコード ロジックを理解し、修正を安全に適用するために十分なコンテキストを必要とし、このコンテキストが制限されていると、機能は修正を試みません。 -
_言語とフレームワークの対象範囲:_Copilot自動修正では言語と CodeQL アラートの一覧が増えていますが、考えられるすべてのアラートの種類や言語については説明しません。
候補の品質
GitHub では、自動テスト ハーネスを使用して、 Copilot自動修正からの提案の品質を継続的に監視します。 これにより、モデルの進化に伴って LLM により生成される提案がどのように変化するかを把握できます。
テスト ハーネスには、テスト カバレッジがあるコードが含まれる多様な公開リポジトリからの 2,300 件を超えるアラートが含まれています。 これらのアラートに対する提案は、開発者がコードベースにコミットする前にどの程度編集が必要かという観点で評価されます。 多くのテスト アラートでは、LLM により生成された提案をそのままコミットしても、既存のすべての CI テストに引き続き合格しながらアラートを修正できました。
さらに、潜在的な有害性を確認するためにシステムはストレス テスト (一般にレッド チーミングと呼ばれる) を実施しており、LLM のフィルタリング システムによって、潜在的に有害な提案がユーザーに表示されないようにしています。
GitHub による提案のテスト方法
結果のコードで code scanning とリポジトリの単体テストを実行する前に、すべての提案された変更を未編集でマージすることで、提案の有効性をテストします。
-
code scanningアラートは提案によって修正されましたか? - この修正プログラムでは、新しい code scanning アラートが導入されていますか?
- 修正により、 code scanning が検出できる構文エラーが発生しましたか?
- 修正によってリポジトリのテスト結果は変化しましたか?
さらに、多くの成功した提案を抜き取りで確認し、新たな問題を引き起こすことなくアラートを修正できていることを検証しています。 これらのチェックの 1 つ以上が失敗した場合、手動トリアージの結果、多くのケースで提案された修正はほぼ正しいものの、ユーザーが特定して手動で行える軽微な修正が必要であることがわかりました。
他のプロジェクトでの有効性
テスト セットには、さまざまな種類のプロジェクトとアラートが幅広く含まれています。 Copilot自動修正でサポートされている言語を使用する他のプロジェクトの提案も、同様のパターンに従う必要があると予測しています。
-
Copilot自動修正 は、ほとんどのアラートにコード提案を追加する可能性があります。 - 開発者が提案を評価する際、多くの修正は編集なし、またはコード全体の文脈を反映するための軽微な更新のみでコミットできると想定しています。
- 一部の提案された修正は、コードベースや脆弱性に対する重大な誤解を反映している場合があります。
ただし、各プロジェクトとコードベースは固有であるため、コミット前により多くの提案修正を編集する必要がある場合もあります。 Copilot自動修正 は、 code scanning アラートの解決に役立つ貴重な情報を提供しますが、最終的には、提案された変更を評価し、コードのセキュリティと精度を確保する責任を負います。
メモ
サポートされている言語に対する修正生成は、LLM の運用上の処理能力に依存します。 さらに、各修正候補はプル リクエストに追加される前にテストされます。 提案が利用できない場合、または提案された修正が内部テストに失敗した場合、提案は表示されません。
提案の制限
Copilot自動修正からの提案を確認するときは、変更を受け入れる前に、AI の制限を常に考慮し、必要に応じて変更を編集する必要があります。 また、Copilot自動修正のcode scanningを有効にする前に、リポジトリの CI テストと依存関係管理を更新することも検討する必要があります。 詳しくは、「[提案の制限を軽減する方法](#mitigating-the-limitations-of-suggestions)」を参照してください。
コード提案の制限
-
_自然言語の制約:_ このシステムは、主に英語のデータを前提として動作しています。具体的には、システムに送信されるプロンプト、LLM がデータセット内で参照するコード、内部評価に使用されるテスト ケースなど、すべてが英語を前提としています。 そのため、LLM により生成される提案は、他の言語や文字セットで記述されたソース コードやコメントでは有効な修正として使える確率が下がる場合があります。 -
_構文の誤り:_ システムは、構文的に正しくないコード変更を提案する場合があります。そのため、プル リクエストでは構文チェックを実行することが重要です。 -
_修正箇所の誤り:_ システムは、コード自体は構文的に正しくても、修正の適用位置を誤って提案することがあります。この場合、適用位置を確認や修正せずにそのまま受け入れると、構文エラーが発生します。 -
_意味の誤り_: システムは、構文的には有効であっても、プログラムの意味を変えてしまう修正を提案する場合があります。 このシステムは、コードがどのように動作すべきかについて、プログラマーやコードベースの意図を理解していません。 テスト カバレッジが十分であれば、修正によってコードベースの動作が変わっていないかを、開発者が確認しやすくなります。 -
_セキュリティ脆弱性に関する不適切な修正:_ システムは、根本的なセキュリティ脆弱性を解消できない修正や、新たなセキュリティ脆弱性を導入する修正を提案する場合があります。 -
_不完全な修正:_ システムは、セキュリティ脆弱性への対応や、意図したコードの機能の実現が不完全な修正を提案する場合があります。 このシステムはコードベースのごく一部しか参照できないため、常に全体として最適または正しい解決策を生成できるとは限りません。
依存関係に関する提案の制限
修正提案には、コードベースの依存関係の変更が含まれる場合があります。 依存関係管理システムを使用している場合、これらの変更は、開発者が確認できるように自動的に強調表示されます。 プル リクエストをマージする前に、依存関係の変更が安全であり、コードベースの意図した動作が維持されていることを必ず確認してください。
-
_依存関係の追加または更新:_ システムは、修正提案の一部として、ソフトウェア依存関係の追加または更新を提案する場合があります。 たとえば、JavaScript プロジェクトで、`package.json` ファイルを変更して、npm から依存関係を追加するように提案する場合があります。 -
_サポートされていないまたは安全性が不明な依存関係:_ システムは、既存の依存関係のどのバージョンがサポートされているか、またセキュリティで保護されているかを把握していません。 -
_架空の依存関係:_ システムは、より広いエコシステムで公開されている依存関係について不完全な知識しか持っていません。 その結果、攻撃者が統計的にありそうな依存関係名を使って悪意のあるソフトウェアを公開した場合、それを新たな依存関係として追加するよう提案する可能性があります。
提案の制限を軽減する方法
Copilot自動修正からの提案の制限を軽減する最善の方法は、ベスト プラクティスに従う方法です。 たとえば、プル リクエストの CI テストを使用して機能要件に影響がないことを確認し、依存関係レビュー API やアクションなどの依存関係管理ソリューションを使用してください。 詳しくは、「[AUTOTITLE](/code-security/supply-chain-security/understanding-your-software-supply-chain/about-dependency-review)」をご覧ください。
プル リクエストの作成者は、同僚や自動化ツールによって提案されたものであっても、レビュー コメントや提案されたコード変更への対応について、ご自身が最終的な責任を負うことを忘れないでください。 開発者は、コード変更に関する提案を常に批判的に検討する必要があります。 必要に応じて、提案された変更を編集し、結果として得られるコードとアプリケーションが正しく、安全であり、パフォーマンス基準を満たし、アプリケーションのすべての機能要件および非機能要件を満たしていることを確認する必要があります。
次のステップ
-
[AUTOTITLE](/code-security/code-scanning/managing-code-scanning-alerts/about-code-scanning-alerts) -
[AUTOTITLE](/code-security/code-scanning/managing-code-scanning-alerts/triaging-code-scanning-alerts-in-pull-requests#working-with-autofix-suggestions-for-alerts-on-a-pull-request) -
[AUTOTITLE](/code-security/code-scanning/managing-code-scanning-alerts/resolving-code-scanning-alerts#generating-suggested-fixes-for-code-scanning-alerts) -
[AUTOTITLE](/code-security/code-scanning/managing-code-scanning-alerts/disabling-autofix-for-code-scanning)