
Schwachstellenforschung zu CVE-2023-26136
Dieses Repository enthält eine gepatchte Version des Pakets tough-cookie, Version 2.5.0, um die kritische Prototype Pollution-Sicherheitslücke (CVE-2023-26136) zu beheben. Die Schwachstelle ermöglicht es Angreifern, die Prototyp-Kette zu manipulieren, indem sie Eigenschaften in JavaScript-Objekte einschleusen. Dies kann zu unerwartetem Verhalten, Sicherheitsrisiken wie Remote-Code-Ausführung und Kompatibilitätsproblemen in Anwendungen führen, die auf dieses Paket angewiesen sind.
Versionen des Pakets tough-cookie vor v4.1.3 sind anfällig für Prototype Pollution, wenn der CookieJar mit dem Modus rejectPublicSuffixes=false verwendet wird. Die Schwachstelle entsteht durch unsachgemäße Handhabung von Cookies, insbesondere wenn cookie.domain auf __proto__ gesetzt wird. Dadurch können Angreifer das zentrale Object.prototype-Objekt verändern, was weitreichende Probleme in der gesamten Anwendung verursachen kann.
Weitere Details zu CVE-2023-26136 finden Sie unter:
Prototype Pollution kann mehrere kritische Risiken mit sich bringen, darunter:
Sicherheitslücken: Durch die Veränderung des Basis-Object.prototype können Angreifer das Verhalten von Objekten manipulieren, Rechte erweitern, auf sensible Daten zugreifen oder Sicherheitsmechanismen in der Anwendung umgehen.
Denial of Service (DoS): Die Verschmutzung der Prototyp-Kette kann unerwartetes Systemverhalten verursachen, das zu Abstürzen, Endlosschleifen oder Ressourcenerschöpfung führt und die Anwendung für legitime Benutzer unzugänglich macht.
Kompatibilitätsprobleme: Die Änderung des Object.prototype kann Fehler und unerwartetes Verhalten bei der Interaktion mit anderen Bibliotheken oder Frameworks hervorrufen. Abhängigkeiten, die auf Prototyp-Ketten angewiesen sind, können brechen, was zu Integrationsproblemen oder fehlerhaftem Anwendungsverhalten bei Updates führt.
Unerwartetes Anwendungsverhalten: Prototype Pollution kann zu unberechenbarem Programmverhalten führen, einschließlich Datenkorruption, Sicherheitsverletzungen und potenziell weiteren Exploit-Möglichkeiten.
Der Patch ändert die MemoryCookieStore-Klasse, insbesondere die Methode putCookie, um Prototype Pollution durch die Erstellung prototyploser Objekte zu verhindern. Die wichtigsten Änderungen umfassen:
Object.create(null) anstelle von {}, um Objekte ohne Prototyp zu erzeugen.cookie.domain = __proto__ gesetzt werden konnten.Um die gepatchte Version von tough-cookie zu installieren, verwenden Sie den folgenden Befehl:
npm install ./tough-cookie-2.5.0-PATCHED.tgz
Dieses Repository enthält einen Komponententest, der überprüft, ob die Prototype-Pollution-Sicherheitslücke erfolgreich behoben wurde.
Der Test mit dem Namen prototype_pollution_test prüft speziell, ob das Setzen von Cookies mit einer Domain von __proto__ nicht mehr die JavaScript-Prototyp-Kette beeinflusst. Dadurch wird sichergestellt, dass Prototype Pollution verhindert wird und die Integrität der Anwendung erhalten bleibt.
Um die Tests auszuführen und die Korrektur zu bestätigen, führen Sie den folgenden Befehl aus:
npm test
Um den Exploit sowohl in der ursprünglichen als auch in der gepatchten Version zu demonstrieren, folgen Sie den Schritten unten:
Installieren Sie die anfällige Version von tough-cookie:
npm install [email protected] && node index.js
Erwartete Ausgabe:
Polluted object: {
Slonser: Cookie="Slonser=polluted; Domain=__proto__; Path=/notauth; hostOnly=false; aAge=5ms; cAge=5ms",
Auth: Cookie="Auth=Lol; Domain=google.com; Path=/notauth; hostOnly=false; aAge=5ms; cAge=5ms"
} EXPLOITED SUCCESSFULLY
Dies zeigt, dass der Prototyp eines Objekts verschmutzt wurde, was die Sicherheitslücke in der Originalversion bestätigt.
npm install ./tough-cookie-2.5.0-PATCHED.tgz && node index.js
Erwartete Ausgabe:
EXPLOIT FAILED
Dies zeigt, dass der Exploit erfolgreich blockiert wurde, was die Behebung der Prototype-Pollution-Sicherheitslücke bestätigt.
Der Prozess zur Behebung der Prototype Pollution-Sicherheitslücke in tough-cookie v2.5.0 umfasste mehrere methodische Schritte, um sicherzustellen, dass die Korrektur gründlich und effektiv ist. Nachfolgend ein Überblick über mein Vorgehen:
Ich begann mit der Recherche zu Prototype Pollution (CVE-2023-26136), um deren Auswirkungen zu verstehen. Die Schwachstelle ermöglicht es Angreifern, Eigenschaften in die Prototyp-Kette über die cookie.domain-Eigenschaft einzuschleusen, was Sicherheitsrisiken wie Remote-Code-Ausführung mit sich bringen kann.
Ich untersuchte GitHub-Issues und Diskussionen zur Sicherheitslücke, einschließlich der Korrektur in tough-cookie v4.1.3, die Object.create(null) verwendet, um Prototype Pollution zu verhindern. Dies half mir, die erforderlichen Änderungen für v2.5.0 zu identifizieren.
Ich verglich v2.5.0 mit v4.1.3, um die Unterschiede zu verstehen und die notwendigen Änderungen genau zu bestimmen. Die wichtigste Änderung war die Verwendung prototyploser Objekte, um Exploits zu verhindern.
Ich aktualisierte die MemoryCookieStore-Klasse, um Object.create(null) anstelle von {} zu verwenden und so Prototype Pollution zu verhindern.
Ich schrieb Komponententests, um die Korrektur zu überprüfen, und erstellte ein Exploit-Demonstrationsskript (index.js), das zeigt, wie die Schwachstelle in der gepatchten Version verhindert wird.
Schließlich dokumentierte ich die Korrektur mit Installations- und Testanweisungen und erstellte die gepatchte Version (tough-cookie-2.5.0-PATCHED.tgz) zur einfachen Verteilung.
Dateien, die gegenüber v2.5.0 hinzugefügt oder bearbeitet wurden
index.js: Hauptskript zur Demonstration der Sicherheitslücke und der Korrektur.lib/memstore.js: Die modifizierte MemoryCookieStore-Klasse zur Verhinderung von Prototype Pollution.test/ietf_data/parser.json: Aktualisiert, um veraltete Daten in den Testdaten zu korrigieren.test/prototype_pollution_test.js: Komponententests zur Überprüfung, dass Prototype Pollution behoben ist.tough-cookie-2.5.0-PATCHED.tgz: Die gepatchte Version des tough-cookie-Pakets.