Firefox(1.5.0.8)でJavaScriptの不思議な実行法

コード

Firefox(ver1.5.0.8)では、以下の不思議な記述でJavaScriptが実行可能でした。例ではalert(document.URL)相当を試みています。なお、ver1.5.0.9以降では成立いたしません。(もしもtypoがあったならば何卒ご容赦をお願いいたします。)

<head>
<title>{foo:bar;}body{background:url("javascript:/**/(function/**/_(){alert(document.URL)}).call(this)")}
</title>
<link href="" rel="stylesheet" type="text/css">
</head>
title要素に(いわゆるHTMLエスケープ済みでも良い)style記述を行います。このstyle記述からJavaScriptのコードを実行します。

空のhref属性

上記のように空のhref属性をもつrel="stylesheet"なlink要素が記述されていますと、Firefoxは、不思議なことに、外部stylesheetファイルを、呼び出し側のHTMLファイルであるとみなします。これはバギーであると思われます。
(5/1追記)Tietewさんからのご指摘によりバギーのくだりを、削除いたします。

title要素の中の{foo:bar;}

HTML本体がstyle記述であるとみなされますのでHTMLの先頭からは文法違反のstyle宣言があることになります。この宣言の一区切りと解釈させるために{foo:bar}を置きます。続くbody{【なにか】}がこのことでstyle宣言として解釈されます。

url()の中のjavascript擬似スキーム

通常ではurl()中のjavascript擬似スキームで書かれたステートメントは、グローバルオブジェクト配下のオブジェクトに対してプロパティ(ないしメソッド)を利用する権限がありません。このため、javascript:alert(document.URL)の記述は実行エラーとなります。
実行したい複数のステートメント全体を関数スコープ的な記述でくるんでやり、その関数をcall(this)してやることで権限上昇を得ます。なお、ここでthisはグローバルスコープで関数が動くことを念押ししていることになります。

上記は

上記は今日の日記のために不可思議な例として人工的に作られたものです。一般的にはこのままでXSS脆弱性があるとはみなされないことでしょう。そもそも、空のhref属性を持つlink要素って世の中に実在するでしょうか?人工的な例題であるゆえんです。

実は

link要素やimg要素など、上で触れられた技巧で予期しないJavaScriptの起動は可能でした。ver1.5.0.9からは不可能になりましたのでことなきを得ています。擬似スキームを変装する手法も既にありましたので、それなりに危険であったかもしれませんが、そもそも他のブラウザのためにもサーバ側アプリでは危険な擬似スキームの記述を許すべきではないことは定説ですから、とりたててFirefoxのみが危険であるとは言えませんでした。公的機関に報告するために上記の性質を調べているうちに、Firefoxのversionがあがって危険が去ったため、公表を数年間待機することに致しました。

https://bugzilla.mozilla.org/show_bug.cgi?id=351370

※moz-binding に data:擬似スキームを使って直接展開する手法も今は無効と思われますので…(昨年夏頃から)