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 .

To protect against JIT spraying, the JIT code can be disabled or made less predictable for the attacker.[4]

References

  1. Jürgen Schmidt (20 January 2011). "Return of the sprayer -- JIT Spraying: Exploits to beat DEP and ASLR". The H. Retrieved 22 January 2011.
  2. Haifei Li (10 February 2010). "JIT Spraying in PDF". Fortinet blog. Archived from the original on 18 April 2010. Retrieved 22 January 2011.
  3. Larry Seltzer (4 February 2010). "New "JIT Spray" Penetrates Best Windows Defenses". PCMag. Archived from the original on 28 January 2011. Retrieved 22 January 2011.
  4. 12Dion Blazakis. "Interpreter Exploitation. Pointer Inference and JIT Spraying"(PDF). Black Hat & Defcon 2010.; "Slides"(PDF).
  5. Alexey Sintsov (5 March 2010). "Writing JIT-Spray Shellcode For Fun And Profit". Packet Storm Security. Retrieved 30 January 2012.