Einleitung

Der Browser ist nach wie vor eines der beliebtesten Angriffsziele für Hacker, denn er ist weit verbreitet und ein Angriff über eine Vielzahl von Techniken durchführbar. Sicherheitslücken und Exploits für Browser haben auf dem Schwarzmarkt einen sehr hohen Wert und sind in der Öffentlichkeit meistens erst dann zugänglich, wenn bereits durch den Hersteller ein Sicherheitsupdate eingespielt wurde.

Aktuelle Browser-Software informiert den Benutzer über Sicherheitsupdates und spielt diese automatisch ein. Dennoch sind immer wieder Zero-Day-Exploits im Umlauf, welche dem Hersteller nicht bekannt sind.

Eines der größten Probleme ist hier, dass die Bezahlung für Zero-Day-Exploits auf dem Schwarzmarkt meistens wesentlich besser ausfällt als die des Herstellers, sodass jeder Sicherheitsexperte an dieser Stelle vor eine moralische Entscheidung gestellt wird.

Oft werden mehrere Wochen oder Monate an Forschungsarbeit benötigt, um eine Schwachstelle in einer aktuellen und weit verbreiteten Software aufzuspüren, welche im Normalfall schon diverse Sicherheitsüberprüfungen hinter sich hatte.

Welche Bezahlung für diese Arbeit fair erscheint, kann hier jeder für sich selbst entscheiden. Aber gelangt ein derartiger Exploit auf den Schwarzmarkt, dann wird dadurch eine globale Bedrohung ausgelöst.

Auswirkungen eines Browser-Angriffs

Ein erfolgreicher, speicherbasierter Angriff auf den Browser führt in der Regel zur kompletten Kompromittierung der Privatsphäre des Opfers. Das bedeutet:

  • Verlust der Kontrolle über sämtliche Accounts (Facebook, Twitter, Google, etc.)
  • Aushebeln von Sicherheitsmaßnahmen -> Spionage (versteckte Aktivierung von Webcam und/oder Mikrofon)
  • Aushebeln der Firewall -> Kommunikation mit Angreifer
  • Permanente Kontrolle über alle Dateien und Tastatureingaben
  • Permanente Überwachung von Telefongesprächen, SMS und WhatsApp Nachrichten
  • Fernsteuerung von Geräten
  • Ortung und Standortüberwachung
  • Bei speziellen Geräten: Extraktion des Fingerabdrucks

Alle Kanäle können sowohl abgehört, als auch manipuliert oder zu weiteren Angriffen wie beispielsweise der Verbreitung eines Virus oder Wurms genutzt werden.

Durch den direkten Missbrauch von Cookies kann der Angriff mit einer viralen Verbreitung ausgeführt werden, bei welcher sämtliche Kontakte des Opfers in sozialen Netzwerken wie Facebook, Twitter, Google, etc. angesteckt werden. Diese stecken dann wiederrum ihre eigenen Kontakte an, und so weiter. Der Vorgang kann auch unauffällig im Hintergrund durchgeführt werden.

Danach kann die Attacke automatisch die Konten des Opfers deaktivieren oder die Passwörter ändern, um die Defensive zu erschweren.

Gespeicherte Inhaltslizenzen wie beispielsweise von Flash oder Java können dazu missbraucht werden, um die Daten des Benutzers auszuspähen und beispielsweise die Webcam oder das Mikrofon mitzuschneiden und an den Angreifer unbemerkt zu übertragen.

Darüber hinaus hat der Angreifer nach einer erfolgreichen Kompromittierung die volle Kontrolle über das gesamte Gerät des Opfers (PC, Tablet, Smartphone) und kann somit auch Spähsoftware und Malware permanent auf dem Gerät installieren, unabhängig von den Inhaltslizenzen des Browsers.

Der Angreifer kann nach einer erfolgreichen Browser-Attacke nicht nur Daten abfangen und ausspionieren, sondern auch manipulieren, sabotieren und entfernen.

Das bedeutet beispielsweise, dass der Angreifer alle Informationen auf dem kompromittierten Gerät ändern kann – darunter Webseiten, Dateien, Fotos, SMS, etc. Zusätzlich lassen sich ganze Telefongespräche manipulieren sofern ein Smartphone kompromittiert wurde.

Um all diese Angriffe durchzuführen, muss der Angreifer dem Opfer lediglich einen Link unterjubeln. Das macht einen Browser-Angriff sowohl für den digitalen Untergrund, als auch für Geheimdienste und natürlich für die Hersteller sehr interessant und wertvoll.

Aber was steckt technisch dahinter? Wie lassen sich Schwachstellen in Web-Browsern aufspüren, und wie kann man die Hersteller bestmöglich dabei unterstützen? In den nächsten Abschnitten wird erklärt, wie man dieses Problem praktisch angeht.

