La pulverización JIT es una clase de vulnerabilidad de seguridad informática que elude la protección de la aleatorización del diseño del espacio de direcciones y la prevención de la ejecución de datos explotando el 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 produce código como sus datos. Dado que el propósito es producir datos ejecutables, un compilador JIT es uno de los pocos tipos de programas que no se pueden ejecutar en un entorno sin datos ejecutables. Debido a esto, los compiladores JIT normalmente están exentos de la prevención de ejecución de datos. Un ataque de pulverización JIT realiza una pulverización de pila 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, normalmente 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 ^ ...);
Luego, JIT transformará el código de bytes en código x86 nativo como:
0:b8 44 33 22 11 5:35 11 22 33 44 a:35 11 22 33 44mov $0x11223344,%eax
mov eax,0x11223344
xor $0x44332211,%eax
xor eax,0x44332211
xor $0x44332211,%eax
xor eax,0x44332211
El atacante utiliza entonces un error adecuado para redirigir la ejecución del código al código recién generado. Por ejemplo, un desbordamiento de búfer o un error de uso después de una liberación podrían permitir que el ataque modifique un puntero de función o una dirección de retorno.
Esto hace que la CPU ejecute instrucciones de una manera que no fue prevista por los autores del JIT. El atacante normalmente ni siquiera está limitado a los límites de instrucción esperados; es posible saltar al medio de una instrucción prevista para que la CPU la interprete como otra cosa. Al igual que con los ataques ROP que no son JIT , estas pueden ser operaciones suficientes para tomar el control de la computadora de manera útil. Continuando 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 44inc %esp
inc esp
xor (%edx),%esp
xor esp,DWORD PTR [edx]
adc %esi,0x44332211
adc DWORD PTR ds:0x44332211,esi
xor $0x44332211,%eax
xor eax,0x44332211
x86 y x86-64 permiten saltar al medio de una instrucción, pero no las arquitecturas de longitud fija como ARM .
Para protegerse contra la pulverización JIT, el código JIT se puede desactivar o hacer que sea menos predecible para el atacante. [4]