XP SP2のIEにポップアップの「タイトル・バー」を偽装される弱点

IT Pro ニュースから記事が出た

XP SP2のIEにポップアップの「タイトル・バー」を偽装される弱点 : IT Pro ニュースの記事が勝村さんのペンで出ました。勝村さんはとても素敵だと当日記でも以前書いた通りです。いつも勉強になります。他社記事よりもツボをついていますし正確だし、初心者にもわかりやすく対策まで書いてある。徹底した勝村ポリシーを感じるわけです。

今回の記事も素晴らしいのですけれど、以下の部分は間違いでしょう、おそらく。

なお,XP SP2のIEには「ポップアップ・ブロック機能」が備わっているが,window.createPopup() によるポップアップ・ウインドウは,1ページあたり1つだけ許可されているので,今回のような偽装が可能となる。

XP SP2のIEには「ポップアップ・ブロック機能」が備わっているが,window.createPopup() によるポップアップ・ウインドウは,1ページあたり1つだけ許可されていることには間違いがないと思います。ので,今回のような偽装が可能となる。とはどのような意図なのか不明な記事ですね。

XPSP2の機能として、window.open()にてアドレスバー抜きでポップアップされたウィンドウにタイトルバーが強制表示されタイトルバーにURLが表示される、フィッシングの為に偽装できないか、そのURLを偽装する方法ならあるよ、というのが今回の件の目玉だと思います。

window.createPopup() によるポップアップ・ウインドウは、タイトルバーの強制表示機能が働きませんのでそもそもタイトルバーの偽装をする必要がありません。

オリジナルのPoCではサブウィンドウのPOPUPがXPSP2のポップアップブロッカーの警告なしで表示されています。こんなことが出来るのは通常ならばwindow.createPopup() だろう、というのが勝村さんの誤解の一因ではなかろうかと失礼を省みず申し上げました。今回のPoCではポップアップブロッカーを回避する別手段が使われています。

脆弱性か弱点か、はたまた…

ところで同記事では、今回の報告がIEの“弱点”と呼べるかどうかは議論が分かれるところだが,偽装が可能であることは確か。とのことです。私の目から見れば、これは脆弱性でも弱点でもなく「デザインエラー」です。

設計方針がよろしくない、という意味でデザインエラーという言葉を使っています。仕様を完璧に満たしていますからコーディング上のバグではありません。仕様そのものがどうなのか?設計思想はどうなのか、が問われると思います。

そもそもポップアップウィンドウにおいてアドレスバーを隠すことが出来ること、それがJavaScriptのデザイン上の問題なわけです。これをブラウザ側の都合で再解釈しても構わないと思います。すなわち、アドレスバーは、どのようにコーディングしてあっても必ず強制表示すること、そして、javascriptのウィンドウの大きさを変更できない指定も無視してしまえば良いですね。これらの処置によってURLの確認はアドレスバーで行うことが出来ます。ウィンドウのサイズは必ず非固定、リサイズ可能としますから長いURLでも平気です。

欲を言えばアドレスバーの横っちょにあるGOボタン(移動ボタン)は要らないから、替わりに、ドメイン確認ボタンが欲しいですね。ドカンと画面中央にドメインが見やすく表示されるように。

XPSP2では、どういうわけか、アドレスバーの強制表示の手段をとらずにタイトルバーにURL表示するという暴挙を行っています。これはデザインエラーでしょう。タイトルバーは文書のタイトルを表示するところ。アドレスはアドレスバーで確認したいですね。また、アドレスを、「この場合はこちら、あの場合にはあちら」で確認するのってどうなのでしょう?複雑で勘違いしやすいです。

今書いていて思いましたが、SSLサーバ証明書の確認のための鍵アイコンもまた、アドレスバーにあったほうが良いのではと。

クリックしたらポップアップ

クリックしたらポップアップ。これはポップアップブロッカーの責任の範疇外とされています。スクリプトから自動的に行われるポップアップが抑制されている、このようなことでしょうか。クリックしたのだから見たいのだろう。

私にはちょっと疑問なのですよね。そもそもポップアップそのものが必要なのかどうか。全部禁止してしまえ、というのが私の考えです。いや、この意見が過激なのはわかっています。

ええと、こういうのはどうですか?リンク(アンカー)をクリックしたからポップアップブロッカーが働かないサブウィンドウがポップアップする。これはJavaScriptが行っている。ポップアップするのと平行にメインウインドウについてはロケーションを変えてしまう。フィッシング詐欺に使われますか?偽のポップアップでログインフォーム表示、メインウインドゥはターゲットとなる有名サイト。

