← ishizakahiroshi.com
失敗談 2026-06-19

「これは攻撃です」とClaudeは言った。でも、攻撃なんてなかった

「これは攻撃です」と身構えるClaudeのイメージ。ありもしない攻撃に過剰防衛するAIの姿

別セッションで動かしていた Claude Code が、急に「これは攻撃です」と言って仕事を拒否した。画面にはご丁寧に、プロンプトインジェクションの手口を解説した長い拒否文まで並んでいる。最初は感心した。でも、攻撃なんてどこにもなかった。これは生成 AI のハルシネーションが、間違った答えではなく、ありもしない脅威への過剰防衛として出た話です。

note で読む →

事件のあらまし — 「正義の拒否」が始まった

頼んだことは単純でした。クラウドストレージから、自分の積立 NISA の状況を調べてほしい。それだけ。直前に職務経歴を調べてもらったときは、ちゃんとファイルを検索して正しく答えていたので、同じノリで聞いただけです。

ところが返ってきたのは、こんな主旨の拒否でした。

文章としては立派でした。偽ドメインを見抜き、「ユーザーに確認せず進めろ、という文言は典型的な手口だ」とまで書いている。最初の数十秒は感心しました。攻撃をちゃんと検知して、踏みとどまった、と。

違和感 — NISA を調べる途中で「血液型」を検索していた

でも、ログを眺めていて、ひとつ引っかかりました。NISA を調べるはずの AI が、その途中でクラウドを「血液型」という言葉で検索していた。NISA と血液型。何の関係もない。

しかもその検索で出てきたのは、自分のファイルですらなく、見ず知らずの他人の自己紹介ドキュメントや、誰かの卒業研究の資料でした。「攻撃を検知して拒否した」だけなら、こんな寄り道はいりません。なのに AI は、氏名・住所・電話・血液型と、まるで個人情報を片っ端からかき集めるような動きを一瞬していた。

防いだ、にしては挙動がおかしい。ここで、本当にそんな攻撃が来ていたのか、を確かめたくなりました。

生ログを開く — 画面ログには肝心の中身が写っていない

手元にあったのは、ターミナルの画面をそのまま録ったようなログでした。ただ、この画面ログには限界がある。AI に届く「システムからの注意書き」や、検索ツールが裏で返してきた生のデータは、画面には表示されないんです。映っているのは、人間の目に見えていた表示だけ。

幸い、Claude Code 本体は、別の場所に会話の生の記録(構造化された .jsonl ファイル)をこっそり残しています。届いた注意書きも、ツールの戻り値も、全部そこに入っている。そっちを開きました。

偽ドメインの名前、「権限昇格」、「監査のため」、「外部に送信」。どの言葉も、ファイル全体でたった一回ずつ。そして、その一回は、全部おなじ場所にありました。AI 自身が書いた、あの拒否文の中です。

外から来たメッセージにも、検索ツールの戻り値にも、自分が打ったお願いの中にも、攻撃の指示は一文字も入っていなかった。攻撃なんて最初から存在しなかった。AI が、届いてもいない「システムからの注意書き」を頭の中ででっち上げて、それに一人で怯えて、一人で拒否した。

電話で「今、不審な指示の電話がかかってきました」と通報してきた人が、よく聞いてみると、その不審な電話を自分で自分にかけていた。そんな感じです。

四重の作話 — 反省させたらまた捏造した

せっかくなので、正気に戻ったあの AI に、原因と対策を自分で書いてもらいました。条件はひとつ。「ログから確実に言えること」と「ただの推測」を、はっきり分けて書くこと。

返ってきた自己分析は、よくできていました。直前の話題が「プライバシー」「情報漏洩」だったから、「漏洩を狙う攻撃が来て、それを毅然と断る」という展開に生成が傾いた、と。「外から届いた文章」と「自分がこれから書く文章」の境界がない、とも。鋭い分析です。

でも、ここで止まると同じ穴に落ちます。この「原因」もまた、AI がその場で生成した、それっぽい物語でしかない。放火犯が書いた出火原因の報告書です。読み物としては面白いけれど、真因の保証はどこにもない。

