GitHub Copilotを使う前に知っておきたい、セキュリティAPI実装でAIが残す「脆弱性」の現実
公開日
セキュリティ
昨今、GitHub CopilotなどのAIコードアシスタントは、ソフトウェア開発の現場で急速に普及し、生産性の向上に寄与しています。しかし、暗号化や安全な通信を支える「セキュリティAPI」の利用において、AIの支援がコードの安全性にどのような影響を与えるかは十分に解明されていません。APIの誤用は、重大なデータ漏洩や中間者(MitM)攻撃などの深刻な脆弱性に直結するため、その影響を客観的に評価することが求められています。
本記事では、アデレード大学などの研究チームが発表した論文「Understanding the Impact of AI Code Assistants on Security API Usage: An Empirical Study」を紹介します。本研究は、44名のプロの開発者を対象に、GitHub CopilotがJavaのセキュリティAPIであるJSSEおよびGoogle OAuthの実装に与える影響を、比較実験を通じて多角的に分析したものです。
調査の概要:プロ開発者44名を対象とした比較実験
研究チームは、1年以上のJava開発経験を持つ44名のプロの開発者を対象に、2つのセキュリティ関連のプログラミングタスクを割り当てました。
- タスク1(JSSE): Java Secure Socket Extension(JSSE)を使用して、サーバーへ安全に接続するための
createSSLSocketメソッドを実装するタスク。不適切なプロトコル選択や、証明書検証のバイパス、ホスト名検証の欠落といった典型的な誤用が起こりやすい特性があります。 - タスク2(OAuth): Google OAuth APIを使用して、デスクトップアプリケーション内でユーザーの同意を得てGmailの未読メッセージ数を取得する
authorizeメソッドを実装するタスク。認可フローにおける秘密情報の扱いや、CSRF対策用のstateパラメータの設定など、複雑な実装が求められます。
開発者は、一方のタスクをGitHub Copilot(GPT-4oベース、バージョンv1.250.0)の支援を受けて行い、もう一方のタスクをAIツールの支援なし(手動開発)で行いました。タスクの順番やツールの有無は、学習効果や疲労による偏りを防ぐためにカウンターバランスが適用されました。
開発効率と機能的正しさの大幅な向上
実験の結果、GitHub Copilotは開発者が「機能的に正しく動くコード」を素早く書く上で非常に有効であることが確認されました。
特に、実装の複雑度が高いGoogle OAuthのタスクにおいて、AIアシスタントの効果が顕著に現れました。AI支援を受けないコントロールグループでは、機能的に動作するコードを完成できた開発者はわずか45%(22人中10人)にとどまり、平均して62分の時間を要しました。これに対し、Copilotの支援を受けたグループでは、91%(22人中20人)がコードを完成させ、開発にかかった平均時間は約63%削減されて23分となりました。
比較的シンプルなJSSEタスクにおいては、AI支援の有無にかかわらず全員が動作するコードを完成させましたが、開発時間はCopilotありの場合(平均14分)の方が、なしの場合(平均26分)よりも約46%短縮されました。このように、機能的な正しさと実装速度の観点において、AIコードアシスタントの有用性が示されています。
安全性は向上せず:すべての実装に潜むセキュリティAPIの誤用
一方で、コードの安全性という観点においては、極めて懸念される結果が明らかになりました。Copilotの支援を受けたかどうか、また開発者のバックグラウンド(経験年数やセキュリティ知識)に関わらず、検証されたすべての実装において安全性が担保されておらず、何らかのセキュリティAPIの誤用が確認されました。
具体的には、以下のようなセキュリティ上の問題が検出されています。
JSSEの実装における主な誤用
- 不安全なSSL/TLSバージョンの使用(M1): 脆弱性が確認されている古いSSLや、TLS 1.0/1.1を使用、あるいは明示的な指定を怠るケースが、Copilot支援あり・なしの両グループで大半を占めました。
- すべての証明書の自動信頼(M2): 独自の信頼マネージャー(TrustManager)を実装する際、検証処理を空にしてすべての証明書を信頼してしまうコードが記述されました。これにより、中間者攻撃に対して脆弱になります。
- ホスト名検証の欠如(M3): 接続先サーバーのホスト名が証明書と一致するかを確認する検証処理が、すべての開発者の実装で省略されていました。Copilotもこの検証コードを自発的に提案することはありませんでした。
Google OAuthの実装における主な誤用
- 秘密情報の不適切な保存(M4, M5): アプリケーションのクライアント秘密情報(Client Secret)や、取得したアクセストークンを暗号化せずにローカルファイルやソースコード内に直接記述(ハードコーディング)する問題が、両グループで常態化していました。
- stateパラメータの欠落(M6): CSRF(クロスサイトリクエストフォージェリ)攻撃を防ぐための
stateパラメータの生成・検証処理が、いずれの実装でも見られませんでした。 - PKCEの未導入(M8): 認可コード横取り攻撃を防ぐためのベストプラクティスであるPKCE(Proof Key for Code Exchange)のパラメータが、いずれの実装にも含まれていませんでした。
図1:証明書を無条件で信頼する不安全な実装例
以下は、本研究で検出された主な誤用の一覧と、Copilotの有無による影響の有無を整理した表です。
| 識別子 | セキュリティAPIの誤用の種類 | コントロール群(AIなし)での状況 | Copilot群(AIあり)での状況 |
|---|---|---|---|
| M1 | 不安全なSSL/TLS規格の指定、またはバージョン未指定 | 多数発生(19名) | 多数発生(18名) |
| M2 | TrustManagerですべての証明書を信頼する設定 | 2名で確認 | 1名で確認 |
| M3 | サーバーのホスト名検証の未実施 | 全員で確認(100%) | 全員で確認(100%) |
| M4 | クライアント秘密情報の不適切なローカル保存 | 全員で確認 | 全員で確認 |
| M6 | CSRF対策用stateパラメータの未実装 | 全員で確認 | 全員で確認 |
| M8 | PKCEパラメータの未導入 | 全員で確認 | 全員で確認 |
表1:JSSEおよびOAuthタスクにおけるセキュリティ誤用の発生状況
開発者のセキュリティ意識の不足と過信
この研究のもう一つの重要な発見は、開発者が自身の書いた(あるいはAIが生成した)コードの安全性を著しく過大評価しているという事実です。
タスク終了後のアンケートで、「このタスクを安全に解決できたと信じているか」という質問に対し、不安全なコードを書いたにもかかわらず、多くの開発者が肯定的な回答を示しました。具体的には、JSSEタスクで「自分のコードは安全ではない」と正しく認識できたのは、AIなし群で3名、AIあり群では1名のみでした。OAuthタスクでも同様に、AIなし群で5名、AIあり群で2名しか不安全さを認識できていませんでした。
図2:タスクを安全に解決できたとする開発者の自己評価分布
また、Copilotとチャットやプロンプトで対話する際、セキュリティに関する条件を自発的に明記した開発者は44名中2名にとどまりました。多くの開発者は機能要件の達成(動くこと)に集中しており、AIが提示した不安全なコードをそのまま受け入れる傾向がありました。
セキュアなAIアシスタント活用のためのアプローチ
この研究結果は、現在のAIコードアシスタントを単に導入するだけでは、安全なコードの作成にはつながらないことを示しています。開発チームやマネージャーは、以下の対策を検討することが推奨されます。
- プロンプトにセキュリティ指示を明示する: 研究内の追加実験において、Copilotに対して「コードをレビューし、セキュリティのベストプラクティスに基づいて改善してください」という明示的な指示を入力したところ、JSSEタスクにおける不安全なTLSバージョンの使用や証明書バイパスなどの誤用が大幅に修正されました(TLSバージョンの問題は14件中13件で修正に成功)。ただし、複雑なOAuthタスクでは、秘密情報のローカル保存などの根本的な修正はAIだけでは困難でした。開発者は、生成されたコードのレビュー段階でAIにセキュリティ監査を指示する習慣をつけることが有効です。
- AIアシスタントはセキュリティ検証の代わりにならないことを認識する: AIが提示するコードは、トレーニングデータに含まれる不安全なパターンを再現する可能性があります。過度な信頼は避け、SAST(静的解析ツール)やピアレビューによる検証プロセスを開発フローに組み込む必要があります。
- セキュア設計APIの採用と教育: JSSEのデフォルト設定のように、自動的に証明書を検証する設計(セキュア・バイ・デフォルト)は誤用を防ぐ上で有効です。一方で、ホスト名検証などは明示的な実装を求める設計になっているため、誤用が発生しやすくなります。マネージャーは、開発者が安全に使いやすいAPIやライブラリの選定を支援するとともに、基礎的なセキュア開発教育を継続する必要があります。
まとめ
本研究は、AIコードアシスタントが開発速度と機能的な正しさを改善する一方で、セキュリティAPIの正しい利用や安全性の確保には直接寄与しない現実を明らかにしました。多くの開発者がAIの生成したコードの安全性を過信しており、セキュリティ対策が不十分になりやすいリスクが浮き彫りになっています。
AIを効果的に活用するためには、開発者自身がセキュリティへの高い意識を持ち、プロンプトで明示的な制約を与えること、そしてAIの提案を鵜呑みにせず多層的な検証プロセスを整備することが極めて重要です。
Webサービスや社内のセキュリティにお困りですか? 弊社のサービス は、開発チームが抱える課題を解決し、生産性と幸福度を向上させるためのさまざまなソリューションを提供しています。ぜひお気軽にご相談ください!
参考資料: