oprysk JIT

Rozpylanie JIT to klasa exploitów bezpieczeństwa komputerowego , która omija ochronę randomizacji układu przestrzeni adresowej (ASLR) i zapobieganie wykonywaniu danych (DEP), wykorzystując zachowanie kompilacji just-in-time . Został wykorzystany do wykorzystania PDF i Adobe Flash .

Kompilator just-in-time (JIT) z definicji tworzy kod jako swoje dane. Ponieważ celem jest tworzenie danych wykonywalnych, kompilator JIT jest jednym z niewielu typów programów, których nie można uruchomić w środowisku bez danych wykonywalnych. Z tego powodu kompilatory JIT są zwykle wyłączone z zapobiegania wykonywaniu danych. Atak natryskowy JIT powoduje rozpylanie sterty z wygenerowanym kodem.

Do stworzenia kodu exploita z JIT wykorzystywany jest pomysł Diona Blazakisa. Program wejściowy, zazwyczaj JavaScript lub ActionScript , zwykle zawiera wiele stałych wartości, które mogą zostać błędnie wykonane jako kod. Na przykład można użyć operacji XOR :

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

Następnie JIT przekształci kod bajtowy w natywny kod x86, taki jak:

             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 

Następnie atakujący wykorzystuje odpowiedni błąd, aby przekierować wykonanie kodu do nowo wygenerowanego kodu. Na przykład przepełnienie bufora lub użycie po zwolnieniu błędu może umożliwić atakowi zmodyfikowanie wskaźnika funkcji lub adresu zwrotnego.

Powoduje to, że procesor wykonuje instrukcje w sposób niezamierzony przez autorów JIT. Atakujący zwykle nie jest nawet ograniczony do oczekiwanych granic instrukcji; możliwe jest wskoczenie w środek zamierzonej instrukcji, aby procesor zinterpretował ją jako coś innego. Podobnie jak w przypadku ataków innych niż JIT ROP , może to wystarczyć do skutecznego przejęcia kontroli nad komputerem. Kontynuując powyższy przykład, skok do drugiego bajtu instrukcji „mov” skutkuje instrukcją „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 

Sprzęt komputerowy, który umożliwia przeskakiwanie do środka instrukcji, obejmuje x86 , x86-64 i ARM . Chociaż jest to szczególnie skuteczne w przypadku tego typu sprzętu, natryskiwanie JIT działa również na innych systemach.

Aby zabezpieczyć się przed rozpylaniem JIT, kod JIT można wyłączyć lub uczynić mniej przewidywalnym dla atakującego.