JIT-sprutning

JIT-sprayning är en klass av datorsäkerhetsexploatering som kringgår skyddet av randomisering av adressutrymmeslayout (ASLR) och dataexekveringsförebyggande (DEP) genom att utnyttja beteendet för just-in-time-kompilering . Det har använts för att utnyttja PDF - formatet och Adobe Flash .

En just-in-time kompilator (JIT) producerar per definition kod som dess data. Eftersom syftet är att producera körbar data är en JIT-kompilator en av få typer av program som inte kan köras i en miljö utan körbar data. På grund av detta är JIT-kompilatorer normalt undantagna från att förhindra dataexekvering. En JIT-sprayattack gör heap-sprayning med den genererade koden.

För att producera exploateringskod från JIT används en idé från Dion Blazakis. Inmatningsprogrammet, vanligtvis JavaScript eller ActionScript , innehåller vanligtvis många konstanta värden som felaktigt kan köras som kod. Till exempel XOR -operationen användas:

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

JIT kommer sedan att omvandla bytekod till inbyggd x86-kod som:

             0: b8 44 33 22 11   mov  xor eax xor 123 a 3 1 2 3 :   3 44   ,   $  0x11223344  ,  %eax   mov  eax  ,  0x11223344  5: 35 11 22 33 44  xor   $  0x44332211  %  eax   xor  $0x44332211  ,  %eax   xor  eax  ,  0x44332211 

Angriparen använder sedan en lämplig bugg för att omdirigera kodexekveringen till den nygenererade koden. Till exempel kan ett buffertspill eller användning efter fri bugg tillåta attacken att ändra en funktionspekare eller returadress.

Detta får CPU:n att exekvera instruktioner på ett sätt som var oavsiktligt av JIT-författarna. Angriparen är vanligtvis inte ens begränsad till de förväntade instruktionsgränserna; det är möjligt att hoppa in i mitten av en avsedd instruktion för att få CPU:n att tolka det som något annat. Precis som med icke-JIT ROP -attacker kan detta vara tillräckligt med operationer för att på ett användbart sätt ta kontroll över datorn. Om du fortsätter med exemplet ovan och hoppar till den andra byten av "mov"-instruktionen resulterar det i en "inc"-instruktion:

                                   1: 44   inc  %esp   inc  esp  2: 33 22   xor  (  %edx  ),  %esp     xor  esp  ,  DWORD  PTR  [  edx  ]   d43 2 20TR   d43  2  2    adc  DW 1   4  :  11 35 11 22 33 44   adc  %esi  ,  0x4433220TR  2 0TR   : 35 11 22 33 44   xor  $0x44332211  ,  %eax   xor  eax  ,  0x44332211 

Datorhårdvara som gör det möjligt att hoppa in i mitten av en instruktion inkluderar x86 , x86-64 och ARM . Även om det är särskilt effektivt på denna typ av hårdvara, fungerar JIT-sprutning även på andra system.

För att skydda mot JIT-sprayning kan JIT-koden inaktiveras eller göras mindre förutsägbar för angriparen.