JIT-Sprühen - JIT spraying

JIT-Sprühen ist eine Klasse von Computersicherheits-Exploits , die den Schutz der Adressraum-Layout-Randomisierung (ASLR) und der Verhinderung der Datenausführung (DEP) umgehen, indem das Verhalten der Just-in-Time-Kompilierung ausgenutzt wird . Es wurde verwendet, um das PDF- Format und Adobe Flash zu nutzen .

Ein Just-in-Time-Compiler (JIT) erzeugt per Definition Code als Daten. Da der Zweck darin besteht, ausführbare Daten zu erzeugen, ist ein JIT-Compiler eine der wenigen Arten von Programmen, die in einer Umgebung ohne ausführbare Daten nicht ausgeführt werden können. Aus diesem Grund sind JIT-Compiler normalerweise von der Verhinderung der Datenausführung ausgenommen. Ein JIT- Sprühangriff besprüht den generierten Code mit Haufen .

Um Exploit-Code aus JIT zu erstellen, wird eine Idee von Dion Blazakis verwendet. Das Eingabeprogramm, normalerweise JavaScript oder ActionScript , enthält normalerweise zahlreiche konstante Werte, die fälschlicherweise als Code ausgeführt werden können. Zum Beispiel könnte die XOR- Operation verwendet werden:

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

JIT wandelt dann Bytecode in nativen x86-Code um, wie:

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

Der Angreifer verwendet dann einen geeigneten Fehler, um die Codeausführung in den neu generierten Code umzuleiten. Beispielsweise könnte ein Pufferüberlauf oder die Verwendung nach einem freien Fehler dem Angriff ermöglichen, einen Funktionszeiger oder eine Rücksprungadresse zu ändern .

Dies führt dazu, dass die CPU Anweisungen auf eine Weise ausführt, die von den JIT-Autoren nicht beabsichtigt war. Der Angreifer ist normalerweise nicht einmal auf die erwarteten Anweisungsgrenzen beschränkt. Es ist möglich, in die Mitte eines beabsichtigten Befehls zu springen, damit die CPU ihn als etwas anderes interpretiert. Wie bei Nicht-JIT- ROP- Angriffen kann dies ausreichen, um die Kontrolle über den Computer zu übernehmen. Wenn Sie das obige Beispiel fortsetzen und zum zweiten Byte des Befehls "mov" springen, erhalten Sie einen Befehl "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

Computerhardware, mit der Sie in die Mitte eines Befehls springen können, umfasst x86 , x86-64 und ARM . Obwohl das JIT-Sprühen auf dieser Art von Hardware besonders effektiv ist, funktioniert es auch auf anderen Systemen.

Zum Schutz vor JIT-Sprühen kann der JIT-Code deaktiviert oder für den Angreifer weniger vorhersehbar gemacht werden.

Verweise