■WinIE: HTTPエラーメッセージの簡易表示がクロスサイトスクリプティング脆弱性対策に有効という迷信を打破する。

WindowsIEには、『HTTPエラーメッセージを簡易表示する』というオプションがあります。既定値はONですから初心者などオプションを設定しなおすということを考えもしない利用者にとっては『HTTPエラーメッセージを簡易表示する』はONになっていることでしょう。おさらいをなさりたい人には下記の参考文献をまずはお読み頂いたほうが良いかもしれません。


HTTPエラーメッセージを簡易表示する。
http://clubpc.vis.ne.jp/ie/ic2.html

例えば、サーバからの404エラー応答があったときに、WindowsIEは気を利かせてサーバからの応答を使わず、ブラウザ側にインストールしてある、より詳細な案内用のHTMLを表示するという機能です。

少し以前の時代に遡りますが、各サーバの実装において、HTTPエラーメッセージの通知用HTMLの極めて多くにクロスサイトスクリプティング脆弱性があった時代がありました。ちょうどその折にIEには新機能、『HTTPエラーメッセージを簡易表示する』を付加し既定値ONになることとなりました。このMicrosoftによる措置がサーバサイドからのHTTPエラーメッセージに含まれるクロスサイトスクリプティング脆弱性となんらかの関連があったのかどうかは残念ながらいろいろな文書をあたったものの確証はつかめません。しかしながらクロスサイトスクリプティング対策なのだ、という認識が一部にあったことは否めないことでしょう。実際、IEが出力するHTTPエラーメッセージの簡易表示にはエラーとなったURLアドレスはフル表示されず、せいぜいドメインもしくはトップページとおぼしきアドレスへのリンクがひとつ表示されているだけであることがわかります。この性質の為、罠または悪意ある文字列を含んだURLはWindowsIEとしては表示されずに、サーバサイドのHTTPエラーメッセージ画面に含まれるクロスサイトスクリプティング脆弱性は無効化されているかのごとくにみえる、そういう説明も聞いたことがあります。実際問題、昨年ぐらいまで私はそのように信じていました。信じていましたが、それは間違いでした。あるいは重要かも知れませんので以下に書き留めます。

理由を端的に書きましょう。サーバからのHTTP応答が一定のバイト数を超えると、『HTTPエラーメッセージを簡易表示する』は起動されません。これはIEのオプションとは無関係です。たとえば404エラーでは512文字です。その他のエラーコードでは概ね、512文字ですが256文字の場合もありそうです。しっかり調べればわかりそうなのですが、どうやらこれはIEのバグではなくて仕様のようです。レジストリにもそのエラーコードごとに何文字超えたらHTTPエラーメッセージの簡易表示を出さないようにするかの設定が記録されているとのことです。

また、Microsoft:Q294807 - HOW TO: Turn Off the Internet Explorer 5.x and 6.x "Show Friendly HTTP Error Messages" Feature on the Server Sideのmethod2にも、自前のサーバサイドのHTTPエラーメッセージを513文字以上にするアイデアが書いてあります。core - Apache HTTP サーバ:ErrorDocument ディレクティブも参考になりますね。Microsoft Internet Explorer (MSIE) はデフォルトではサーバが生成したエラーメッセージが 「小さすぎる」ときには無視をして自分自身の「やさしい」エラーメッセージで 置換します。サイズのしきい値はエラーの種類によって異なりますが、 一般的にはエラーの文書を 512 バイトよりも多きくすると、MSIE は サーバが生成したエラーを隠さずに表示します。とのことです。

以上でわかることは、サーバサイドのHTTPエラー通知にURLアドレスをサニタイズせずに生のまま表示してしまうクロスサイトスクリプテイング脆弱性があった場合には、悪意ある者は充分に長いURLパスを用意してアタックすれば、WindowsIEのオプションがいかなるものであれ、ブラウザ側のHTTPエラーメッセージ簡易表示を抑制し、かつサーバサイドの危険な画面が表示されるように出来る、ということです。

このことは昨年に既に気がついていたのですが、本日、必要があって手元のWindows98とIE6(比較的フルパッチに近いもの)で再確認をしてあります。

また、悪意ある者には上記とは別の手段がありそうです。iframe要素を使うことです。iframe要素のsrc属性に問題のあるHTTPエラー通知を行うサーバのURLアドレスを設定すると、ブラウザ側で出力されるiframe内部の表示には、オプションに関係無く、『HTTPエラーメッセージを簡易表示する』はなされずにサーバサイドが用意したものがそのまま表示されます。URLアドレスは特に長くなくても構いません。こちらは本日気がついたことでして、やはり、Windows98でしか確認していません。

同じIE使っているのでしょうから、WindowsXPでも同様であるはずだと思われます。有識者の方はコメントを頂けると幸いです。仕様が確認されれば、もっと多くの人々に、特にサーバサイドの運営者に広く知っておいて頂きたいとも思います。

追記:OSに限らずこの現象は発生する模様です。ただし、iframe要素内に張られるサイトが信頼済みになっていないことが条件です。この仕掛けはkomuraさんにより発見されました。komuraさんありがとうございます。追記終わり。

結論:『HTTPエラーメッセージを簡易表示する』はXSS対策としては勘定にいれないこと。サーバサイドでHTTPエラーリターンする場合には必ずサニタイズを行う事。問題を指摘されても、IEOperaNetscapeなどを【普通】に使ってみてXSS脆弱性が発現しないではないかと言い訳けしないこと。そんな迷信は直ちに捨てる事。ゆめゆめサーバサイドのXSS脆弱性をHTTPエラーメッセージ簡易表示に頼って軽視しないこと。

□ この項追記

