6

このコードを聞いたことがない場合は、Safari で実行したときに x64 ビット Windows 7 で BSoD クラッシュが発生します。

<iframe height='18082563'></iframe>

当然のことながら、問題はそれがどのように正確に発生するかということであり、なぜ 18082563 であり、「1808256 4」とは言わないのでしょうか?

4

2 に答える 2

8

それに対する解説です。

http://pastebin.com/XTWnLF3p

このバグは、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 に固有のものではありません。

于 2011-12-23T05:10:21.187 に答える
1

注として、MS は最近、これを修正する MS12-008 をリリースしました。

于 2012-02-17T16:24:58.447 に答える