Browser Ninjutsu: Schwachstellen automatisch aufspüren

Ende 2013 entwickelte ich das freie Tool bamboo.js, ein Framework basierend auf JavaScript und Ruby welches Schwachstellen in Browsern aufspürt indem es vollständig automatisiert Speicherkorruptionen erzeugt. Der Fokus liegt hier bei dem DOM-Rendering.

Dazu werden semi-zufällige DOM-Sequenzen in Abhängigkeit von anderen, dynamisch erzeugten Sequenzen generiert und somit permanente Mutationen im DOM durchgeführt. Durch den unerwarteten Code kommt es zu einer Fehlfunktion innerhalb der Speicherverwaltung des Browsers und der Prozess stürzt ab.

Löst eine der erzeugten Mutationen einen Absturz aus, dann wird dieser gesichert und zur weiteren Analyse bereitgestellt. Ein Absturz ist ein Indiz auf eine Speicherkorruption, und bei der manuellen Analyse kann festgestellt werden, ob diese Speicherkorruption ausnutzbar ist.

Der Algorithmus nimmt die Menge aller existenten Elemente im DOM, selektiert prozentual verschiedene Elemente und mutiert, verknüpft und kombiniert diese sowohl mit selbst erzeugten als auch mit bereits vorhandenen Elementen.

Dabei kommen auch untypische Verknüpfungen und Mutationen zustande, bei denen Parameter unterschiedlicher und völlig verschiedener Objekte vertauscht, verknüpft, überschrieben oder neu zugewiesen werden.

Durch die amorphe Veränderung der DOM-Struktur entstehen teilweise fehlgeformtes JIT- / Rendering- / oder Parsing-Sequenzen welche im Optimalfall eine Speicherkorruption auslösen. Bei dieser Methode werden DOM-Elemente, Node-Filter sowie Event-Handler in den Fuzzing-Prozess integriert.

Um einen durch den Fuzzing-Prozess erzeugte Absturz sinnvoll zu nutzen manipuliert der Angreifer den Programmablauf so, dass der unerwartete Code nicht mehr eine Fehlfunktion aufruft und somit einen Absturz auslöst, sondern die Funktion des Angreifers aufruft und dieser somit den Programmablauf vollständig unter Kontrolle hat. Dazu wird das Debugging benötigt.

Debugging

Konnte durch das Fuzzing eine Speicherkorruption identifiziert werden, wird diese durch bamboo.js in einer Log-Datei gesichert. Im nächsten Schritt muss manuell analysiert werden, was die Ursache der Speicherkorruption ist, und ob diese sich zur Ausführung von Schadcode ausnutzen lässt.

Dazu muss eine Absturzanalyse durchgeführt werden. Zusätzlich kann durch die Absturzanalyse eine Klassifikation der Schwachstelle getroffen werden. Typische Klassifikationen sind an dieser Stelle:

  • Stack-Overflow
  • Heap-Overflow
  • Use-After-Free / Dangling Pointer
  • Double Free

Zu Beginn der Analyse wird die Funktion disassembliert, welche für die Speicherkorruption verantwortlich ist. Die Funktion lässt sich im Call-Stack über den Debugger identifizieren.

Bei einem Open-Source-Browser wie Firefox empfiehlt es sich nach der Identifikation der betroffenen Funktion diese anhand des Quellcodes zu analysieren. Andernfalls muss hier Reverse Engineering angewendet werden.

Durch die Disassemblierung der Applikation lässt sich in den meisten Fällen relativ schnell eine Einschätzung treffen, ob die Schwachstelle ausnutzbar ist oder nicht.

Die folgenden Indizien beweisen eine Ausnutzbarkeit der Speicherkorruption:

  • Der EIP (Extended Instruction Pointer) wurde überschrieben oder anderweitig unter Kontrolle gebracht
  • Der Prozess liest aus einem Speicherbereich, der für uns beschreibbar ist
  • Der Prozess schreibt in einem Speicherbereich, der für uns lesbar ist
  • Der Programmfluss lässt sich anderweitig sabotieren und auf eigene MemoryGadgets lenken (ROP)

Folgende Indizien sprechen hingegen gegen eine Ausnutzbarkeit:

  • Der Absturz wurde durch den Browser abgefangen und gesäubert (Clean Exit)
  • Der Prozess liest von einem NULL-Pointer (0x00000000)
  • Der Prozess schreibt an einen NULL-Pointer

Das bedeutet, sofern sich der Programmfluss gezielt sabotieren lässt, lässt sich die Schwachstelle für die Ausführung von Code ausnutzen. Wird der Absturz jedoch sicher durch den Browser abgefangen, säubert dieser den Speicher und beendet den Prozess, was gegen eine Ausnutzbarkeit spricht.

