
CVE-2017-0037 (Sicherheitslücke durch Speicherbeschädigung im Microsoft-Browser)
Dieses Dokument befasst sich mit CVE-2017-0037- Sicherheitslücke durch Speicherbeschädigung im Microsoft-Browser. Zunächst wird erklärt, was Remote Code Execution (RCE) ist, und anschließend werden einige technische Details besprochen.
Was ist Remote Code Execution?
Ein Cyberangriff, bei dem ein Angreifer aus der Ferne Befehle auf einem anderen Computer ausführen kann, wird als Remote Code Execution bezeichnet. Remote-Code-Execution-Angriffe (RCE) werden am häufigsten durch schädliche Software verursacht, die vom Host heruntergeladen wurde, und können unabhängig vom Standort des Systems auftreten.
Um RCE zu erreichen, können die folgenden Wege genutzt werden:
Injection-Angriffe: Hier liefert der Angreifer fehlerhafte Eingaben mit der Absicht, dass ein Teil davon als Teil des Befehls verarbeitet wird.
Deserialisierungsangriffe: Das Deserialisierungsprogramm kann sorgfältig formulierte Benutzereingaben in den serialisierten Daten als ausführbaren Code lesen.
Out-of-Bounds-Write: Ein Angreifer kann möglicherweise eine Eingabe konstruieren, die über den zugewiesenen Puffer hinausgeht, wenn die Speicherzuweisung schlecht durchgeführt wird. Da ausführbarer Code ebenfalls im Speicher abgelegt ist, kann das Programm möglicherweise vom Benutzer bereitgestellte Daten ausführen, wenn sie an der richtigen Stelle geschrieben werden.
Type-Confusion-Angriff: Es besteht die Gefahr einer Typverwechslung, wenn ein Quellcode keine Maßnahmen ergreift, um die Authentizität einer übergebenen Entität zu überprüfen. Da Typverwechslung es einem Angreifer ermöglicht, Code einzuschleusen, der beliebige Anweisungen ausführen kann, indem er lediglich eine Diskrepanz bei den Objekttypen verursacht, ist sie riskant.
Ausführung eines RCE-Angriffs
Eine RCE-Angriffssequenz ist einfach durchzuführen. Zunächst durchsucht der Bedrohungsakteur das Internet nach gängigen Schwachstellen, die in einem effektiven Angriff ausgenutzt werden können. Nachdem er eine bestimmte Schwachstelle identifiziert hat, nutzt der Hacker den Exploit, um Zugriff zu erhalten. Nachdem er Zugriff erlangt hat, kann er das schädliche Skript verwenden, um seine Ziele zu erreichen, darunter Datenexfiltration, Geldwäsche, umfassende Überwachung und Dienstunterbrechung.
Die Sprache der Zielanwendung wird häufig zum Einschleusen von Code verwendet. Die Sprache wird dann vom serverseitigen Prozessor ausgeführt. Python, Java, Perl, Ruby und PHP sind gängige Programmiersprachen. Code-Injection ist auf Plattformen verbreitet, die ungeprüfte Eingaben sofort analysieren. Öffentliche Webanwendungen sind in der Tat ein großer Fokus für Hacker.
Schädliche Skripte werden typischerweise über Bash-Skripte ausgeführt. Ein Bash-Skript ist ein Textdokument, das Befehle enthält, die normalerweise in die Eingabeaufforderung eingegeben würden. Bash-Skripte ermöglichen es den enthaltenen Befehlen, korrekt zu funktionieren. Es ist üblich, ihnen ein „.sh“ anzuhängen, obwohl es nicht erforderlich ist. Nach der Paketierung fügt der Hacker den Code in eine anfällige App ein, die ihn dann ausführt. Die Anwendung könnte auch eine Entscheidung an den Kernel weitergeben, damit dieser sie ausführt.
Angriffsmetriken
Das folgende Bild zeigt die Basis-Score-Metriken von CVE-2017-0037.

