■WinIEだけじゃぁないURL偽装再び。パート2

昨日にひきつづき、ステータスバー偽装問題であれこれ書くことにします。

昨日は、formのボタン等をスタイルシートで見栄えを変えて、a要素の中に埋めこむことによりリンク先を見るためのステータスバーの偽装が可能である件について書きました。実は、見栄えを変えることの出来るのは、formのボタンばかりではありませんでした。この事実は昨日ユーザースタイルシートによる防御策をあれこれ考えているうちに見出しましたので、早速、マイクロソフトさんにメールにてご報告いたしました。すると、先ほど、お返事を頂きました。余談ですが、マイクロソフトさんの脆弱性報告に関する第一次対応は極めて素早いです。これは今までの体験から見て間違いありません。常々感謝しております。余談はさておき、メールにてご報告した内容と、そのお返事の抜粋、そして関連する事項についての考察をツラツラと思いつくまま書いてみようと思います。


まず、私が気がついた別種類のexploitを含む、マイクロソフトさんへのメールを抜粋します。

To: Japan Microsoft Security Response

Subject:Internet Explorer/Outlook Express Restricted Zone Status Bar Spoofing

報道されていたステータスバーのURL偽装の件ですが 以下のような変種があります。 修正パッチにはこれも考慮に入れていただければと 存じます。

http://stardust.s2.xrea.com/hatena/httpequiv/a.html

a要素の中に入れ子でiframe要素を入れるものでして、報道されているものよりも自然な見た目になってしまっています。


次に、Japan Microsoft Security Response チームさんからのお返事を抜粋させていただきます。文中、強調は私によるものです。

ご連絡いただいた、 Internet Explorer に関するステータスバーの表示が実際のリンク先と違う現象について、Internet Explorer脆弱性ではないと判断いたしました。
この問題は、実現の方法は違いますが、以前ご連絡いただいた<a> と <td> を組み合わせることで実現可能な現象と本質的に同様と考えています。

Internet Explorer のステータスバーは、各種スクリプト等を利用することで自由に変更可能なものです。 そのため、ステータスバーの表示は機能上、信頼できるものではございません。
しかしながら、表示と実際の動作の不一致は、お客様に不安を与える原因となりますため、将来製品において改善することを検討いたします。


a要素の中に入れ子でiframe要素を入れるものは、上でも触れた通り、http://stardust.s2.xrea.com/hatena/httpequiv/a.htmlにサンプルがあります。少なくとも、WinIEでは、悩ましいところではあります。Operaでは注意深ければ大丈夫かも知れません。Netscapeでは多分大丈夫でしょう。他のブラウザでは確認を取っていません。

ソースは単純なのですが、念の為、以下に書いておきます。大文字小文字が乱れ飛んでいますが、あわてて書いていたためです。見にくいですがお許し下さい。


[a.html]
<a href="http://www.google.com" >
<IFRAME src="./b.html" 
scrolling="NO" width="200" height="44" frameborder="0" >
</IFRAME>
</a>

[b.html]
<A HREF="http://www.yahoo.com" title="http://www.google.com" target="_blank">http://www.google.com
</A>

上記コードの特徴としては、スタイル属性やスタイル要素を使わず、イベントハンドラからのjavascriptも使っていない、という点でしょうか。frameborder属性とscrolling属性の設定はよく見られるものです。技術的にはなんら難しいものを含んでいません。ところが、むしろ、なまじ正しい書法を知っている人には思いつかないかも知れません。

HTTP-EQUIV氏によるFORMボタンの偽装ではクリックした時のボタンが沈み込む感覚ですとか、あるいは右クリックすると変なショートカットメニューが出るという性質がありますが、上記iframeの例ではその点、自然なものに仕上がっちゃっています。右クリック後、さらにリンク先URLをコピーしメモ帳などのテキストエディタに貼り付けて目視確認をせざるをえません。

上記はフィッシング詐欺にはうってつけだと思いますがいかがでしょうか。非常に悩ましいです。


さて、悩ましいのでちょっと息抜きを。上記マイクロソフトさんからの私宛ての返信において、『●●(私の本名)様』と冒頭にありましたが、私の名前と良く似た名前が書いてありました。時々間違われるんです。よくあるパターンで間違って呼ばれるのです。慣れっこになっちゃいました。特に怒りません。はい。