Auch wenn die Absturzursache das Lesen oder Schreiben von oder zu einem NULL-Pointer ist (typischerweise bei einer durch den Browser erkannten Auslastung des zugeteilten Speichers), spricht dies in den meisten Fällen gegen eine Ausnutzbarkeit der Schwachstelle.

An dieser Stelle sollte auch noch erwähnt werden, dass nicht jede Speicherkorruption einen Absturz des Prozesses verursacht. Um Speicherkorruptionen zu erkennen, welche keinen Prozessabsturz zur Folge haben, eignet sich das von Google entwickelte Debugging-Tool AddressSanitizer, welches zur Analyse von Software-Fehlern dient.

Darüber hinaus haben die meisten modernen Betriebssysteme implementierte Defensivmaßnahmen gegen die Ausnutzung von Speicherkorruptionen. Die bekanntesten Maßnahmen sind an dieser Stelle ASLR (Address Space Layout Randomization) und DEP (Data Execution Prevention).

Als Angreifer muss man in den meisten Fällen diese beiden Schutzmaßnahmen umgehen, um erfolgreich Code ausführen zu können. Bei Windows kommt beispielsweise EMET zum Einsatz, welches zusätzlich noch mit SEHOP die Überschreibung des Ausnahmehandlers schützt, welche im Normalfall eine weitere Angriffsmöglichkeit bietet.

ASLR ist auch als Speicherverwürfelung bekannt, und sorgt dafür, dass die Speicheradressen bei jeder Ausführung der Applikation randomisiert werden. Diese Technik erwies sich als ineffizient, als bekannt wurde, dass sie sich mit verschiedenen Tricks umgehen lässt.

Beispielsweise die Wiederverwendung von statisch gelinkten Bibliotheken im Speicher.

Die effektivste Angriffsmöglichkeit welche sich diese Methode zunutze macht ist ROP (Return-Oriented-Programming). ROP ist eine Technik, welche vorhandene Instruktionen im Speicher nutzt, um den Programmfluss auf den eigenen Code zu lenken und dabei ggf. vorhandene Schutzmechanismen auszuhebeln.

Durch die Wiederverwendung von vorhandenen Fragmenten der statisch gelinkten Bibliothek lässt sich somit durch eine clevere Kombination der bereits existenten Instruktionen eigener Code ausführen. Dabei wird in vielen Fällen gleichzeitig die DEP ausgetrickst, andernfalls lassen sich über ROP Teile des Speichers wieder ausführbar machen (beispielsweise durch die Verwendung der Funktionen VirtualProtect und WriteProcessMemory).

In den meisten Fällen reicht es allerdings, einen Proof-of-Concept-Exploit an den Hersteller zu senden, bei dem der EIP beispielsweise auf einen durch den Angreifer definierten Wert gesetzt wird, um die Ausnutzbarkeit zu beweisen.

Fazit

Die Suche nach Browser-Schwachstellen ist digitales Goldschürfen. Abgesehen von den 6-stelligen Belohnungen ist die Schwachstelle an sich wesentlich wertvoller – was eine große Gefahr für alle Nutzer darstellt. Über einen Browser-Angriff lassen sich mehrere Millionen Geräte in kürzester Zeit unter Kontrolle bringen.

Umso wichtiger ist es, die Hersteller bei der Identifikation und Lösung dieser Probleme zu unterstützen und neue Ansätze zu finden, um die Defensive gegen Browser-Angriffe zu stabilisieren.

Insgesamt existieren vier interessante Rendering-Engines, welche zur Analyse geeignet sind:

  • WebKit (Chrome, Safari)
  • Trident (Internet Explorer)
  • Gecko (Firefox)
  • Presto (Opera)

Darüber hinaus unterscheiden sich die Browser auch in den JavaScript-Engines. Darunter sind ebenfalls vier relevant:

  • Rhino (Firefox)
  • Nitro (Safari)
  • V8 (Chrome)
  • Chakra (Internet Explorer)

Die Javascript-Engines sind dafür zuständig, JavaScript in JIT-Code umzuwandeln und auszuführen und lassen sich auch unabhängig vom Browser installieren, sodass man hier beispielsweise die Möglichkeit hat, über die Konsole zu testen, was eine effizientere und schnellere Lösung darstellt.

Allerdings ist – wie immer beim Bughunting – meistens ein großes Maß an Kreativität erforderlich, um eine Schwachstelle in einem Web-Browser aufzuspüren. Auch fest integrierte Plugins und andere unikate Komponenten stellen hier ein attraktives Angriffsziel dar.

Wir konnten bereits mehrere Browser-Hersteller beim Ausmerzen der Schwachstellen unterstützen. Das Tool bamboo.js wurde lizenzfrei auf GitHub veröffentlicht, sodass jeder die Möglichkeit hat, es zur Aufdeckung von Schwachstellen zu verwenden und zu modifizieren.