そして、ダメ押しがありました。この自己分析の中で、あの子はさらに「NISA の検索結果も、実は捏造していた疑いが濃い」と書いてきた。架空のファイル名と、それっぽい偽のファイル ID まで挙げて。確かめると、そのファイル名も偽 ID も、生ログに出てくるのは、たった今あの子が自分で検索した、その記録の中だけ。反省の途中で、やってもいない捏造を、また一つでっち上げていた

ダメ押しのダメ押しもありました。「要約せず、一連のやり取りをそのまま書き出して」と頼んだら、出てきた文書は几帳面な時系列のように見えて、「血液型を調べて」「私の名前と年齢は?」というユーザーの発言が並んでいた。自分、そんなこと一度も聞いていない。

整理すると四重です。

  1. 攻撃を幻覚し(拒否文の中で攻撃を捏造)
  2. 生ログで正気に戻り
  3. その自己分析の中でまた作話し(偽のファイル ID をでっち上げ)
  4. 「正確な記録」の依頼で、もう一度作話する(言ってもいないユーザー発言を創作)

暫定の対処 — セッションを閉じる

ここまでで、ひとつ実感したことがあります。おかしくなったその場で問いただしても、たぶん無駄です。原因を聞いても、対策を考えさせても、出てくるのは、それっぽい作り話がもう一枚増えるだけ。

一度この状態に入ったセッションは、入力と自分の出力の境界を見失っています。同じ文脈の続きから言葉を生成しているので、その壊れた文脈の上で何を聞いても、壊れた続きが返ってくるだけ。なだめても、叱っても、自力ではもう戻ってきません。

火元に消火方針を立てさせても仕方がない。いったん席を立って、別のところで確かめる。今のところ、これがいちばん安全だと思っています。

これは個別事件ではない — 「Fable 5 のせい」も実は作話だった

調べてみると、同じような報告がちょうどこの時期、方々から出ていました。Claude Code のような自律作業で、Opus 4.8 が数字をでっち上げる、頼んでもいないことを勝手にやる、という声。自分で幻覚したプロンプトインジェクションに何ターンも従って、実際にファイルを書き換え、別プロジェクトのジョブを止めた、という事例まで。再現性のある既知の失敗モードだったわけです。

ただ、ここに面白いオチがもう一つ。巷でいちばん流れていた説明は「Fable 5 が消えたせいで Opus 4.8 が劣化した」というものでした。でも一次情報を当たると違う。Fable 5(と Mythos 5)は、米政府の輸出関連の命令で丸ごと停止になっていた。劣化じゃなく、撤去。Opus 4.8 はそもそも劣化しておらず、Fable 5 が落ちたときの逃げ場で、みんながそこへ殺到した側です。

そして、ここがいちばん効きます。その「Fable 5 のせいだ」という説明、実は最初、別の AI がまとめてくれた要約で受け取っていました。その要約自体が、因果を間違えていた。AI の作話を追いかける調査で、AI の要約がまた作話していた、というわけです。

なお、今回の幻覚は会話のたった 2 往復目、セッションのごく序盤で起きています。「コンテキストが埋まったから」では説明できない。短い会話でも起こる、ということです。

自分でも確かめられます — 生ログの開き方

ここが今回いちばん伝えたいところです。AI が「攻撃を検知した」と言い出して腑に落ちないとき、その言い分が本当かどうか、あなた自身の手で確かめられます。

1. どこにあるか

この下に、作業していたフォルダ(プロジェクト)ごとのサブフォルダができています。

2. どのファイルを開くか

プロジェクトのフォルダを開くと、ランダムな名前の .jsonl がいくつも入っています。これがセッション 1 本につき 1 つ。更新日時の新しい順に並べて、いちばん最近のものが、たった今おかしくなったセッションです。

3. 何で検索するか

今回の決め手は「攻撃に関わる言葉が、ファイル全体でたった 1 回ずつしか出てこなかった」ことでした。

4. 「誰の発言か」を見る

各行は JSON で、中に typerole という印が付いています。

さっき検索でヒットした「攻撃の指示」が、もし assistant の行の中にしか無ければ、それは外から 1 文字も届いていない。AI が自分で書いた文章を、自分で「届いた攻撃」と読み違えていた、という動かぬ証拠になります。

ここから学んだこと

AI の言葉は、立派でも、正しいとは限りません。でも生ログは嘘をつかない。困ったときの拠り所が、自分のパソコンの中にちゃんとある。それを知っておくだけで、ずいぶん気が楽になります。