stringtranslate.com

Pulverización JIT

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 44 mov $0x11223344,%eax mov eax,0x11223344xor $0x44332211,%eax xor eax,0x44332211xor $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 44 inc %esp inc espxor (%edx),%esp xor esp,DWORD PTR [edx]adc %esi,0x44332211 adc DWORD PTR ds:0x44332211,esixor $0x44332211,%eax xor eax,0x44332211

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 la pulverización JIT, el código JIT se puede desactivar o hacer que sea menos predecible para el atacante. [4]

Referencias

  1. ^ Jürgen Schmidt (20 de enero de 2011). "El regreso de la pulverizadora - Pulverización JIT: Exploits para vencer a DEP y ASLR". The H . Consultado el 22 de enero de 2011 .
  2. ^ Haifei Li (10 de febrero de 2010). "JIT Spraying in PDF". Blog de Fortinet. Archivado desde el original el 18 de abril de 2010. Consultado 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 desde el original el 28 de enero de 2011 . Consultado el 22 de enero de 2011 .
  4. ^ por 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). "Writing JIT-Spray Shellcode For Fun And Profit" (Escribir código shell con JIT-Spray por diversión y beneficio). Packet Storm Security . Consultado el 30 de enero de 2012 .