Firefox/1.5.0.8でステータス200かつtext/plainなサーバ側出力をブラウズしてJavaScriptが作動する、気がつきにくい例

但し書き

以下は、基本的にFirefox/1.5.0.8以前についての記述です。

昔のIEでのtext/plain出力でJavaScriptが作動

昔のIEでは、サーバからの出力においてMIMEタイプがtext/plainであってもJavaScriptが作動することがあり、特にXSS方面では迷惑以外のなにものでもありませんでした。

今回おはなしするFirefoxのケース

一方、今回このページで記述する、Firefoxにおいてサーバからのtext/plain出力でJavaScriptが作動する件は、ブラウザの脆弱性ではないと思われます。ご安心ください。その理由は後ほど判ります。

サーバ側のtext/plainな出力を以下のようにしてみる

ほんの一例ですが、perlでコードを書いてみます。


#!/usr/bin/perl

print "Link: </http.css>; rel=stylesheet\n";
print "Status 200 Found\n\n";
print "this is a plain\n";
print "text";

HTTPの応答ヘッダにおいて、Link header を用意してstylesheetを呼んでいます。MIMEタイプは明示していませんが、text/plainとなります。

http.cssはこんな感じ

Linkヘッダから呼ばれるスタイルシートファイルは例えば以下のようにします。pre要素対象でなくとも可です。javascript:擬似スキームあたりでは特殊な記述をしていますが、普通に記述するとWindowオブジェクトのプロパティに触れないという制限を回避するためで、Firefox/1.5.0.8以前に有効です。(JavaScriptにこだわらなければ背景色を赤にするなどで試してもいいかもしれません)


pre {
background: url('javascript:(function a(){alert(document.cookie)}).call(this);');
}

ブラウザの脆弱性ではない理由

上記ではtext/plainな出力でクッキーがalertされますが、Firefox脆弱性ではありません。サーバ側にHTTPヘッダインジェクション脆弱性があってはじめて悪意ある攻撃が成立するからです。また、最新のFirefoxにおいて、stylesheetからJavaScriptが呼び出せる可能性はまずはないかと思っております。

でも

JavaScriptを作動させずともstyleで背景が真っ赤なtext/plainなファイルや、テキストなcontentをCSSで表示してしまうファイルはネタ的には興味深いかもですね。ソース表示しても存在していないものが見えるという。作っておいて誰かにみせるというのはどうでしょう?あ、最新のFirefoxで試していませんのであしからず。(HTTPのLinkヘッダで呼び出したstylesheetを最新のFirefoxは解釈しましたっけ?)
う?ところで、そうやって表示されたものをFirefoxでデスクトップに保存したらどうなるのででしょう???HTTP応答のLinkヘッダの記述が、meta要素で記述されるはずもありませんし(text/plainなファイルであれば)後でためしてみようっと。

最後に

上記のコードは記憶を元に手でパンチしましたので、適宜修正して作動させてくださいませ。すみません。さっそくyamagata21さんに校閲されました。orz Foundじゃなくて、Founfと書いてしまった…