コメント欄にて、komuraさんより情報を頂きました。ありがとうございます。komuraさんによれば以下のようです。

Windows 2000 SP4 で、Windows Update で配布されている修正プログラムを全て適用した IE で試してみました。アドレスバーからの URL 入力では、同様の問題を確認したのですが、iframe 内では、IE のエラーメッセージの簡易表示が行われました。ただし、iframe の場合は、512文字ではなく、256文字くらいで簡易表示とサーバサイドの表示が切り替わるようでした(レジストリの設定は 404 エラーで 512 になっていました)。それほど詳しく確認したわけではありませんので、WindowsIE のバージョンによるものか他に何か原因があるのかどうかは分かりません。

後刻、komuraさんにより解明されましたが、OSによらず、iframe要素内のサイトが信頼済みサイトに登録されている場合に、HTTPエラーメッセージの簡易表示がなされるものと判明しました。また、XPで確認しましたが、iframe内の信頼済みサイトでも512文字が閾値であることに間違いはありません。HTMLのソースレベルで文字を数えております。


上記解明前に、komuraさんのWindows2000での試験ではちょっと私のwindows98と異なる結果が出ましたので、ちょっと焦りまして以下のように作業をしてみました。

iframe要素で貼り付けた404エラーの件、Windows XP Home Edition の IE6 で追試しました。以下に実験結果の画像を示します。

WinXP/HE IE6で404エラーをiframeで貼り付け:HTTPエラーメッセージの簡易表示は抑制されているのでサーバサイドから提供のメッセージが表示されている。

上の画像は、404エラーをiframeで貼り付けで確認が取れるものと私の手元では同じでした。なお、404.htmlは存在しません。皆様の環境ではどのように表示されるのでしょう?

HTMLソース(一部抜粋)は、以下のようなものです。HTML的には全然Validではありません。申し訳ないことです。


<iframe src="
http://stardust.s2.xrea.com/hatena/test404/404.html
">

http://stardust.s2.xrea.com/hatena/test404/ の下で存在しないファイルを要求した時には以下のCGIが作動して結果を返しています。要求されたパスを返しているだけです。ショボイけれども許してください。私はPerlなんて知らないのです。


 #!/usr/local/bin/perl

 $key = "REQUEST_URI";
 $keyd = $ENV{$key};
 $keyd =~ s/</&lt;/g;
 $keyd =~ s/>/&gt;/g;

 print "Content-type: text/html", "\n\n";
 print "$keyd";

iframeでなくてダイレクトに呼び出すことは、http://stardust.s2.xrea.com/hatena/test404/404.htmlで確認が出来ます。404エラーが返ってきていることがわかります。

念の為にダイレクトに呼び出した際の応答ヘッダ例を下記に示します。


404 Not Found
Date: Tue, 30 Mar 2004 14:28:26 GMT
Server: Apache
Connection: close
Content-Type: text/html

上でもわかるように、私の手元にて、XPのホームエディションでは、Windows98と同じ結果が出ています。要は、少ない文字数でもiframe要素にてブラウザ側で用意したHTTPエラーの簡易表示を抑制出来ている、ということです。komuraさんのwindows2000とは違う結果でした。

Windows2000だけ違うのかなぁ?それともXPのプロフェッショナルエデイションとWindows2000とは同じなのかなぁ。。まことに不思議です。OSによらず、WinIE6では、信頼済みになっていないサイトをiframe内に貼り付けてHTTPエラーメッセージを表示させた場合、簡易表示するのオプションがONであっても、簡易表示はなされません。


おまけです。返却文字数が512文字以下と以上とを用意しました。HTTPエラーメッセージを簡易表示するオプションをONにして試してみることが出来ます。言うまでもありませんが、基準は404エラーになった時の『ソースにおける』文字数です。URL文字列に<を使い、クロスサイトスクリプティング対策で文字数が4倍になるのを利用しています。なにせ、URL文字列で数字のみ512文字に近いあたりで試してみたら、ことごとくXREAの上位の設定にひっかかって別のエラー画面が出ますので、ちょいと工夫しました。

  • 511文字:HTTPエラーメッセージ簡易表示作動
  • 512文字:HTTPエラーメッセージ簡易表示作動せず、サーバサイドからの提供メッセージ表示。

あれぇ!1文字あわないような。なぜ?

ちなみに、レジストリをいじって、404エラーで4096文字の閾値にしてみました。http://www.yahoo.co.jp/naiyonaiyo とかがいつもと違って、HTTPエラーメッセージの簡易表示画面になりました。せっかくサーバが用意してくれた404エラー時のガイドが出ないので激しく不便かも知れません。どこに影響が出るのか不明なのでレジストリをいじるのはやめたほうがいいですね、おそらく。

以上、追記分はXPで検証して書いています。

■XREA.COMのSSL対応について

XREAのトップページに張られているリンク、http://sb.xrea.com/showthread.php?&threadid=6646には、XREAにおける、安全な通信をサポートするSSLの追加について書いてあるわけですが、なんとも不思議なのです。最新の記事ではないかも知れないので後日調べてみなくては。少なくともこの記事のままだと、document.domainがどうなっているのかあやしいのでcookieSSL利用時に絶対に使いたくない気がします。でもそれだとまともなセッション管理って難しくないかと、じゃぁSSLをそもそもどのように使うのかと。不思議です。

別資料のhttp://sb.xrea.com/showthread.php?postid=48823が見つかりました。割と最近の資料ですね。ううぅむ。変なのぉ。独自ドメインとってたらなおさら変。商売やるなら自前サーバ!ってとこですか。こういうところで筋悪のSSL覚えるとどうなっちゃうんだろう。