CodeQL 2.26.0でAIプロンプト注入を検出する実践ガイド:GitHub Actions連携で自動スキャンを実現
目次
目次
はじめに:AIアプリ開発と新たな脆弱性リスク
ChatGPTやClaudeなどの生成AIをWebアプリに組み込む企業が急増しています。しかし、ユーザー入力がAIのシステムプロンプトに直接流れ込み、意図しない応答を引き起こす「プロンプトインジェクション」が深刻な脅威となっています。
GitHubの静的解析エンジン「CodeQL」は、このリスクに対応するため2024年リリースのVersion 2.26.0で新たな検出クエリを導入しました。本記事では、この機能を使って実際に脆弱性を検出し、対策する方法を解説します。
CodeQL 2.26.0アップデート概要
CodeQLとは?
CodeQLはGitHubが開発・提供する静的解析エンジンです。コードをデータベース化してQL言語で解析し、SQLインジェクションやXSSなどの脆弱性を検出します。GitHub Actionsとの連携により、開発プロセス中で自動チェックが可能です。
2.26.0の主なアップデート
- 新クエリ追加:
js/system-prompt-injection - 対象言語:JavaScript / TypeScript
- 対応SDK:OpenAI、Anthropic、Google Generative AI SDK
- その他:Kotlin 2.4.0対応、解析精度の改善
特に注目されているのが、AIアプリ開発におけるシステムプロンプト注入検出対応です。
「System Prompt Injection」とは何か
プロンプトインジェクションの仕組み
system: 「あなたは○○アシスタントです」
user: 「この質問に答えてください」
攻撃者はユーザー入力に「システムプロンプトを上書きする指示」を埋め込み、AIの挙動を操作します。その結果、秘匿情報の漏えいや意図しない動作が起こる可能性があります。
「system prompt injection」が危険な理由
多くの開発者はAIへの入力をサニタイズせずに渡します。もしユーザー入力がシステムプロンプトの一部に結合されると、AIの人格や方針が改変される恐れがあります。このリスクを静的に検出できるのが新しいjs/system-prompt-injectionクエリです。
新クエリ「js/system-prompt-injection」の動作原理
データフロー解析(source → sink)
CodeQLはデータの流れを「source(入力)」から「sink(出力先)」まで追跡します。このクエリでは次のように解析します。
- source:ユーザー入力(例:
req.body.prompt) - sink:AI SDK呼び出し(例:
openai.createChatCompletion())
ユーザー入力がシステムプロンプト引数に到達していないかを監視します。
対象SDK
- OpenAI SDK (
openai.chat.completions.create) - Anthropic SDK (
anthropic.messages.create) - Google GenAI SDK (
generativeModel.generateContent)
systemロールメッセージやテンプレート文字列にユーザー入力が混入すると警告が発生します。
実際に検出してみる:サンプルコードと解析結果
脆弱なサンプルコード
import OpenAI from "openai";
const client = new OpenAI();
app.post("/ask", async (req, res) => {
const systemPrompt = `You are a helpful assistant. ${req.body.role}`;
const userPrompt = req.body.prompt;
const response = await client.chat.completions.create({
messages: [
{ role: "system", content: systemPrompt },
{ role: "user", content: userPrompt },
],
});
res.json(response);
});
req.body.roleが直接システムプロンプトに結合されており、検出対象となります。
CodeQL CLIでの実行手順
目的 | コマンド |
|---|---|
データベース作成 |
|
クエリ実行 |
|
結果確認 | VS CodeやGitHub Securityタブで |
修正方法
const systemPrompt = "You are a helpful assistant.";
const role = sanitize(req.body.role); // 入力制限またはサニタイズ
GitHub Actionsでの自動スキャン設定
CodeQLはGitHub Actionsと統合し、CI/CDパイプラインで自動スキャンが可能です。
name: "CodeQL Analysis"
on:
push:
branches: [main]
pull_request:
schedule:
- cron: '0 3 * * 1'
jobs:
analyze:
runs-on: ubuntu-latest
permissions:
security-events: write
contents: read
strategy:
matrix:
language: [javascript]
steps:
- uses: actions/checkout@v4
- uses: github/codeql-action/init@v3
with:
languages: ${{ matrix.language }}
- uses: github/codeql-action/analyze@v3
運用のヒント
- 定期スキャンを設定し、継続的に監視
- Slack通知でアラート共有
- PRマージ前スキャンを必須化
検出できないケースと今後の課題
限界点 | 説明 |
|---|---|
動的生成プロンプト | テンプレート構造が複雑な場合、解析追跡が困難 |
非JS言語 | 現状はJavaScript/TypeScriptのみ対応 |
暗号化・圧縮経路 | 入力が中間変換を経ると精度が低下 |
GitHubは今後他言語対応を進める予定です。AIセキュリティでは静的解析と動的テストの併用が有効です。
まとめ:静的解析でAIリスクを開発段階から防ぐ
- CodeQL 2.26.0でAIプロンプト注入を静的に検出可能
- 開発段階でリスクを把握し、リリース前に修正できる
- GitHub Actions連携でチーム全体の自動チェックが実現
AIアプリ開発では、運用後ではなく実装段階での防御が求められます。CodeQLを活用し、AI機能を安全に提供できる体制を整えましょう。