
Ein WebKit-basierter Kernel-Exploit und Jailbreak für PS5
Dieses Repository enthält einen WebKit-ROP-Exploit der UMTX-race-Use-after-Free-Sicherheitslücke (CVE-2024-43102), die von Synacktiv gemeldet wurde. Es ist im Grunde ein Port der Exploit-Strategie von fail0verflow und flatz. Er missbraucht die UAF, um ein Lese-/Schreib-Mapping in den Stack eines Kernel-Threads zu erhalten, und nutzt Pipe-Lese- und Schreibvorgänge, um eine (nicht ganz ideale) beliebige Lese-/Schreib-Primitive im Kernel zu etablieren. Dieses Lesen/Schreiben wird dann zu einer besseren Primitive ausgebaut, die ein IPv6-Socket-Paar und ein Pipe-Paar für stabiles Lesen/Schreiben nutzt, das an Payloads übergeben werden kann – auf dieselbe Weise, wie es mit dem früheren IPV6-PS5-Kernel-Exploit möglich war.
Die Seite selbst ist eine abgespeckte und modifizierte Version des PS5 Exploit Host von idlesauce, da dort bereits die Arbeit erledigt wurde, psfree an meinen zuvor verwendeten Codestil anzubinden. Dieser Host ist auch meine persönliche Wahl zum Ausführen von Dingen, da er sehr flüssig läuft und nützliche Payloads integriert. Hoffentlich wird er in naher Zukunft aktualisiert, um diesen Exploit zu unterstützen <3.
Letztendlich wird ein Payload-Loader gestartet, der auf Port 9021 nach Payload-ELFs lauscht. Ich empfehle das PS5 Payload Dev SDK, da es volle Kompatibilität mit diesem Loader haben sollte, sobald Kernel-Offsets hinzugefügt werden.
Diese Sicherheitslücke betrifft Firmware 1.00 bis 7.61, jedoch scheinen FW >= 3.00 zusätzliche Mitigationen zu haben, die eine Anpassung des Exploits erfordern, damit er funktioniert. Da mich hauptsächlich niedrigere Firmwares interessieren, unterstützt dieser Exploit FW >= 3.00 derzeit noch nicht. Darüber hinaus wurde die WebKit-Sicherheitslücke, mit der wir verketten, in 6.00 gepatcht, sodass für diese Systeme ein weiterer WebKit-Exploit erforderlich sein wird, der Userland-Lesen/Schreiben erreicht. Auch hier: Da ich mich nicht auf höhere Firmwares konzentriere, bleibt das derzeit unvollendet.
Wichtige Hinweise
Derzeit werden folgende Firmwares unterstützt:
dns.conf so, dass manuals.playstation.net auf die IP-Adresse deines PCs zeigt.python fakedns.py -c dns.confpython host.py0.0.0.0.
Um den ELF-Loader zu verwenden, führe den Exploit bis zum Abschluss aus. Nach Abschluss startet er einen Server auf Port :9021. Verbinde dich und sende dein ELF per TCP an die PS5; es wird dann ausgeführt. Dieser Loader sollte weiterhin Payloads akzeptieren und ausführen, auch nachdem der Browser beendet wurde.
Anfänglicher Double-Free
Die Strategie für diesen Exploit stammt größtenteils von fail0verflow und flatz. Weitere Informationen zur Sicherheitslücke findest du im Write-up von chris@accessvector. Bei der Ausnutzung erhalten wir im Wesentlichen einen Double-Free. Wir können dies nutzen, um das vmobject eines Kernel-Stacks mit dem einer mmap-Zuordnung zu überlappen und so ein Fenster in den Stack eines Kernel-Threads zu erhalten. Diese sehr mächtige Fähigkeit ermöglicht es uns, beliebige Kernel-Zeiger auf dem Stack zu lesen/zu schreiben, was eine ASLR-Umgehung und die Erstellung von Primitiven ermöglicht. Den Thread, in dessen Stack wir Einblick haben, nennen wir Opfer-Thread.
Erlangen von beliebigem Lese-/Schreibzugriff
Indem wir eine Pipe erstellen und den Pipe-Puffer im Haupt-Thread füllen und dann versuchen, mit dem Opfer-Thread in die Pipe zu schreiben, blockiert der Opfer-Thread und wartet darauf, dass im Puffer Platz frei wird. Während dieser Zeit können wir unser Fenster in den Kernel-Stack nutzen, um die iovec-Zeiger in Kernel-Zeiger zu ändern und Flags zu setzen, sodass sie als Kernel-Adressen behandelt werden. Wenn wir dann die Pipe im Haupt-Thread lesen, können wir einen beliebigen Kernel-Read erreichen.
Wenn wir den Opfer-Thread dazu bringen, auf der Pipe zu lesen, blockiert er und wartet auf eingehende Daten. Wir können dann erneut die iovec-Zeiger überschreiben und sie zu Kernel-Zeigern machen und im Haupt-Thread Daten schreiben, um einen beliebigen Kernel-Write zu erhalten.
Verbesserung des beliebigen Lese-/Schreibzugriffs
Zu diesem Zeitpunkt haben wir einen beliebigen Lese-/Schreibzugriff ohne echte Einschränkungen, aber wir sind darauf angewiesen, Multithreading und Blockierung zu verwenden, damit es funktioniert, was nicht ideal ist. Wir verwenden dann den R/W-Zugriff, um die FD-Tabelle des Prozesses zu durchlaufen und die pktopts zweier IPV6-Sockets zu überlappen. Über den IPV6_PKTINFO-Sockopt können wir dann einen weiteren beliebigen Lese-/Schreibzugriff erstellen. Diese Lese-/Schreib-Primitive ist jedoch wiederum nicht ideal, da sie durch die zugrunde liegende Socket-Option in Größe und Inhalt eingeschränkt ist. Diesen Schritt behalten wir hauptsächlich bei, um das Szenario des IPV6-Exploits nachzubilden, auf dem die meisten Payloads und Ähnliches aufgebaut wurden.
Über Pipes können wir einen besseren Lese-/Schreibzugriff erhalten. Indem wir erneut die FD-Tabelle des Prozesses durchlaufen und Pipemap-Pufferobjekte modifizieren, können wir Lesen/Schreiben etablieren. Das IPV6-Socket-Paar dient als Mechanismus, um den Pipemap-Puffer zu steuern.
Beheben/Umgehen der Korruption
Wenn wir die Dinge so belassen und versuchen, den Browser zu schließen, stürzt das System ab. Das liegt daran, dass die Prozessbereinigung versucht, den bereits freigegebenen Kernel-Stack freizugeben. Um dies zu vermeiden, tun wir zwei Dinge:
td_kstack des Opfer-Threads in der Thread-Liste des Prozesses auf Null.Auf FW < 3.00 ist dieser Exploit sehr stabil. Der einzige kritische Fehlerpunkt ist eine fehlgeschlagene Überlappung der vmobjects. Auf höheren Firmwares ist diese Überlappung aufgrund angeblicher Mitigationen auf Ebene des Seiten-/Heap-Allokators schwerer zu erreichen.
Wer Interesse hat, zur PS5-Forschung/-Entwicklung beizutragen, kann einem Discord beitreten, den ich eingerichtet habe: hier.