あともうひとつ。以前ご連絡いただいた<a> と <td> を組み合わせることも勘違いかと。私、知りませんでしたし、そのようなご連絡はしておりません。ま、勘違いであれ、聞いた私は『儲け!』と思いました。不謹慎ですね、私。(苦笑)

いや、ユーザ側防衛策として考えるべき対象が広がるのはやっぱり『儲け』かと。冗談はこれくらいにしておきます。


さて、ご連絡いただいた、 Internet Explorer に関するステータスバーの表示が実際のリンク先と違う現象について、Internet Explorer脆弱性ではないと判断いたしました。とのことですから修正パッチが出ることは当面ない、と考えても良いような気がします。また、しかしながら、表示と実際の動作の不一致は、お客様に不安を与える原因となりますため、将来製品において改善することを検討いたします。とのこと、出来るだけ速やかにご検討頂ければ皆が幸せになれることでしょう。出来ましたら検討だけではなく実現もお願いしたいところです。いや、疑心暗鬼とかでなく切実な思いを書いているだけです。

Internet Explorer のステータスバーは、各種スクリプト等を利用することで自由に変更可能なものです。 そのため、ステータスバーの表示は機能上、信頼できるものではございません。とのこと、これは同意いたします。アクティブスクリプトがONだとステータスバー表示その他が役に立たないことは、昨日Kamadaさんにもあらためてご教示頂いておりますし。でも、今話題になっていることは、各種スクリプトがオフでも安全にブラウズが出来ない事を意味していると思われます。HTMLの解釈において各要素の間の優先順位がWindowsIEの場合には乱れている、そのように感じられます。それゆえ修正もまた難しいであろうことは推察できます。


さて、かかる状況ですのでWinIEのユーザの当面の自衛策をなんとかしてひねり出したいところなのですが、昨日書いた下記のユーザスタイルシートは、落第です。

a form {display: none !important }
a input {display: none !important }

上記はformが閉じていなかったり不正な表記をした場合に備えてかなり考えたものだったのですが、残念なことにa要素の中のinput要素などform関連の要素を不可視にするのみの機能しかありません。HTTP-EQUIV氏が発表していたSecuniaにのったexploitではこれで万全なのでしたけれどねぇ。悔しい事に本日この日記に書いている、a要素に入れ子になったiframe要素は防止出来ないのです。また、マイクロソフトさんからのお返事のメールにもあった、td要素の入れ子にも対応出来ません。(exploitが思いつかないので試験すら出来ませんが。)この意味で、自衛策として落第なのです。

また、不可視として対応すべきブラックリストとしては、input,frame,iframe,td,だけではたして良いのでしょうか?ここまで増えてくるとかなり不安です。インライン要素はひょっとしたら全部駄目でしょうか?というのは心配しすぎかもしれませんが、メディア系とか考えると頭が痛いのも事実です。こうなると、ブラックリスト搭載型では駄目だということが判ってきます。ホワイトリストに載ったものだけが可視になる、そのような記述が可能ならば一番良いですね。目標。子孫セレクタなどを使って、a要素の内側に組み込まれたテキストおよびにimg要素だけを可視にすること。それ以外は不可視。これが出来れば安全かなぁと思います。

私はスタイルシートの基本がわかっていませんので、このようなホワイトリストが可能なのかどうか全然わかりません。なんとかしたいとは思いますが、皆様に是非、お知恵を御貸し頂ければと思います。

□うはぁ、WinIEだとこんなにいっぱいバリエーションが!

StudioKamada-日記-20040404#ハイパーリンク系の罠では、caption、td、th、marqueeの事例のデモが体験できます。ありがたい事です。

やはりユーザースタイルシートブラックリスト方式で作ることには難があります。

□面倒だけど今のところ確実な自衛策について

以下、いつ修正がはいるか不明ですが取り合えず。

WinIEでのユーザの自衛策:javascriptはオフにする。リンクでは、オンマウスオーバーでのステータスバーの表示を確認するが信用しない。右クリックして表示されるショートカットメニューを必ず確認する。いつもと違ったらそれは罠。いつもと同じでも信用しない。ショートカットメニューでショートカットの内容をコピーし、テキストエディタに貼り付け、真のリンク先を確認する。

続編(パート3)につづきます。