「新しいタブで開く」は危険ではない

運営者情報
椿

中小企業のIT部門を支援しています。情報収集が得意です。正確な情報を収集することで、根拠のある意思決定や問題解決を促します。

椿をフォローする

現在閲覧しているページで別のページを開くとき、「新しいタブで開く」という機能がある。自ら操作する場合と、Webサイト側の制御で自動的にそうなる場合の2種類の動きがある。この機能にはセキュリティ上の欠陥があり、悪用できることが分かっている。現在では主要なブラウザで対処されており、危険性はほとんどない。ここでは悪用の仕方と対処法を解説する。

1、「新しいタブで開く」の脆弱性とは

なぜ、「新しいタブで開く」機能が危険なのだろうか。それは、新たに開いたタブ側から元のタブを操作できるからだ。

「新しいタブで開く」は、HTML言語で以下のように記述する。

<a href="https://denno-lab.com" target="_blank">東京電脳LABO</a>

ここでJavaScriptを使うと、新たに開いたタブ(子)から元のタブ(親)を操作することができる。以下の構文で「***」に任意のURLを記述すると、元のタブ(親)をそのURLのWebページに書き換えることができる。

window.opener.location.href = ***;

2、悪用手口の解説

この攻撃手法はタブナビングと呼ばれている。

タブナビングとは
ブラウザのタブをひったくる(nabbing)ことで、Webブラウザの持つタブ機能を悪用して、現在アクティブになっているタブから、他のタブの内容を変更するような攻撃です。

ポケットスタディ 情報セキュリティマネジメント 午前・合格用語 キーワードマップ法+過去問226題

具体例
【1】Webサイト(親)を閲覧している時、別のWebサイト(子)を新しいタブで開く
【2】しばらくWebサイト(子)を閲覧して、元のWebサイト(親)にタブを切り替える
【3】元のWebサイト(親)がGoogleのログイン画面に変わっている
【4】「何かの拍子にGoogleからログアウトしてしまったんだろうか」と思い、ログインIDとパスワードを入力し直す

この時表示されているGoogleのログイン画面は、悪意のある者が作成した偽物だ。タブナビングを使い、親のWebサイトを偽物のログイン画面に書き換えたのだ。このログイン画面で入力したIDとパスワードは、悪意のある者に送信されてしまう。

3、対処法

HTMLの記述に「rel=”noopener”」と追記することで、この攻撃を防ぐことができる。以下のように記述すると、JavaScriptを使っても元のウィンドウ(親)のURLを知ることができない(「window.opener」に「null」を返している)。

<a href="https://denno-lab.com"  target="_blank" rel="noopener">東京電脳LABO</a>

現在では対応が進んでおり、主要なブラウザでは自動で「rel=”noopener”」が挿入される。HP制作ツールでも自動で挿入されるものがある。

GoogleChrome(2021/1/19)
HTML標準の変更に準拠するために、target = “_ blank”のアンカータグは、デフォルトでrel = “noopener”を付加するようになりました。これにより、タブナッピング攻撃を防ぐことができます(筆者翻訳)

New in Chrome 88|Chrome Developers

Safari、iOS、macOS
「target=_blank」のリンク動作を更新して、デフォルトでrel=”noopener”を含めました(筆者翻訳)

Safari 12.1 Release Notes|Apple Developer

Firefox(2020/7/28)
DOMプロパティwindow.openerが信頼できないサードパーティのサイトに悪用されるのを防ぐために、Firefox79はtarget=_blankを含むすべてのリンクにrel=noopenerを自動的に設定するようになりました(筆者翻訳)

Firefox 79: The safe return of shared memory, new tooling, and platform updates

HP制作ツールのWordPressでは、「TinyMCE」というエディタにおいてセキュリティ修正が行われた。そのセキュリティ修正を含んだWordPress4.7.4が、2017年4月にリリースされた。

TinyMCE(2016/11/23)
ADDED new security feature where links with target=”_blank” will by default get rel=”noopener noreferrer”.

Changelog|TinyMCE

4、まとめ

Webサイトを制作していると「新しいタブで開く設定は危険だ。使用を止めるか制作者が対処するべきだ」という情報を目にすることがある。しかし、現在ではほとんどのブラウザで対処されているため危険性は低い。あなたが見つけた情報は何年か前のものではないだろうか。もし最近の情報であっても、古い情報を転載しているだけかもしれない。

また、IE11では「noopener」の自動挿入は行われない。そのため、IE11の利用者のために、今の所はWebサイト制作時に「noopener」を設定するよう配慮しようという意見もある。しかし、IE11は2022年6月15日でサポートが終了し、実質使えなくなった。もう、上記の配慮も必要ないのだ。

SOURCE
フィッシング詐欺の新手口――「開いているタブが偽サイトに」|日経XTECH
target=”_blank”を使った脆弱性Tabnabbingとその対策|69log
なぜtarget_blankを使わない方が良いと言われるのか|LPEG
Remove rel = “noopener noreferrer” in wordpress 4.7.4|WordPress.org Forums