Vés al contingut

JIT spraying

De la Viquipèdia, l'enciclopèdia lliure

La polvorització JIT és una classe d'explotació de seguretat informàtica que eludeix la protecció de l'aleatorització del disseny de l'espai d'adreces i la prevenció de l'execució de dades mitjançant l'explotació del comportament de la compilació just-in-time.[1] S'ha utilitzat per explotar el format PDF [2] i Adobe Flash.[3]

Un compilador just-in-time (JIT) per definició produeix codi com a dades. Com que el propòsit és produir dades executables, un compilador JIT és un dels pocs tipus de programes que no es poden executar en un entorn sense dades executables. Per això, els compiladors JIT normalment estan exempts de la prevenció de l'execució de dades. Un atac d'aerosol JIT fa ruixat en pila amb el codi generat.

Per produir codi d'explotació a partir de JIT, s'utilitza una idea de Dion Blazakis. El programa d'entrada, normalment JavaScript o ActionScript, normalment conté nombrosos valors constants que es poden executar erròniament com a codi. Per exemple, es podria utilitzar l'operació XOR : [4]

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

Aleshores, JIT transformarà el codi de bytes en codi x86 natiu com:

0: b8 44 33 22 11 mov $0x11223344,%eax mov eax,0x11223344

5: 35 11 22 33 44 xor $0x44332211,%eax xor eax,0x44332211

a: 35 11 22 33 44 xor $0x44332211,%eax xor eax,0x44332211


Aleshores, l'atacant utilitza un error adequat per redirigir l'execució del codi al codi generat recentment. Per exemple, un desbordament de memòria intermèdia o un ús després d'un error lliure podria permetre que l'atac modifiqui un punter de funció o una adreça de retorn.

Això fa que la CPU executi instruccions d'una manera no desitjada pels autors del JIT. L'atacant normalment ni tan sols es limita als límits d'instrucció esperats; és possible saltar al mig d'una instrucció prevista perquè la CPU la interpreti com una altra cosa. Igual que amb els atacs ROP que no són JIT, aquestes operacions poden ser suficients per prendre el control de l'ordinador de manera útil. Continuant amb l'exemple anterior, saltar al segon byte de la instrucció "mov" dona com a resultat una instrucció "inc":

1: 44 inc %esp inc esp

2: 33 22 xor (%edx),%esp xor esp,DWORD PTR [edx]

4: 11 35 11 22 33 44 adc %esi,0x44332211 adc DWORD PTR ds:0x44332211,esi

a: 35 11 22 33 44 xor $0x44332211,%eax xor eax,0x44332211

x86 i x86-64 permeten saltar al centre d'una instrucció, però no arquitectures de longitud fixa com ARM .

Per protegir-se de la polvorització JIT, el codi JIT es pot desactivar o fer menys previsible per a l'atacant.


Referències[modifica]

  1. Jürgen Schmidt. «Return of the sprayer -- JIT Spraying: Exploits to beat DEP and ASLR» (en anglès). The H, 20-01-2011. [Consulta: 22 gener 2011].
  2. Haifei Li. «JIT Spraying in PDF» (en anglès). Fortinet blog, 10-02-2010. Arxivat de l'original el 18 April 2010. [Consulta: 22 gener 2011].
  3. Larry Seltzer. «New "JIT Spray" Penetrates Best Windows Defenses» (en anglès). PCMag, 04-02-2010. Arxivat de l'original el 28 de gener 2011. [Consulta: 22 gener 2011].
  4. Alexey Sintsov. «Writing JIT-Spray Shellcode For Fun And Profit» (en anglès). Packet Storm Security, 05-03-2010. [Consulta: 30 gener 2012].