Secure Steady
新しいタブ経由の攻撃 - Reverse Tabnabbing の使い方・オプション・サンプル

新しいタブ経由の攻撃 - Reverse Tabnabbing

target="_blank" で開いた外部ページが window.opener を通じて元のページを書き換える攻撃。

概念図

Reverse Tabnabbing diagram

攻撃シナリオ

window.opener を使った元タブの書き換え

bash
<!-- 脆弱なリンク -->
<a href="https://external.com" target="_blank">外部サイト</a>

<!-- external.com 側の攻撃コード -->
<script>
  // 元のタブをフィッシングサイトに書き換え
  window.opener.location = "https://evil.com/fake-login";
</script>

安全な外部リンクの書き方

bash
<!-- 安全なリンク -->
<a href="https://external.com" target="_blank" rel="noopener noreferrer">外部サイト</a>

<!-- JavaScript で開く場合 -->
<script>
const w = window.open("https://external.com");
w.opener = null;  // opener 参照を切断
</script>

攻撃の仕組み

target="_blank" でリンクを開くと、新しいタブのページは window.opener を通じて元のタブの location を変更できる

攻撃の流れ:

  1. ユーザーが正規サイトの外部リンクをクリック(新しいタブで開く)
  2. 外部サイト(または攻撃者に侵害されたサイト)が window.opener.location を書き換える
  3. 元のタブが気づかないうちにフィッシングサイトに遷移する
  4. ユーザーが元のタブに戻ると、「セッションが切れました」等のメッセージが表示され、認証情報を入力してしまう

ユーザーは元のタブが正規サイトだと信じているため、フィッシングに気づきにくい。

対策

  • rel="noopener noreferrer": 外部リンクには必ず付与する。noopenerwindow.openernull にする
  • モダンブラウザの動作: Chrome 88+, Firefox 79+, Safari では target="_blank" に自動で noopener が適用される。ただし古いブラウザへの対応のため明示的な指定を推奨
  • JavaScript での対応: window.open() で開く場合は戻り値の .opener = null を設定する
  • CSP の活用: navigate-to ディレクティブ(実験段階)で遷移先を制限できる将来の対策

関連トピック