Verwundbar trotz No Execute

Mit speziellen Techniken demonstriert Sebastian Krahmer von Suse, dass sich Buffer-Overflows durchaus auch auf modernen 64-Bit-Systemen mit No-Execute-Schutz ausnutzen lassen.

In Pocket speichern vorlesen Druckansicht 470 Kommentare lesen
Lesezeit: 2 Min.
Von
  • Andreas Stiller

Dass das No-Execute-Feature modernerer x86-Prozessoren nicht wirklich vor Buffer-Overflow-Exploits schützt, hat im Grundsatz schon c't mit dem Delphi-Programm nxtest [aus Hacker-Blocker in Ausgabe 16/2004] sowie der erste Return-to-libc-Exploit für 32-Bit-Betriebssysteme aufgezeigt. No Execute verhindert lediglich, dass man Code in Datensegementen (Stack, Heap ...) ausführen kann, den Overflow selbst verhindert es nicht und wenn man hier einen Sprung irgendwohin ins Codesegment provoziert, kann No Execute nichts dagegen tun.

Allerdings sind vor einem funktionierenden Exploit ein paar Hürden zu überwinden. Auf 32-Bit-Systemen ist es in der Regel besonders einfach, gezielt eine Systemfunktion mit Parametern aufzurufen, da die Aufrufparameter ebenfalls über den Stack übergeben werden, den man per Overflow beliebig manipulieren kann. Bei den 64-Bit-Betriebssystemen werden üblicherweise jedoch die Prozessorregister für die Parameterübergabe verwendet, und die lassen sich nicht durch Überläufe passend befüllen -- jedenfalls nicht direkt.

Sebastian Krahmer von Suse hat nun aber gezeigt, wie man mit ein paar zusammengesuchten Codefragmenten aus Standardbibliotheken beliebige Register mit den Overflow-Werten vorbesetzen und damit auch unter 64bittigem Linux eine gewünschte Routine mit den eigenen Parametern anspringen kann. Er nannte die Methode "Code Chunk Borrow Technique". Die missbrauchten kurzen Codesequenzen müssen nicht einmal als korrekte Befehlsfolge im Gastcode auftreten, wie beispielsweise pop %rdi; retq. Es reicht wenn irgendwo die Hex-Sequenz (hier 0x5f und 0xc3) vorkommt, etwa als Bestandteil eines längeren Befehls beziehungsweise als Offset etc.

Sogar einen automatischen Exploit-Generator stellt er vor, der alle benötigten Codefragmente aufsucht und die Einsprungadressen passend für den Overflow zusammenstellt. Darüber hinaus belegt Krahmer, dass man Techniken zum Ausnutzen von Heap-Overflows oder Format-String-Bugs in der Regel auf einen Stackoverflow übertragen kann. Sein Demo-Programm benutzt die als malloc overflow bekannte Methode, durch Überschreiben interner Speicherkontrollstrukturen beim Heap-Overflow beliebige 64-Bit-Werte an eine beliebigen 64-Bit-Adresse zu schreiben und vereint diese mit der "Code Chunk Borrow Technique".

Es wird sich nun zeigen, ob AMD noch länger an der werbewirksamen Bezeichnung "Enhanced Virus Protection" für das No-Execute-Feature festhalten wird. (as)