2010-10-03 13 views
6

Ich habe die Theorie gehört. Adressraum-Standort-Randomisierung nimmt Bibliotheken und lädt sie an zufälligen Orten im virtuellen Adressraum, so dass, falls ein Hacker ein Loch in Ihrem Programm findet, er keine vorbekannte Adresse hat, um einen Rückkehr-zu-libc-Angriff auszuführen gegen zum Beispiel. Aber nachdem ich ein paar Sekunden darüber nachgedacht habe, macht es keinen Sinn als Verteidigungsmaßnahme.Wie kann ASLR effektiv sein?

Nehmen wir an, dass unsere hypothetische TargetLib (libc oder irgendetwas anderes, nach dem der Hacker sucht) an einer zufälligen Adresse statt an einer deterministischen Adresse geladen wird. Nun weiß der Hacker nicht mehr, wo TargetLib und die darin enthaltenen Routinen sind, aber auch nicht der Anwendungscode. Es muss irgendeine Art von Nachschlagetabelle irgendwo in der Binärdatei haben, um die Routinen innerhalb von TargetLib zu finden, und das muss an einer deterministischen Position sein. (Oder an einem zufälligen Ort, auf den etwas anderes zeigt. Sie können so viele Umleitungen hinzufügen, wie Sie möchten, aber schließlich müssen Sie an einem bekannten Ort beginnen.)

Dies bedeutet, dass anstatt seinen Angriffscode auf die Bekannter Standort von TargetLib. Der Hacker muss lediglich seinen Angriffscode auf den Eintrag der Referenztabelle der Anwendung für TargetLib zeigen und den Zeiger auf die Zielroutine dereferenzieren, und der Angriff verläuft ungehindert.

Gibt es etwas über die Art, wie ASLR funktioniert, die ich nicht verstehe? Denn wie beschrieben, sehe ich nicht, dass es mehr ist als eine Geschwindigkeitsbegrenzung, die das Bild der Sicherheit liefert, aber keine tatsächliche Substanz. Fehle ich etwas?

Antwort

2

Ich glaube, dass dies effektiv ist, weil es die Basisadresse der gemeinsam genutzten Bibliothek ändert. Denken Sie daran, dass importierte Funktionen aus einer gemeinsam genutzten Bibliothek beim Laden in Ihr ausführbares Abbild gepatcht werden. Daher gibt es keine Tabelle per se, sondern nur bestimmte Adressen, die auf Daten und Code verweisen, die im Programmcode verstreut sind.

Es stellt die Messlatte für einen effektiven Angriff höher, weil es einen einfachen Pufferüberlauf (wo die Rücksprungadresse auf dem Stapel gesetzt werden kann) zu einem macht, wo der Überlauf den Code enthalten muss, um den richtigen Ort und dann jmp zu bestimmen . Vermutlich macht es das nur schwieriger.

Praktisch alle DLLs in Windows sind für eine Basisadresse kompiliert, auf der sie wahrscheinlich nicht ausgeführt werden, und werden trotzdem verschoben, aber die Windows-Kerndateien sind tendenziell so optimiert, dass die Verschiebung nicht erforderlich ist.

+1

Haben Sie jemals eine Windows EXE auf ASM-Ebene getestet? Da ist eine echte Import-Tabelle drin. Der Ladeprogramm packt den Code nicht (alle Stellen, an denen Ihr Code eine externe Routine aufruft), er patcht die Importtabelle, was im Grunde eine lange Folge von JMP-Anweisungen ist, an die der Compiler CALLs generiert. –

+0

Es ist nicht nur gemeinsame Speicher ... – rook

+0

@Mason Wheeler - nicht für eine lange Weile, aber das ist gut zu wissen. Während das macht es einfacher, eine bestimmte Adresse zu bestimmen, ist der Nettoeffekt gleich, nicht wahr? Es verändert ein bekanntes zu einem unbekannten, was den Angriff einfach erschwert. –

1

Ich weiß nicht, ob Sie Frage richtig bekommen, aber ich werde erklären, wann ASLR wirksam ist und wann nicht.

Nehmen wir an, wir haben app.exe und TargetLib.dll. app.exe verwendet (verknüpft mit) TargetLib.dll. Um die Erklärung einfach zu machen, nehmen wir an, dass der virtuelle Adressraum nur diese 2 Module hat.

Wenn beide ALSR aktiviert sind, ist die Basisadresse von app.exe unbekannt. Es kann einige Funktionsaufrufadressen auflösen, wenn es geladen wird, aber ein Angreifer weiß weder, wo sich die Funktion befindet, noch wo sich die aufgelösten Variablen befinden. Das gleiche passiert, wenn TargetLib.dll geladen wird. Auch wenn app.exe eine Nachschlagetabelle enthält, weiß ein Angreifer nicht, wo sich die Tabelle befindet.

Da ein Angreifer nicht wissen kann, was der Inhalt einer bestimmten Adresse ist, muss er die Anwendung angreifen, ohne feste Adressinformationen zu verwenden. Es ist normalerweise schwieriger, wenn er übliche angreifende Methode wie Stapelüberlauf, Heapüberlauf, Gebrauch-nach-freiem ...

verwendet. Wenn app.exe nicht ASLR aktiviert ist, ist es für einen Angreifer viel einfacher um die Anwendung auszunutzen. Weil es einen Funktionsaufruf zu einer interessanten API an einer bestimmten Adresse in der App geben kann.exe und der Angreifer können die Adresse als Zieladresse verwenden, um zu springen. (Ein Angriff auf eine Anwendung beginnt normalerweise damit, zu einer beliebigen Adresse zu springen.).

Ergänzung: Sie können es bereits verstehen, aber ich möchte eine Sache klar machen. Wenn ein Angreifer eine Anwendung wie eine Speicherbeschädigung durch eine Sicherheitslücke ausnutzt, muss er normalerweise fixed address jump instruction verwenden. Sie können relative address jump Anweisungen nicht ausnutzen. Dies ist der Grund, warum ALSR für solche Exploits wirklich effektiv ist.

+0

Alles in Ordnung. Es ist der letzte Punkt, den ich nicht ganz verstehe. Warum kann ein Angreifer 'festen Adresssprung 'verwenden (was ein ASM-Opcode ist), aber nicht' relativen Adresssprung '(was nur ein anderer ASM-Opcode ist)? Gibt es dort einen magischen Unterschied, den ich nicht kenne? –

+1

Nun, um es zu erklären, verstehen Sie zuerst, wie ein solcher Exploit funktioniert. Ein gutes Beispiel ist der typische Pufferüberlauf und das Überschreiben der Rückadresse. Ich erkläre das Detail hier nicht, aber der Hauptpunkt ist, dass ein Angreifer die Rückkehradresse mit einem festen Wert überschreibt. Wenn der Ausführungsfluss die anfällige Funktion verlässt, springt er zur überschriebenen Adresse. Dieser Sprung ist immer "fester Adresssprung" und kein "relativer Sprung". Es kann einige Sicherheitslücken geben, die Sie verwenden können, um den relativen Sprung zu nutzen, aber sie sind selten. –

+1

Mit anderen Worten, ein Angreifer kann nur "Daten", nicht "Anweisungen" verfälschen. Um eine App auszunutzen, korrumpieren sie "Daten", die von der Anweisung "fester Adresssprung" verwendet werden. Was ein Angreifer tut, ist das Extrahieren von Shellcode (Code, den sie ausführen wollen) und das Springen zum Shellcode. Im Shellcode können sie relative Sprünge verwenden, aber unter ASLR-Umständen ist das Springen zum Shellcode selbst ein schwieriges Problem. –