もしも都合が悪くても、上のスクリプトはデザイン上許された仕様で動いているだけです。どこかにブラウザのバグがあるわけではないですよね。場合によってはブラウザによらないわけで。脆弱性とも弱点とも言えないかもしれません。デザインエラーなのですよ、と私は言ってみたいですけれど。複数のウィンドウをセンシティブな情報をやりとりするサイトで使うことの危険性について言っているのです。HTTPはステートレスだから困る、という論議と同様、複数のウィンドウが同一のサーバ起源であることを全く保障していないことにも、もっと論議されても良いと思うのですよね。

オリジナルのPoCについて感想

ここで記事からも参照ポインタのあるオリジナルのPoCについてもう一点考えてみます。

PoCでは、ポップアップブロッカーの回避をしています。これをa.htmlと名前を付けておきます。a.htmlをロードするとニセポップアップウィンドウが本物のメインウィンドウにかぶさるわけですね。ポップアップブロッカー回避はある意味必須です。

通常a.htmlはインターネットゾ−ンにおかれます。OutlookExpressでHTMLメールを読む場合には恐らく制限付きサイトゾーンのセキュリティーレベルで読まれることになります。すなわちスクリプトは働かない。ところが制限付きサイトゾーンでステータスバーを偽装する罠については既に知られていますから、CitiBankへのリンクのふりをしてa.htmlに誘導することは可能でしょう。a.htmlではニセポップアップが出現するわけです。ポップアップブロッカーの回避をするとするならば上のようなシナリオが考えられます。

もしもHTMLメールをJavaSvript作動可能な環境で読んでもらえるならばポップアップブロッカー回避はおそらく必要ないのではないかと思います。CitiBankを装った罠のリンクではJavaScriptでステータスバー偽装が可能です。また、そのリンクをクリックしたらポップアップブロッカーの出る幕がなくニセのサブウィンドウが出現、メインウィンドゥでは本物のCitiBankのサイトを表示。これでおしまい。色々なブラウザの種類にかかわりなく攻撃は成功してしまうことでしょう。アドレスバーが見えなければですが。

JavaScript改造案

JavaScriptの権限が強すぎると思っています。今見ているサイト以外のサイトとはなんらかの意味でやりとりを断絶できると良いと思います。location.hrefなどはもってのほかです。何かのリソースを示すURIの提示もJavaScriptでは全面禁止してはどうでしょうか。たとえばimg要素のsrc属性をJavaScriptで記述するのは禁止。iframe要素もframe要素も同様。object要素も同様。formのaction属性もそう。HTMLやXHTMLで出来ることはJavaScriptでは全面禁止。cookieだって本来そのサイトの中でしか通用しないはずです。それと同じ扱いをしたいのです。何を言いたいのか自分でもまとまりませんが、すみません。何かのリソースを他のサイトに求めることが出来るというのは即ち、他のサイトに情報をもたらすことも可能だということです。これを禁止したい。駄目ですか。そうでしょうねぇ。はい。すみませんでした。

セキュリティホールmemo ML のアーカイブを一発で見たい。

Basic認証

セキュリティホールmemo ML のアーカイブには、Basic認証がかかっています。検索エンジンよけですね。いっぱいメールアドレスがのっているし。

IEで見るにしても、IEではURLに@禁止になってしまったことは記憶に新しいですよね。毎回Basic認証のためのユーザidとパスワードを入力するのはイヤだなぁ、なんとかならんべぇか?と思って以下のようなものを捏造。強調しておきますけれど、これは信頼済みサイトゾーンに置いておかないと意味がありません。で、ブックマークには、こいつへのリンクをおいておきます。

<h1>SECUMEMOML</h1>
<script>
var IE = new ActiveXObject("InternetExplorer.Application");
IE.Visible = true;
up = "Authorization: Basic YXJjaGl2ZXM6YXJjaGl2ZXM=\r\n"
IE.Navigate2("http://www.st.ryukoku.ac.jp/~kjm/security/ml-archive/memo/", "", "", "", up);
</script>

未署名のActiveX扱いなので例えば既定値の信頼済みサイトゾーンのセキュリティレベルでないと作動しないと思います。それでも確認ダイアログが出ますけれど。間違ってもインターネットゾーンのセキュリティレベルを下げないでください。

ところで、なぜIEを新しいインスタンスで起動することが未署名扱いなのか真剣に考えて見ましたら、なんのことはない、いろんなものにアクセスできて危険なのでした。電卓とか。なぁんだ。納得。

ところで実際に上記のようにやってみると、あんまり役に立っていないことがわかります。すみません、ネタでした。