Почему этот тег iframe приводит к сбою Safari в 64-разрядной версии Windows? - PullRequest
6 голосов
/ 21 декабря 2011

Если вы не слышали, этот фрагмент кода вызовет сбой BSoD на 64-битной Windows 7 при запуске в Safari

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

Итак, естественно, вопрос в том, как именно это происходит, и почему 18082563, а не сказать «1808256 4 »?

Ответы [ 2 ]

8 голосов
/ 23 декабря 2011

Это объяснение этому.

http://pastebin.com/XTWnLF3p

Ошибка возникает из-за запроса NineGrid, поступающего через GdiDrawStream, отправленного от имени библиотеки тем UX, которая обрабатывает темы Windows, начиная сXP и более поздние версии.

Браузеры Webkit (наряду с IE8 - но, похоже, не с IE9) пытаются отображать элементы HTML на странице, используя собственный скин ОС.В этом случае в функции drawControl (см. http://www.opensource.apple.com/source/WebCore/WebCore-658.28/rendering/RenderThemeWin.cpp), вызывается DrawThemeBackground, которая обрабатывает создание скинов элементов управления ОС.

Отправляется 96-байтовый буфер (0x60) (параметры 2 и 3 GdiDrawStream имеют значениеразмер и адрес буфера, параметр 1 - это HDC).

Draw Буферы Steam начинаются с магического значения, за которым следует ряд команд, идентифицированных 32-байтовым рынком. Вот поток, отправленный со специальнымiframe при просмотре в Safari:

44727753 = 'DrwS' = DrawStream Magic

Командные буферы:

#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 есть хорошо известная ошибка CSS, в которой он имеет максимальный предел пикселей (около 1342177), поэтому он не проявляется сразу.

OTHER HEIGHTS - EXPLOITABLE , а некоторые могут быть достаточно маленькими, так что даже IE 8 попадает в регистр высоты NineGrid.

IE9 вообще не выглядит для элементов управления темами, использующих UxTheme, и его поведение полосы прокрутки отличаетсяиз IE 8, поэтому, хотя ограничения по пикселям больше не существует, PoC не работает.Firefox не был протестирован.

НЕ ТОЛЬКО РАСШИРЕНИЯ Уязвимы .Тестирование с использованием HTML такой же высоты также привело к сбою в Safari.

Это означает, что любой клиент, локальный или удаленный, который создает скины элементов управления (то есть:почти все из них - даже кнопка на флэш-PDF) может привести к преобразованию NineGrid, которое попадет в эту ошибку.Это совсем не относится к WebKit.

1 голос
/ 17 февраля 2012

Как примечание, MS недавно выпустила MS12-008, которая исправляет это.

...