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.
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. –
En realidad, debería preguntarle a Microsoft que es un [problema en win32k.sys] (https://secunia.com/advisories/47237/) – Luke
Si bien es un problema de MS, ¿por qué solo se desencadena en Safari? – DaveHogan