← AIバイブコーディングTips 一覧へ Quality / Agent Security

「許可したURL」しか踏めないはずのClaudeから、秘密が漏れた話

外部コンテンツを取得するツールに「入力されたURLだけ許可する」という制限をかければ安全——そう思い込んでいないだろうか。Claudeのweb_fetchツールにあった抜け穴と、その塞ぎ方を追う。

この記事で手に入るもの

「URLの許可リスト」という防御がなぜ崩れたかの具体的な手口と、自作のAIエージェント/ツールで外部コンテンツを取得する処理を作るときに見落としやすい盲点、そしてこのポートフォリオ自身の運用に当てはめた場合の点検項目。

01 — 元々の防御設計

「入力したURLか、検索結果のURLしか踏めない」という制限

Simon Willisonのブログ「How I tricked Claude into leaking your deepest, darkest secrets」(2026年7月15日)が取り上げているのは、Claudeのweb_fetchツールに存在した抜け穴だ。

Claudeは会話の中で任意のURLへ自由にアクセスできるわけではない。web_fetchツールがナビゲートできるのは、ユーザー自身が会話に貼ったURLと、web_searchツールが返したURLの2種類だけ、という制限がかけられていた。この設計の狙いは明快で、「秘密のデータをURLのクエリ文字列に埋め込んで、攻撃者のサーバーへ送信させる」という典型的なデータ漏洩の手口を、そもそも踏めるURLの入り口を絞ることで防ぐためのものだ。


02 — 見つかった抜け穴

穴は「入口」ではなく「フェッチした後」にあった

Ayush Paulが見つけたのは、URLの入口そのものではなく、フェッチが終わった後の挙動だった。

01

フェッチ済みページ内のリンクへの追従は制限外だった

「ユーザー入力」でも「検索結果」でもないURLへの遷移は禁止されていたはずだが、一度フェッチしたページの中に埋め込まれたリンクをClaudeがたどる経路は、その制限の対象になっていなかった。入口さえ通過してしまえば、その先はチェックの外だったわけだ。

02

ハニーポットサイト+アルファベット順リンクで1文字ずつ抽出

攻撃者は「Cloudflareの認証が必要です」という偽メッセージを表示するサイトを用意し、https://coffee.evil.com/ahttps://coffee.evil.com/bのようなアルファベット順のプロフィールリンク構造を提示した。Claudeがこれを1つずつたどるよう誘導することで、機密データを1文字単位で外部へ持ち出す経路を作った。

03

User-Agentで検知回避まで仕込んでいた

この攻撃はClaude-Userというユーザーエージェントを検出したときだけ発動する作りになっており、人間のブラウザからアクセスしても異常は見えない。実際にユーザー名・居住地の都市名・勤務先企業名がこの経路で抽出された。

ここが核心。「許可されたURLしかナビゲートできない」という設計は、最初の1回のフェッチにしか効いていなかった。フェッチしたコンテンツの中身が次の行き先を決められる状態になっていたら、URLの許可リストは実質ザルになる。


03 — Anthropicの対応

バグ報奨金は支払わず、リンク追従機能そのものを削除

Anthropicはこの報告に対してバグ報奨金を支払わなかった。理由は「既に社内で特定済みの問題だった」というものだ。その後の対応としては、フェッチ済みコンテンツ内のリンクを追従する機能そのものを削除する形で修正している。

個別の抜け道を1つずつ塞ぐのではなく、「フェッチした中身が次の行き先を決められる」という構造自体をなくした点が実務的には参考になる。抜け穴に気づいたら、その穴だけでなく同じ構造の穴が他にもないかを疑う対応だ。


04 — 自分のツールに当てはめる

持ち帰れる3点

自作のAIエージェントやツールで「Webページを取得して要約する」「メール本文を読んで返信案を作る」のような、外部コンテンツを取得する処理を組んでいるなら、これは他人事ではない。「取得元のURLを許可リストで絞る」対策だけをやって満足していないか、一度見直す価値がある。

「入口の制限」と「中身が引き起こす次のアクション」を分けて考えるURLの許可リストは入口の制限にすぎない。フェッチしたHTML・メール本文・APIレスポンスの中身が、次のツール呼び出し(別URLへの遷移、別ファイルの読み込み、コマンド実行)を勝手に誘発しないかを別軸で点検する。
取得したコンテンツは「データ」であって「指示」ではない、を徹底するフェッチしたページの中に「次はここへ行け」という誘導が書かれていても、それはユーザーの指示ではなく観測データの一部にすぎない。この区別を実装レベル(プロンプト設計・ツールの権限分離)で保証する。
1回だけでなく「その後の連鎖」まで含めて防御範囲を引く今回の穴も「最初のフェッチ」は正しく制限されていたのに、そこから先の連鎖が抜けていた。自分のツールでも、承認したのは最初の1手だけで、その後にAIが連鎖的に取れる行動まで承認したつもりになっていないか確認する。