CodeQL 2.26.0でAIプロンプト注入を検出する実践ガイド:GitHub Actions連携で自動スキャンを実現

DX・デジタル活用

2026.07.21

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での実行手順

目的

コマンド

データベース作成

codeql database create db --language=javascript --source-root=.

クエリ実行

codeql database analyze db codeql/javascript-queries:security-and-quality.qls --format=sarifv2.1.0 --output=results.sarif

結果確認

VS CodeやGitHub Securityタブでresults.sarifを開く

修正方法


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機能を安全に提供できる体制を整えましょう。

Contact Us

お問い合わせ

お気軽にお問い合わせください

ご相談・お見積もり