AI ボットを名乗るリクエストは送信元で検証する(.env を探す「AI Bot Cosplay」)
GPTBot や ClaudeBot を名乗るアクセスでも、User-Agent は自己申告にすぎない。「AI ボットの名前を名乗っているのに送信元の検証に通らない」リクエストが .env などの非公開ファイルを取りに来たら、正当な用途はないのでまとめて止めてよい。
何が起きているか(Fastly の観測)
- 2026-09-23 の 1 日だけで、AI ボットを名乗る約 630 万件のリクエストが約 10,200 の IP から
.env、Git のメタデータ、認証情報などの非公開ファイルを探していた。 - 94% は約 1,600 の IP からで、ほぼすべてが 1 つのパブリッククラウド上。12 種類の AI ボット名(OpenAI・Anthropic・Perplexity・DuckDuckGo・Common Crawl など)を均等に使い回し、96 個のファイル名のリストを 10 万以上のサイトに撒いていた。
- 最も狙われたのは
/.envで、/../../../../.envのようなトラバーサル形や、Vite 開発サーバーのファイル経路を狙う/@fs/.envも混ざっていた。 - AI ボットの名前を借りるのは、AI ボットを許可リストに入れたりレート制限を緩めたりしているサイトがあるため。
やること
- User-Agent だけで AI ボットを優遇しない: 許可リストやレート制限の緩和は、ベンダーが公開している IP 範囲や逆引き検証など「送信元の確認」に通ったものだけに適用する。
- 「名乗っているが未検証」×「非公開ファイルのパス」で止める: User-Agent に
GPTBot・ClaudeBot・PerplexityBot・Perplexity-Userなどの名前を含み、検証済みボットではなく、パスが.env・.git/などに当たるリクエストはブロックする。名乗っている名前そのものは攻撃者が変えにくいので、IP や細かい UA 文字列を変えられても効き続ける。 - Cloudflare の場合: 検証済みボットかどうかはカスタムルールの
cf.client.bot(既知のボット)フィールドで判定できる。例として次のような式が考えられる(使えるフィールドはプランで異なるので、ダッシュボードの式ビルダーで確認する)。(http.user_agent contains "GPTBot" or http.user_agent contains "ClaudeBot" or http.user_agent contains "PerplexityBot") and not cf.client.bot and (http.request.uri.path contains "/.env" or http.request.uri.path contains "/.git")探索系パス全般の塞ぎ方は Cloudflare 無料プランで「探索系スキャン」を塞ぐ(ブロックログ起点のカスタムルール) を参照。
- そもそも置かない: 公開ディレクトリに
.envや.gitが出ていないかを確認する(.gitignore に入れたはずの .env が漏れていないか 5 か所で点検する、開発サーバーを LAN に晒さない(Storybook GHSA-px85-f4q5-jh77 から学ぶ))。
注意点
- 本物の AI ボットの大半は名乗りどおりで、検証にも通る。AI ボット全体を止めたいわけでなければ、検証結果とパスを組み合わせて偽物だけを狙う。
- ブロック前に巻き添えがないかは WAF で送信元を止める前に「巻き添え」を確かめる(IP / ASN / JA4 の使い分け) の手順で確認する。
出典
- @matsuu · 2026-10-18
- Fastly「AI Bot Cosplay」(2026-10-13、@matsuu の投稿からのリンク先): htn.to/P4cy8Ntpwb