Articulo de referencia

Pulverización JIT

El ataque JIT es una clase de vulnerabilidad de seguridad informática que elude la protección de la aleatorización del espacio de direcciones y la prevención de la ejecución de ...

El ataque JIT es una clase de vulnerabilidad de seguridad informática que elude la protección de la aleatorización del espacio de direcciones y la prevención de la ejecución de datos mediante la explotación del comportamiento de la compilación justo a tiempo . [ 1 ] Se ha utilizado para explotar el formato PDF [ 2 ] y Adobe Flash . [ 3 ]

Un compilador justo a tiempo (JIT), por definición, genera código como datos. Dado que su propósito es producir datos ejecutables, un compilador JIT es uno de los pocos tipos de programas que no pueden ejecutarse en un entorno sin datos ejecutables. Por ello, los compiladores JIT suelen estar exentos de la prevención de ejecución de datos. Un ataque de pulverización JIT realiza una pulverización de memoria dinámica (heap spraying) con el código generado.

Para generar código de explotación a partir de JIT, se utiliza una idea de Dion Blazakis [ 4 ] . El programa de entrada, generalmente JavaScript o ActionScript , suele contener numerosos valores constantes que pueden ejecutarse erróneamente como código. Por ejemplo, se podría utilizar la operación XOR : [ 5 ]

var a = ( 0x11223344 ^ 0x44332211 ^ 0x44332211 ^ ...);

JIT transformará entonces el código de bytes en código nativo x86 como:

0: b8 44 33 22 11 5: 35 11 22 33 44 a: 35 11 22 33 44 mov$0x11223344,%eaxmoveax,0x11223344xor$0x44332211,%eaxxoreax,0x44332211xor$0x44332211,%eaxxoreax,0x44332211

El atacante utiliza entonces un error de programación adecuado para redirigir la ejecución del código hacia el código recién generado. Por ejemplo, un desbordamiento de búfer o un error de uso de memoria liberada podría permitir al atacante modificar un puntero de función o la dirección de retorno.

Esto provoca que la CPU ejecute instrucciones de una forma no prevista por los autores del JIT. El atacante normalmente ni siquiera se limita a los límites de las instrucciones esperadas; es posible saltar a la mitad de una instrucción prevista para que la CPU la interprete como algo distinto. Al igual que con los ataques ROP que no utilizan JIT , estas operaciones pueden ser suficientes para tomar el control del ordenador. Siguiendo con el ejemplo anterior, saltar al segundo byte de la instrucción "mov" da como resultado una instrucción "inc":

1: 44 2: 33 22 4: 11 35 11 22 33 44 a: 35 11 22 33 44 inc%espincespxor(%edx),%espxoresp,DWORDPTR[edx]adc%esi,0x44332211adcDWORDPTRds:0x44332211,esixor$0x44332211,%eaxxoreax,0x44332211

Las arquitecturas x86 y x86-64 permiten saltar a la mitad de una instrucción, pero no las arquitecturas de longitud fija como ARM .

Para protegerse contra el ataque de pulverización JIT, el código JIT puede deshabilitarse o hacerse menos predecible para el atacante. [ 4 ]

Referencias

  1. Jürgen Schmidt (20 de enero de 2011). "El regreso del pulverizador: pulverización JIT: estrategias para vencer al DEP y al ASLR" . The H. Consultado el 22 de enero de 2011 .
  2. Haifei Li (10 de febrero de 2010). "JIT Spraying en PDF" . Blog de Fortinet. Archivado del original el 18 de abril de 2010. Recuperado el 22 de enero de 2011 .
  3. Larry Seltzer (4 de febrero de 2010). "El nuevo 'JIT Spray' penetra las mejores defensas de Windows" . PCMag . Archivado del original el 28 de enero de 2011. Consultado el 22 de enero de 2011 .
  4. 1 2 Dion Blazakis. "Explotación de intérpretes. Inferencia de punteros y pulverización JIT" (PDF) . Black Hat & Defcon 2010.; "Diapositivas" (PDF) .
  5. Alexey Sintsov (5 de marzo de 2010). "Escribiendo JIT-Spray Shellcode por diversión y beneficio" . Packet Storm Security . Recuperado el 30 de enero de 2012 .