新しいタブ経由の攻撃 - Reverse Tabnabbing
target="_blank" で開いた外部ページが window.opener を通じて元のページを書き換える攻撃。
概念図
攻撃シナリオ
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 を変更できる。
攻撃の流れ:
- ユーザーが正規サイトの外部リンクをクリック(新しいタブで開く)
- 外部サイト(または攻撃者に侵害されたサイト)が
window.opener.locationを書き換える - 元のタブが気づかないうちにフィッシングサイトに遷移する
- ユーザーが元のタブに戻ると、「セッションが切れました」等のメッセージが表示され、認証情報を入力してしまう
ユーザーは元のタブが正規サイトだと信じているため、フィッシングに気づきにくい。
対策
rel="noopener noreferrer": 外部リンクには必ず付与する。noopenerがwindow.openerをnullにする- モダンブラウザの動作: Chrome 88+, Firefox 79+, Safari では
target="_blank"に自動でnoopenerが適用される。ただし古いブラウザへの対応のため明示的な指定を推奨 - JavaScript での対応:
window.open()で開く場合は戻り値の.opener = nullを設定する - CSP の活用:
navigate-toディレクティブ(実験段階)で遷移先を制限できる将来の対策