Der CVSS-Bewertungswert beträgt hier 8.1(hoch).
Angriffsvektor- Die anfällige Komponente ist hier an den Netzwerk-Stack gebunden, und der Kreis potenzieller Angreifer reicht von den anderen genannten Alternativen bis zum gesamten Internet.
Die Angriffskomplexität dieser Schwachstelle ist hoch, das heißt, der Erfolg eines Angriffs hängt von Umständen außerhalb der Kontrolle des Angreifers ab. Ein Angriff kann also nicht nach Belieben ausgeführt werden, sondern erfordert vom Angreifer ein erhebliches Maß an Arbeit bei der Planung oder Umsetzung gegen das anfällige Element, bevor er voraussichtlich wirksam werden kann.
Der Vertraulichkeitswert ist hier hoch, was einen vollständigen Verlust der Vertraulichkeit bedeutet; der Angreifer erhält Zugriff auf alle Ressourcen der beschädigten Komponente.
Die Integrität ist hoch, was einen schwerwiegenden Verlust von Integrität und Schutz bedeutet.
Die Verfügbarkeit ist hoch, was einen vollständigen Verlust der Verfügbarkeit bedeutet und es dem Angreifer ermöglicht, den Zugriff auf die Ressourcen der betroffenen Komponente vollständig zu unterbinden.
Angriffsdetails
Die Schwachstelle CVE-2017-0037 war ein Type-Confusion-Fehler, der in Microsoft Edge und im Internet Explorer 10 und 11 auftrat. Er ermöglichte es Angreifern, auf der Zielmaschine remote Code auszuführen, wenn der Benutzer eine bösartige Website besuchte.
Der Fehler wurde von Google-Forscher Ivan Frantic aufgezeigt, und Google veröffentlichte die Details der Schwachstelle, da Microsoft sie nicht innerhalb der 90-tägigen Offenlegungsfrist beheben konnte.

Der vom Forscher veröffentlichte Proof-of-Concept (PoC)-Exploit zeigt, dass er Edge und IE zum Absturz bringen kann, sodass ein Angreifer remote Code ausführen und Administratorrechte auf dem kompromittierten System erlangen kann. Er bestätigte außerdem, dass der Angriff auf der 64-Bit-Version des Internet Explorers unter Windows Server 2012 R2 funktionierte und sowohl den 32-Bit-IE 11 als auch Microsoft Edge betraf.
Die Typverwechslung befindet sich in der
Layout::MultiColumnBoxBuilder::HandleColumnBreakOnColumnSpanningElemnt Funktion in mshtml.dll. Durch die Ausführung von beliebigem Code aus der Ferne über Vektoren, die Cascading Style Sheets (CSS)-Token-Sequenzen und manipulierten JavaScript-Code umfassen, die auf einem TH-Element operieren, kann der Angriff erfolgen.
Der PoC von Ivan Fratric von Google Project Zero
Wie vom Forscher Ivan Frantic angegeben, stürzt der PoC in
MSHTML!Layout::MultiColumnBoxBuilder::HandleColumnBreakOnColumnSpanningElement beim Lesen aus der Adresse 0000007800000070 ab.



Durch die Analyse des Codes rund um den Absturzpunkt kann beobachtet werden, dass an der Speicheradresse 00007ffe`8f330a51 der Inhalt des Registers rbp in das Register rcx gelesen wird. Anschließend weist der Aufruf von
MSHTML!Layout::Patchable<Layout::PatchableArrayData<Layout::MultiColumnBox::SMultiColumnBoxItem> >::Readable rax einen Wert zu (rax ist ein dafür vorgesehenes Register zum Speichern von Rückgabewerten von Funktionen).
Obwohl rcx eigentlich auf einen anderen Objekttyp zeigen soll, zeigt es im oben gezeigten PoC auf ein Array aus 32-Bit-Ganzzahlen, das in Array<Math::SLayoutMeasure>::Create zugewiesen wird. Die Offsets der Tabellenspalten sind in diesem Array gespeichert, und ein Angreifer kann die Kontrolle darüber übernehmen. Der Absturz erfolgt bei 00007ffe`8f330a59, da rax auf nicht initialisierten Speicher zeigt. rax speichert den Rückgabewert der Funktion
MSHTML!Layout::Patchable<Layout::PatchableArrayData<Layout::MultiColumnBox::SMultiColumnBoxItem> >::Readable, bei dem es sich nicht um eine initialisierte Speicheradresse handelt. Der Angreifer kann rax auf eine Speicherstelle zeigen lassen, die er kontrollieren kann. Der Angreifer kann Tabelleneigenschaften wie border-spacing und die Breite des ersten TH-Elements ändern, um die Kontrolle über rax zu erlangen.

