Hier werde ich Analysen von öffentlichen Exploits oder einige meiner 1day-Exploits veröffentlichen.
[ Analyse öffentlicher Exploits ]
Persönlich denke ich, dass der beste Weg, einen öffentlichen Exploit zu lernen, darin besteht, ihn Zeile für Zeile zu verstehen, bis ich den Exploit vollständig verstehe. Ich werde einige dieser (übermäßig kommentierten ;) ) Exploits veröffentlichen, damit hoffentlich andere daraus lernen können, und als Versuch, der Community etwas zurückzugeben. Auch zu Dokumentationszwecken, denn diese Dinge verblassen mit der Zeit irgendwie aus meinem Kopf.
Dieser Exploit überschreibt einen Objektzeiger in einem anderen Objekt. Er verwendet einen ret2dir-Angriff, um den beschädigten Zeiger auf eine vorhersehbare feste Adresse im Kernel zeigen zu lassen, die die Exploit-Payload enthält. Diese Exploit-Technik umgeht PXN & PAN.
Setzt 16 Bytes an einer beliebigen Adresse auf Null
Dieser Exploit löscht 16 Bytes eines nützlichen globalen Objekts, das sich an einer festen Adresse im Kernel befindet.
Ein beschädigter Objektzeiger innerhalb des globalen Objekts verweist auf die Exploit-Payload aus dem Userland. Diese Art von Angriff funktioniert nicht auf Geräten/Kerneln mit PAN (oder PAN-Emulation).
extra_recipe
Mein Versuch, den extra_recipe-Jailbreak zu verstehen
Besonders interessierte mich der KPP-Bypass-Teil. Obwohl es ein paar Folien zu diesem Thema gab, aus denen ich ein vages Bild des Bypasses gewinnen konnte, wollte ich wirklich in die feinen Details eintauchen und sehen, was tatsächlich im Code vor sich geht
Außerdem wollte ich die letzten Zutaten für einen Jailbreak verstehen (Installation von Cydia usw.)
yalu102 (ViewController.m)
Ich habe den Teil kommentiert, der für den eigentlichen Bug relevant ist, und wie er ausgenutzt wurde.
Der Grund, warum ich mich mit yalu102 statt mit dem ursprünglichen Exploit beschäftigt habe, ist, dass die Port-Feng-Shui-Technik sauberer und einfacher zu verstehen aussah.
Er verwendet erstaunliche Techniken, um von wirklich schwachen Primitiven auszugehen, ein stärkeres AAR aufzubauen und schließlich einen vollwertigen Task-Port zu erstellen. Die Port-Magie hinter dem Exploit-Code ist unglaublich. All dies mit einem 8-NULL-Byte-Heap-Overflow. Absolut umwerfend.
Ich habe ein paar naive Ideen zur Verbesserung der Zuverlässigkeit aufgeschrieben. Hoffentlich wird jemand in Zukunft eine zuverlässigere Version des Exploits veröffentlichen. :)
Ein großes Dankeschön an kudima (@begger_dd) für den sehr klaren und präzisen, gründlich annotierten Writeup! :)
Der Writeup erklärt den JIT-Type-Confusion-Bug, einige Einschränkungen bei Konvertierungen von Boxing/Unboxing (die zu Unzuverlässigkeit führen können) und einen detaillierten Walkthrough, wie die frühen/späten AAR/AAW-Primitive konstruiert werden. Er gibt außerdem Einblicke in die Änderungen der Exploitation-Techniken nach der jüngsten Runde von Mitigationen (Index-Masking, ArrayBuffer-Backing-Store-Poisoning, einige Änderungen am Mechanismus von W^X JIT, Änderungen in der JSObject-Struktur usw.)
jsc_ConcatMemcpy_infoleak
Dies ist eine kommentierte Version von kudimas WebKit-Infoleak-Exploit (behoben am 27.08.2018).
Er resultiert aus einer unvollständigen Behebung eines der von lokihardt gemeldeten Bugs. Der Patch aus lokihardts Bericht behob das Double -> Object-Type-Confusion-Primitiv, aber nicht den umgekehrten Weg: Object -> Double.
Er sprayt den Webkit-Heap mit Butterflies, die ein einzelnes Objekt und einen Marker enthalten, und löst später den Concat-Bug aus, wodurch ein großer Teil mehrerer Double-Arrays mit nicht initialisierten Heap-Daten gefüllt wird. Er iteriert durch die nicht initialisierten, vom fehlerhaften Concat erzeugten Double-Arrays, bis er die Adresse des zuvor gesprühten Objekts findet, und leakt sie.
Nochmals Danke an kudima (@begger_dd) für den schönen Exploit und den Writeup! :)
jsc_prop_enum_uaf
Dies ist ein weiterer Beitrag von kudima. Es ist eine kommentierte Version von kudimas WebKit-Exploit zur Remote-Code-Ausführung (behoben in diesem Commit). Er wurde in iOS 12.1 behoben und funktioniert bis iOS 12.0.1.
Das Problem besteht darin, dass man beim Ausführen von Code in Baseline-jitted forin-Schleifen Code einführen kann, der das der JSOBject zugrunde liegende StructureID-Objekt freigibt und den Garbage Collector auslöst. Der Garbage Collector markiert jedoch das Mitglied "JSPropertyNameEnumerator->m_cachedStructureID" nicht, und das StructureID-Objekt, auf das "JSPropertyNameEnumerator->m_cachedStructureID" zeigt, wird während der Sweep-Phase freigegeben, was zu einem hängenden Zeiger führt.
Nachdem das StructureID-Objekt mit dem GC freigegeben wurde, kann man Code einführen, der ein neues StructureID-Objekt erstellt, das den zuvor freigegebenen "StructureID-Objekt"-Slot belegt.
Indem man die StructureID von Objekt A freigibt und dann Objekt B eine neue StructureID erstellen lässt, die deren Platz einnimmt, ist es möglich, eine Type-Confusion-Situation zu erzeugen, denn "JSPropertyNameEnumerator->m_cachedInlineCapacity" wird auf die Inline-Property-Größe von Objekt A gesetzt, während "JSPropertyNameEnumerator->m_cachedStructureID" auf das neue Structure-ID-Objekt zeigt, das Objekt B repräsentiert. Dadurch besteht eine Prüfung in 'op_get_direct_pname' und Objekt B kann auf Inline-Eigenschaften außerhalb seiner Grenzen zugreifen.
Dies kann missbraucht werden, um stärkere Primitive wie AAR/AAW aufzubauen und diese weiter zu nutzen, um beliebigen Code auszuführen.
Danke an kudima (@begger_dd) für den coolen Exploit und den sehr detaillierten Writeup! :)
[ 1Day ]
CVE-2017-2547
Eines Tages sah ich mir singis Exploit an, nachdem er auf der Zer0con 2018 präsentiert worden war, und beschloss, ihn zu verbessern.
Dies ist eine eigenständige Version des Exploits, bevor ich ihn in pwnjs integriert habe.
Die Verbesserungen umfassen
Erhöhte Zuverlässigkeit (funktioniert einwandfrei nach ausgiebigen Browsing-Sitzungen mit kontaminiertem Speicher)
Alle hartcodierten Offsets entfernt, um die Kompatibilität mit verschiedenen Browserversionen zu gewährleisten
Eine andere Exploitation-Technik verwendet (die Standard-Misalign-Technik)
Schließlich in das pwnjs-Framework integriert, indem ein Webkit-Prototyp erstellt wurde
Den Code deutlich lesbarer gemacht und viele Kommentare hinzugefügt
Besonderer Dank
qwertyoruiop & Samuel Grob für den erstaunlichen Phrack-Artikel und die öffentlichen Exploits
Brian Pak & Andrew Wesie für das großartige pwnjs-Framework!