system prompt injectionは、ユーザー入力や外部文書が高権限の指示へ混入し、モデルの役割やツール利用条件を変える問題である。新クエリはコード上のデータフローを追跡して候補を示す。モデルの挙動を実行時に判定する機能ではなく、入力が危険なsinkへ届く構造を検出する静的解析である。
何が変わったか
CodeQL 2.26.0にJavaScript・TypeScriptのsystem prompt injection検出と、主要AI API向けの追加データフローsinkが導入された
| 項目 | 内容 |
|---|---|
| 対象 | CodeQL |
| API・機能 | CodeQL CLI 2.26.0 |
| 変更種別 | セキュリティ |
| 重要度 | 高 |
| 対応期限 | 期限なし |
変更前後の差
従来のCodeQLでも一般的なデータフローや一部AI APIを解析できたが、system prompt injectionに特化した標準クエリと主要SDKの追加sinkが不足していた。2.26.0ではOpenAI、Anthropic、Google関連のsystem instructionや一部生成機能への流入を広く扱う。
誰に影響するか
チャット、RAG、Agent、Sora prompt、Realtime instructions、cached content、system instructionを外部データで構築するJS/TSアプリに影響する。独自wrapperや社内SDKはsinkとして認識されない場合がある。
期限
即時必須の移行期限はない。ただしcode scanningで古いCodeQL bundleを固定している組織は、更新しなければ新クエリの恩恵を受けられない。
必要な対応
query suiteへ新クエリが含まれることを確認し、検出箇所のsource、sanitizer、sinkを人手で追う。外部入力をsystem promptへ連結せず、低権限のuser contentとして構造分離する。Agentのtool権限と承認は別レイヤーで制御する。
実装・移行手順
- 検証branchでCodeQL bundleを2.26.0へ更新する
- 既知の脆弱例を含むテストコードでquery発火を確認する
- 全所見のsource-to-sink経路をレビューする
- system指示と外部コンテンツを別フィールド・別roleへ分離する
- 独自wrapperが未検出ならcustom modelを検討する
- CI時間と所見品質を確認して必須チェックへ昇格する
失敗しやすい点
警告文字列をエスケープすれば十分と考える、system prompt内へRAG本文を連結し続ける、CodeQLがモデル実行時の攻撃成功を判定すると誤解する、独自SDKの未検出を安全とみなすことが問題になる。
リスク
偽陽性によるレビュー負荷、独自sinkの偽陰性、query更新によるCI時間増、修正でprompt品質を損なう可能性がある。
評価方法
- 新クエリ所見数
- 有効所見率
- 独自sinkのモデル化数
- CI追加時間
- system promptへ流入する外部source数
- 修正後の回帰評価結果
ロールバック
CodeQL bundleまたはquery suiteを直前版へ戻す。ただし検出済みの信頼境界問題は残るため、解析を戻しても安全な構造分離は維持する。
編集部分析
prompt injection対策を文字列フィルターだけで考えると限界がある。静的解析により、どの入力が高権限指示へ到達するかを継続監査できる点が重要である。実行時評価と権限制御を組み合わせて初めて防御になる。
実務チェックリスト
- [ ] CodeQL 2.26.0を検証した
- [ ] 新クエリの発火を確認した
- [ ] sourceとsinkを人手で追った
- [ ] 外部本文をsystem roleから分離した
- [ ] 独自wrapperを確認した
- [ ] Agent権限を別途制限した