クイズ

IE(9以降)でalertされるのはどの範囲?

(2015/09/18追加:スマートフォン版では正しく表示されないのでPC版かモバイル版を見てください)

Q1:

<script>
window.onerror = function(e) {
	alert(arguments.callee.caller);
};
var a;
function aa() {
	a();/* comment 1a */ //comment 1b
}
</script>
<script>
<!-- /* comment 2a */ //comment 2b
/* comment 3a */ //comment 3b
aa();
/* comment 4a */ //comment 4b
/* comment 5a */ //comment 5b -->
</script>

Q2:

<script>
window.onerror = function(e) {
	alert(arguments.callee.caller);
};
delete a;
</script>
<script>
<!-- /* comment 2a */ //comment 2b
/* comment 3a */ //comment 3b
function aa() {
	a();/* comment 1a */ //comment 1b
}
a();
/* comment 4a */ //comment 4b
/* comment 5a */ //comment 5b -->
</script>

WebKitから UTF-7が消えた経緯

この記事は 脆弱性"&'<<>\ Advent Calendar 2014 http://www.adventar.org/calendars/622 の23日目です。

WebKitUTF-7 デコーダのバグを利用した XSS (CVE-2010-1390)がどのようなものだったのか、そろそろここでまとめようと思います。

エンコーディングUTF-7 の場合に、以下のHTMLをSafari 5.0 / 4.1 以前でパースすると

<form id=a>
<input type=text value="+"><input type=text value="- onclick=alert(document.getElementById('a').innerHTML)//">
</form>

以下のようにパースされます(?のところは実際には U+FFFD となります)。
ポイントは + の直後の " が違う文字に化けてしまっている点です。

<form id=a>
<input type=text value="?><input type=text value="- onclick=alert(document.getElementById('a').innerHTML)//">
</form>

なので、こんなことになります。

この現象に気付いたのは http://d.hatena.ne.jp/hoshikuzu/20090908#c のやり取りがきっかけです。
これを WebKit の Bugzillaに報告したら、HTML5の仕様策定の関係者から、

UTF-7を無効化しよう

という提案があり、誰からも反対意見が出されることなく、提案が通って UTF-7WebKit から消えました。
http://support.apple.com/en-us/HT4196
当時すでにChromeも存在していたのですが、Chrome Release の blogには修正記事が載らないまま、公式アナウンスなしで改修されてしまいました。