Sólo 2 instrucciones para provocar el fallo de cualquier sistema Windows de 32 bits

Las siguientes dos instrucciones en ensamblador son capaces de inutilizar (crash) cualquier sistema operativo Windows de 32 bits (hasta Windows 7 SP1 con los últimos parches) siempre que ntoskrnl.exe esté cargado bajo 0x8323f000 y donde 0x8327d1b7 es la dirección de nt!KiSystemServiceAccessTeb:

xor ebp, ebp
jmp 0x8327d1b7

Seguro que pensarás "qué diablos, ¿cómo es eso posible?". En efecto, suena bastante absurdo que un thread en ring 3 que intenta saltar al espacio de direcciones del núcleo pueda provocar una excepción no controlada dentro del ring-0 de Windows. Sin embargo incluso en el año 2013 Windows todavía es fragil en ciertas áreas y existen algunas vulnerabilidades que pueden ser explotadas mediante diversas técnicas...
 

Ésta en concreto, explicada por el gran Mateusz "j00ru" Jurczyk en su conferencia en la última NoSuchCon, se aprovecha de un bug en nt!KiTrap0E, el manejador por defecto de las excepciones de errores de página (#PF) en arquitecturas X86. 

El manejador confía en el campo KTRAP_FRAME.Ebp como un puntero válido en modo kernel cuando se procesan fallos en EIP específicos. Debido a que KTRAP_FRAME.SegCs no se comprueba correctamente (o mejor dicho no se comprueba), es posible elaborar un frame con un Eip controlado y el registro EBP en modo de usuario, lo que permite a un atacante local provocar una caída del sistema a través de una referencia a memoria no válida o revelar el bit menos significativo de cualquier byte en el espacio de direcciones del núcleo.

Código fuente de las pruebas de concepto: 
kitrap0e_bsod.zip (0.5kB, ZIP), kitrap0e_leak_bits.zip (1.4kB, ZIP) y kitrap0e_addr_space.zip (1.5kB, ZIP). Estos programas provocan un fallo del sistema operativo, permiten descubrir bits de la memoria del kernel y escanean el espacio de direcciones del kernel, respectivamente.

Fuentes:
NoSuchCon’13 and crashing Windows with two instructions
Abusing Windows NT #PF Trap Handler to Bugcheck and Leak Information

5 comentarios :

  1. y pensar que casi la mayoria utiliza windows sabiendo que cuenta con fallos de este tipo

    ResponderEliminar
  2. Muy chido, pero para un usuario final es lo de menos. Por eso y a pesar de los fallos Windows sigue siendo el S.O. más amigable.

    ResponderEliminar
  3. Isay imagina por un momento a un chino que desde pequeñito habla mandarín. A él le parece el lenguaje más amigable del mundo porque siempre lo ha usado, pero a ojos de un occidental es un lenguaje aparentemente complicadísimo y difícil de aprender...

    Lo mismo ocurre con Linux o con cualquier sistema operativo...

    No digo que uno sea mejor u otro sea peor, sólo que a la mayoría Windows le parece más amigable porque lo maneja desde hace tiempo y se siente cómodo con él.

    Pero piensa que por ejemplo hay gente que un SO sin entorno gráfico le puede parecer más amigable... ;)

    ResponderEliminar
    Respuestas
    1. Vale, pero por esa regla de tres, hay gente que siempre ha limpiado el suelo de rodillas, y cuando llegó aquel nuevo invento de ponerle un palo (fregona), mucha gente decía que no era "amigable", que de toda la vida se ha limpiado el suelo de rodillas porque siempre lo han hecho así de esa forma "amigable".

      Eliminar
    2. XDD no tiene que ver. Ponerle un palo añade la funcionalidad de poder fregar de pie. Si un sistema operativo añade nuevas funcionalidades es otro factor a parte de la usabilidad.

      Saludos!

      Eliminar