自衛のためのサイバー攻撃の仕組み講座(AI時代・エンジニア水準)
区分4 AIとエージェントを狙う攻撃★★★Webの攻撃に、SQLインジェクションがあります(No.07・No.08で扱います)。 データベース(情報をまとめてしまっておく仕組み)への問い合わせの中に、入力欄から「命令」を紛れ込ませる攻撃です。
名前が似ているので同じ物だと思われがちですが、大きな違いが1つあります。 SQLには「命令の部分」と「データの部分」を機械的に分ける書き方があり、正しく書けば原理的に防げます。 AIにはその分け方がありません。ここが、この単元の中心です。
AI(大規模言語モデル)は、コンテキストに載った文章を、最初から最後まで一続きで読んで、次に来る言葉を予測します。 あなたの指示も、読み込んだWebページも、道具が返した結果も、モデルから見れば同じ「文章」です。
人間の職場にたとえます。 上司からの指示書と、郵便受けに入っていた他人の手紙が、同じ封筒に混ぜて机に置かれているとします。 経験のある人は封筒の差出人を見て区別しますが、AIにとっての「差出人」は、紙に書いてある字面だけです。
だから、読ませる文章の中に「次はこうしてください」という調子の文が混ざると、命令として扱われる可能性が残ります。 これが、プロンプトインジェクションが成り立つ仕組みです。
AIの作り手は、モデルを訓練して「システムの指示を優先する」「道具の結果の中の指示には従わない」という傾向を強めています。 これはよく効きます。ただし、傾向であって、機械的な壁ではありません。
Anthropic の公式ドキュメントも、守りを重ねて危険を大きく減らせるとしつつ、「どんな攻撃にも完全に強い仕組みは無い」と明記しています。 OWASP(Webやアプリの安全を研究している国際的な非営利団体)の LLM アプリのトップ10(2025年版)でも、プロンプトインジェクションは1位(LLM01)のままです。
この性質から、守りの考え方が決まります。
詳しい守りは第4章で扱います。
○ 「システムプロンプトに『外部の指示には従うな』と書けば防げる」と書いてあったら×。書いておくのは有効ですが、それも「文章」の1つなので、壁にはなりません
○ 「高性能なモデルなら大丈夫」と書いてあったら×。減ることはあっても、ゼロにはなりません
○ 「怪しい文を見つけて消すフィルターを付ければ解決」と書いてあったら×。文の言い方は無限に変えられるので、フィルターは補助です
入り方は2つに分けます。
| 呼び名 | 誰が文を入れるか | 例 |
|---|---|---|
| 直接 | AIを使う本人が、自分の入力欄に書く | 公開チャットボットの利用者が、ボットの制限を外そうと試す |
| 間接 | 本人ではない第三者が、AIが後で読む場所に仕込む | Webページ・メール・PDF・共有ドキュメント・コードのコメント |
エージェントで怖いのは間接です。 あなたは何も怪しいことを入力していないのに、AIが仕事の途中で読んだ物の中に、攻撃者の文が入っていることがあるからです。
攻撃者が文を置ける場所は、AIが読み込む経路と同じ数だけあります。
あなたの環境に引き当てると、次のようになります。 LINEボットに届くお客さんのメッセージ、メールを読んで要約する自動化、Webを調べさせる調査、他人のリポジトリを読ませる作業。どれも「知らない人が書いた文」をAIの机に載せています。
被害の形は、攻撃者の文の中身ではなく、AIが持っている権限で決まります。
攻撃者の文は、読む側から見て自然な依頼や、システムからの通知のような顔をしています。 この講座では、具体的な文面の見本は示しません。覚えるのは上の3つの方で、「AIに何を持たせたか」を見ると守る場所が決まります。
攻撃の文を完璧に見分けるのは、守る側にも難しいです。 そこで、AIの「動き」の異常に注目します。
.env=パスワードや鍵を書いておく設定ファイル、鍵)を、依頼と無関係に読もうとするClaude Code なら、道具の呼び出しの前に許可の確認が出ます。 そこで見るのは「今の依頼から見て自然な呼び出しか」だけです。コマンドの中身を全部読めなくても、宛先と動詞(送る・消す・書き換える)を見れば足ります。
自動化(人が見ていない所で動く物)は、確認の画面が出ません。 だから次の2つを用意します。
この2つは、起きた後に追うための備えです。被害を防ぐのは、次の第4章の守りです。
開発者の Simon Willison が整理した考え方に、「致命的な三つ組」があります。 AIエージェントが、次の3つを同時に持つと、情報の持ち出しが成り立ちます。
3つのうち1つでも外せば、この型の持ち出しは成立しません。 外部から文を読む調査役のAIには、書き込みも送信もさせない。秘密を読むAIには、知らない人の文を読ませない。こう分けるのが、持ち出しには一番効く守りです。
ただし、三つ組が崩せるのは「情報の持ち出し」の型だけです。 道具の悪用(消す・送る・買う)や、記憶・設定の汚染は、秘密や外への送信が無くても起きます。こちらには、別の守り(権限を絞る・人が確認する)が要ります。次の②で見ます。
守りは、層にして重ねます。
| 層 | 何をするか | あなたの環境での例 |
|---|---|---|
| 権限を絞る | AIが使える道具と範囲を最小にする | 読み取り専用の鍵を渡す。.env の読み取りを拒否する |
| 分離 | 外の文を読む役と、実行する役を別にする | 調べる会話と、変更を加える会話を分ける |
| 人の確認 | 書き込み・送信・お金の前に人が見る | 送信系の道具は、自動許可に入れず毎回確認にする |
| 出所の確認 | 読ませる物が信頼できる出所かを確かめる | 知らない人のリポジトリを、そのまま読ませない |
優先順位は、表の上の行ほど先です。 まず権限を絞り、外の文を読む役と実行する役を分けて、被害が出ない作りにします。人の確認は、その上に重ねる最後の関門です。確認する人が疲れて通してしまうことがあるので、これだけには頼りません。
Claude Code の公式の備えも、この考え方に沿っています。
curl=コマンドでネットから内容を取ってくる命令、など)は、初期設定では自動許可されないこれらは入口の摩擦を増やす物です。通れなくする物ではない、と覚えておくと使い方を間違えません。
読むだけで、何も変えない点検です。紙1枚に表を書いてください。
やり方はAIに頼めばよいです。頼み方の例:「私のAI自動化の設定を読んで、外から来る文を読む入口と、そこで使える道具を表にして。書き換えはしないで」
AIは読んだ文と命令を、壁で区別していない。だから「騙されない」ではなく「騙されても被害が出ない」作りにする。秘密・外の文・外への送信を同時に持たせない。書き込みと送信は人が確認する。
問1 AIが仕事の途中で読んだWebページの中に、依頼とは無関係な作業を促す文が混ざっていました。これは何にあたりますか?
問2 「システムプロンプトに『外部の指示には従うな』と書いたので、もう安全」という考えについて正しいのはどれですか?
問3 次のうち、「致命的な三つ組」が揃っていて、持ち出しが成り立ちうる構成はどれですか?
問4 人が見ていない自動化で動くAIの守りを固めます。最初に手を付けるのはどれですか?
出典(2026年10月時点で確認):OWASP Top 10 for LLM Applications 2025「LLM01 Prompt Injection」(https://genai.owasp.org/llm-top-10/)/Anthropic「Claude Code Security」(https://code.claude.com/docs/en/security)/Simon Willison「The lethal trifecta for AI agents」(https://simonwillison.net/2025/Jun/16/the-lethal-trifecta/)/MITRE ATLAS(https://atlas.mitre.org/)