Wenn der Angreifer die Kontrolle über rax in Zeile 00007ffe`8f330a59 erlangen kann, wird die Funktion
MSHTML!Layout::Patchable<Layout::PatchableArrayData<Layout::MultiColumnBox::SMultiColumnBoxItem> >::Readable in Zeile 00007ffe`8f330a5d 743d erneut mit denselben Argumenten aufgerufen, und es erfolgt ein Sprung zu einer höheren Adresse. Danach könnte über eine Reihe von Differenzen, die bei rax beginnen, ein Funktionszeiger erhalten und in rdi gespeichert werden. Wenn der Angreifer eine CFG-Prüfung für diesen Funktionszeiger bestehen kann, würde der vom Angreifer kontrollierte Funktionszeiger in Zeile 00007ffe`8f330a80 aufgerufen.
Wahrscheinlicher Patch des Fehlers
Wie von Ivan Fratric vorgeschlagen, muss zunächst die Ursache für das Auftreten der Typverwechslung erkannt werden. Seiner Hypothese zufolge gibt es im DOM zwei Arten von Spalten: HTML-Tabellenspalten und CSS-Spalten; IE/Edge verwechselte die beiden. Wenn also irgendwo in der anfälligen Funktion eine Typprüfung hinzugefügt würde, hätte das das Problem lösen können.
Nützliche Links
Auswirkungen von RCE-Angriffen
Erstzugriff: Angreifer können dies nutzen, um die Kontrolle über ein Gerät zu erlangen, Malware zu installieren oder andere Ziele zu erreichen.
Informationsoffenlegung: RCE-Angriffe helfen dabei, informationsstehlende Malware zu installieren oder Befehle auszuführen, die Daten vom betroffenen Gerät sammeln und stehlen.
Denial of Service: Ein RCE-Fehler ermöglicht es Hackern, Code auf dem Rechner auszuführen, der die betroffene Anwendung hostet, und dadurch dessen Betrieb und den anderer Programme auf dem System zu stören.
Cryptomining: Cryptomining-Malware wird häufig auf anfälligen Geräten bereitgestellt und ausgeführt.
Ransomware: Ransomware ist eine Art von Software, die einen Benutzer am Zugriff auf seine Dateien hindert, es sei denn, er zahlt Geld.
Möglichkeiten zur Eindämmung von RCE-Angriffen
Die Kontrolle von Pufferüberläufen kann zur Eindämmung von RCE-Angriffen eingesetzt werden.
Zugriffskontrolllisten sind nützlich, um Benutzerrechte einzuschränken und damit die Fähigkeiten eines Angreifers zu begrenzen, falls dieser die Kontrolle über ein Benutzerkonto erlangt.
Der Netzwerkverkehr sollte zusätzlich zur Überwachung der Endpunkte auf potenziell schädliche Inhalte überwacht werden.
Verwendung von Eingabebereinigung (Input Sanitization), also dem Prozess des Bereinigens und Säuberns von Benutzereingaben, um sie davor zu schützen, zur Ausnutzung von Sicherheitslücken verwendet zu werden.
Referenzen
https://msrc.microsoft.com/update-guide/vulnerability/CVE-2017-0037
https://www.bugcrowd.com/glossary/remote-code-execution-rce/
https://bugs.chromium.org/p/project-zero/issues/detail?id=1011
https://blog.0patch.com/2017/03/0patching-another-0-day-internet.html
https://www.cs.uaf.edu/2017/fall/cs301/lecture/09_11_registers.html
https://reverseengineering.stackexchange.com/questions/10746/what-does-mov-qword-ptr-dsrax18-r8-mean