【注意喚起】AIに取得させたURLを無検証で開いてはいけない — vercel.appで詐欺サイトが表示された実体験
何が起きたか
Claude Code(AIコーディングアシスタント)にVercelのプレビューデプロイURLを取得させ、そのままブラウザで開いたところ、偽のウイルス警告と大音量の警告音が鳴るテクニカルサポート詐欺サイトが表示されました。
確認できた事実
- Claude CodeにVercelでホストするNext.jsアプリのPR作成を依頼
- Vercelが自動でプレビューデプロイを生成し、PRコメントにURLが投稿された
- Claude Codeに「プレビューURLを教えて」と依頼
- Claude Codeが
gh pr view --json commentsでPRコメントからURLを抽出して提示 - URLの到達先やコンテンツを確認せずに、そのままブラウザで開いた
- テクニカルサポート詐欺サイトが表示された
確認できていないこと
- 提示されたURLがbranch URL(最新を指し続ける)かcommit-specific URL(特定コミットに紐づく)かは記録しておらず不明
- 詐欺サイトがそのURL自体から配信されていたのか、リダイレクトだったのかも不明
- 発生時のブラウザ拡張機能の状態、シークレットモードだったかも未確認
- Vercelプロジェクト側のDeployment Protectionの有効/無効状態も未確認
想定される原因
詐欺サイトが表示された原因として、以下の可能性があります。いずれも確定ではありません。
可能性1: 古い/無関係なvercel.app URLの誤取得
PRコメントには複数のURLが投稿されます。Claude Codeの grep による抽出では最新かどうかの判定ができず、古いcommit-specific URLや、意図していたものとは異なるvercel.app URLを拾ってきた可能性があります。
可能性2: *.vercel.appドメイン上の悪性コンテンツ
2025年11月〜2026年1月には、攻撃者がVercelに悪意あるサイトを自らデプロイし、*.vercel.appの信頼性を悪用するフィッシングキャンペーンが確認されています。PRコメントにbot等が別のvercel.appリンクを投稿していた場合、grepが意図しないURLを拾った可能性があります。
可能性3: Subdomain Takeover
非アクティブなサブドメインを第三者が取得する攻撃手法です。過去に報告事例がありますが、Vercel側はパッチ済みとしており、プレビューURLにはteam/accountスコープが含まれるため、別アカウントが同一hostnameを再取得できるかは不明です。現在のVercelの仕様で再現可能かどうかは確認できていません。
可能性4: ブラウザ側の要因
ブラウザ拡張機能による悪意あるリダイレクト、DNS汚染、別タブで開いていた詐欺サイトのポップアップなど、Vercelとは無関係の原因の可能性もあります。
本当の問題は「URL取得フロー」だった
原因が上記のどれであっても、防げたポイントは同じです。
AI → PRコメント → grepでURL抽出 → 無検証でブラウザ起動
このURLサプライチェーンの各段階に、検証が一切ありませんでした。
どの時点で防げたか
| 段階 | 何が起きたか | 防げたか |
|---|---|---|
| URL取得 | PRコメント全文からgrepで抽出 | Vercel CLIで最新デプロイURLを正規取得すべきだった |
| URL検証 | ホスト名が自分のプロジェクトか未確認 | team/project名との照合で弾けた |
| 到達先確認 | curlでの事前確認なし | リダイレクト先の確認で異常に気づけた可能性 |
| ブラウザで開く | 本番ブラウザでそのまま開いた | 隔離プロファイルやヘッドレスブラウザで確認すべきだった |
この問題はVercel固有ではありません。 GitHub Pages、Netlify、Cloudflare Pagesなど、プレビューURLを発行するあらゆるホスティングで同様のリスクがあります。また、AIに限った話でもなく、PRコメントからURLを手動でコピペして開く場合も同じリスクがあります。
Claude Codeの何が問題だったか
Claude Codeは以下のコマンドでURLを取得しました:
gh pr view 2 --json comments --jq '.comments[].body' | grep -o 'https://[^ ]*vercel.app'
この方法の問題:
- PRコメントに投稿されたすべてのvercel.app URLが返される(古いもの、無関係なものを含む)
- 返されたURLが自分のプロジェクトの最新デプロイかを照合していない
- URLの到達先を確認していない
AIアシスタントはコマンドの実行結果をそのまま返します。「このURLは安全か」という判断はしません。これはClaude Codeに限らず、すべてのAIコーディングアシスタントに共通するリスクです。
そして、人間側(筆者)も、AIが出したURLを検証せずに開いてしまいました。 AIのせいだけではありません。
遭遇した詐欺サイトの特徴
典型的なテクニカルサポート詐欺でした:
- ブラウザが全画面表示になる
- 「ウイルスに感染しました」という偽の警告
- 大音量の警告音
- 「今すぐこの番号に電話してください」と表示
- ページを閉じにくい仕組み
遭遇した場合の対処法
- タスクマネージャー(Ctrl+Shift+Esc)でブラウザを強制終了
- 表示された電話番号には絶対に電話しない
- 何もダウンロード・インストールしない
- ブラウザのキャッシュ・Cookieを削除(不安ならブラウザを再インストール)
- 不安が残る場合はウイルススキャンを実行
通常、この種の詐欺サイトは閲覧だけで直ちに被害が発生することは少ないですが、電話・ソフトインストール・遠隔操作の許可で被害が拡大します。
参考: Microsoft テクニカル サポート詐欺から身を守る
再発防止策
1. 正規API/CLIから最新デプロイURLを取得する
# ❌ PRコメントからgrepで抽出
gh pr view 2 --json comments | grep vercel.app
# ✅ Vercel CLIで最新デプロイを確認
npx vercel ls --scope my-team
# ✅ または、PRコメントのbranch URL(Visit Preview)を使う
# branch URLは同じブランチへのpushで最新を指し続ける
2. ホスト名が自分のプロジェクトか検証する
取得したURLのホスト名に、自分のチーム名・プロジェクト名が含まれているか確認する。
3. 到達先を事前確認する
# レスポンスコードと最終到達URLを確認
# ※到達性の確認であり、コンテンツの安全性(詐欺かどうか)は判断できない
curl -sL -o /dev/null -w "%{http_code} %{url_effective}\n" https://xxx.vercel.app
curlで分かるのは「どこに到達するか」まで。200が返ってもコンテンツが安全かは分からない。JSでリダイレクトする詐欺サイトには無力です。あくまで最低限の確認手段として位置づけてください。
4. 可能ならDeployment Protectionを有効化する
プレビューデプロイに認証を要求し、第三者のアクセスを防止できます。ただし、開発者自身はVercelアカウントで認証を通過できるため、今回のインシデントの直接的な防止策にはならない可能性があります。
公式ドキュメント: Deployment Protection
5. インシデント発生時は証拠を保存する
スクリーンショット、URLのコピー、HTTPヘッダ、ブラウザの開発者ツールのネットワークログ。これらがないと原因特定ができません(今回の反省点です)。
AIコーディングアシスタント利用時の教訓
- AIが提示するURLを無条件に信用しない — AIはURLの安全性を検証しない
- URL取得は正規APIから — PRコメントのgrepではなく、Vercel CLI等を使う
- 取得したURLのホスト名を目視確認 — 自分のプロジェクトか?
- ブラウザで開く前に到達先を確認 — curl等で最低限のチェック
- AIの出力を「検証済みの安全な情報」と思わない — 人間側の検証責任がある
まとめ
| 項目 | 内容 |
|---|---|
| 事象 | AIが取得した vercel.app URLを開いたところ詐欺サイトが表示された |
| 直接原因 | PRコメント由来のURLを十分に検証せず提示・閲覧した |
| 根本問題 | URL取得フローに真正性確認がなく、AIの出力を人間が検証しなかった |
| 原因候補 | 古いURL誤取得、悪性*.vercel.app、Subdomain Takeover、ブラウザ側要因など(未確定) |
| 対象読者 | AIにURL取得を任せる開発者、PRコメントからURLを抽出して開く運用をしている人 |
| 主な対策 | 正規API/CLIから取得、ホスト名検証、到達先確認、隔離環境で確認、証拠保存の習慣化 |
「AIが教えてくれたURLだから安全」— これが最も危険な思い込みでした。
今回の教訓は単純です。AIが取得したURLは、そのまま開いてはいけない。
Discussion