Dokumentation und Proof-of-Concept-Code für CVE-2022-24125 und CVE-2022-24126.
Ein neues Spielupdate, 1.15.1, wurde am 25.08.2022 für Dark Souls III veröffentlicht, zusammen mit der Wiederherstellung der Onlinedienste. Dieses Update korrigierte sowohl CVE-2022-24125 als auch CVE-2022-24126, zusammen mit einer Vielzahl anderer potenzieller Sicherheitslücken im P2P-Netzwerk des Spiels (OOB-Lese-/Schreibzugriffe). Darüber hinaus wurden alle bekannten Exploits behoben, die es erlaubten, die Speicherstände anderer Spieler zu manipulieren. Viele übliche kleine Cheats (z. B. „Fluchmesser“), die beim Online-Multiplayer häufig auftraten, wurden ebenfalls gepatcht.
Dieses Repository enthält Proof-of-Concept-Code und Dokumentation für den jüngsten RCE-Exploit, der FROM-SOFTWARE-Spiele betrifft, CVE-2022-24126. Obwohl theoretisch auch in anderen Spielen möglich, liegt der Fokus auf Dark Souls III, da meine Forschung an diesem Spiel durchgeführt wurde. Derzeit existiert Proof-of-Concept-Code nur für Dark Souls III, die Schwachstelle wurde jedoch in den folgenden Spielen bestätigt:
Der anfällige Code ist auch in Sekiro vorhanden (Credit: LukeYui), obwohl es keine Möglichkeit gibt, ihn auszulösen. Das Vorhandensein in Demon's Souls wurde nicht bestätigt, ist aber sehr wahrscheinlich. Der geschlossene Netzwerktest war zwar betroffen, die Veröffentlichungsversion von Elden Ring jedoch nicht. Tatsächlich wurde eine ganze Reihe von Netzwerkabstürzen, Out-of-Bounds-Lese-/Schreibzugriffen und Exploits, die es Spielern erlaubten, die Spieldaten anderer zu modifizieren und die in Dark Souls III vorhanden waren, in Elden Ring gepatcht. Kudos an für die Zusammenstellung dieser Liste und an FROM SOFTWARE für das schnelle Handeln! Ich bin froh zu sagen, dass
Entgegen der landläufigen Meinung handelt es sich hierbei NICHT um einen Peer-to-Peer-Netzwerk-Exploit. Er hängt mit dem Matchmaking-Server zusammen und ist daher viel schwerwiegender, da man aufgrund einer weiteren Matchmaking-Server-Schwachstelle (CVE-2022-24125) keine Multiplayer-Aktivitäten durchführen muss, um angreifbar zu sein.
Da das Spiel in den Monaten vor der Serverabschaltung durchschnittlich etwa 20.000 gleichzeitige Spieler hatte, war dies eindeutig ein Problem, das sofort behoben werden musste, insbesondere angesichts der Möglichkeit, dass es in Elden Ring vorhanden sein könnte. Da FROM SOFTWARE über 40 Tage nach meinem ersten Bericht mit Proof-of-Concept-Videos und detaillierter Exploit-Dokumentation (auf der ein großer Teil dieser Readme basiert) noch nicht reagiert hatte, beschloss ich, die Existenz des Exploits auf harmlose Weise öffentlich zu demonstrieren, in der Hoffnung, die Aufmerksamkeit zu erhöhen, damit er von den Entwicklern behoben wird – und es hat funktioniert.
Weitere Details zu diesen 3 Gadgets finden Sie hier. Wenn dieser Ansatz mit virtuellen Aufrufen für ein anderes Spiel nicht praktikabel ist, kann die beliebige Code-Umleitung dennoch verwendet werden, um einen traditionelleren ROP-Exploit aufzubauen.
Um den Proof-of-Concept-Code auszuführen, müssen Sie zuerst einen Server zum Verbinden haben. Da die offiziellen Server aufgrund des Exploits deaktiviert wurden, können Sie einen privaten mit ds3os einrichten. ds3os ist so konzipiert, dass es das Verhalten des Einzelhandelsservers so genau wie möglich nachahmt, aber zur Behebung dieses Exploits wurden bereits Sicherheitspatches in diesem Projekt bereitgestellt. Sie können jedoch noch eine Testumgebung einrichten, indem Sie das Projekt selbst mit den Konstanten SEND_MESSAGE_TO_PLAYERS_SANITY_CHECKS und NRSSR_SANITY_CHECKS auf false in BuildConfig.h erstellen. Dies ahmt das unsichere Verhalten des Einzelhandelsservers nach. Folgen Sie den Anweisungen von ds3os, um das Spiel zu starten und eine Verbindung zu Ihrem Server herzustellen.
Sobald dies erledigt ist und Ihr Spiel mit den Servern verbunden ist, erstellen Sie den PoC-Code und starten Sie die ausführbare Datei Injector.exe. Sie injiziert eine DLL mit dem Exploit-Code in den Prozess von Dark Souls III. Diese DLL verwendet dann die Spielfunktion, die FRPG-Nachrichten an den Server sendet, um den Exploit an Ihren eigenen Client zu liefern.
Die Funktion 140ca5010 prüft die Eintragsgrößen, aber 140ca4fa0 ist für variable Größen und führt keine Plausibilitätsprüfung des Größenfelds durch (Fehler #1). Um die oben beschriebene beliebige Code-Umleitung zu erreichen, müssen wir es auf 14F3B0 setzen. Dies verursacht einen Out-of-Bounds-Lesezugriff von ca. 1,3 MiB, aber die Speicherseite sollte groß genug sein, um Zugriffsverletzungen zu vermeiden.
140ca56b0Diese Funktion wird von der vorherigen mit nrssr_data als Argument aufgerufen. Erstellt das DLMemoryInputStream-Objekt auf dem Stack, das dann als Argument an den NRSSR-Parser übergeben wird.
141955f50: ParseNRSessionSeachResultDer NRSessionSearchResult-Parser. Überprüft NRSSR-Signatur und Versionsnummern (14196a0f0), parst die Eigenschaftenliste (14196a260), den Hostnamen (14195603a) und einige weitere Informationen (siehe rce.h)
14195603aSchleife in der obigen Funktion, die den Hostnamen unsicher kopiert (Fehler #2). Hier sind einige Adressen, die helfen, den Überblick über das Geschehen während des Pufferüberlaufs zu behalten:
14F128DLMemoryInputStream-Stack-Adresse: 14F3A0DLMemoryInputStream-vtable-Zeiger nach dem Überschreiben: 1439e8b30DLMemoryInputStream, die vom DLInputStreamReader verwendet wird: 0x181439e8b48MOV RCX,qword ptr [RCX + 0x8]
MOV RAX,qword ptr [RCX]
JMP qword ptr [RAX + 0x40]
Wohin wir nach der ersten Code-Umleitung gelangen, die durch die überschriebene Speicherstrom-vftable verursacht wird. Hier beginnt die Kette der virtuellen Aufruf-Umleitungen.
Für Dark Souls III Ver. 1.15. Die maximale theoretische Payload-Größe hängt vom Stack-Layout ab und variiert daher je nach Spiel und Version. ↩