
Proof-of-Concept-Exploit für CVE-2026-8161, eine Denial-of-Service-Schwachstelle im Multiparty-Multipart-Parser, die Prototype Pollution demonstriert, was zu einer unbehandelten Ausnahme und einem Absturz führt.
Proof of Concept für CVE-2026-8161 (Multiparty)
[email protected] und frühere Versionen sind anfällig für Denial-of-Service durch eine unbehandelte Ausnahme (uncaught exception).
Der Parser speichert hochgeladene Felder und Dateien in einfachen JavaScript-Objekten und unterscheidet nicht sicher zwischen Parser-eigenen Schlüsseln und geerbten Objekteigenschaften. Ein manipulierter Multipart-Feldname kann dazu führen, dass der Parser unerwartete Werte aus der Prototyp-Kette liest und während der Verarbeitung des Uploads abstürzt.
Jeder Dienst, der Multipart-Uploads über anfällige Versionen von multiparty akzeptiert, kann betroffen sein.
Das Problem tritt auf, weil fields und files einfache JavaScript-Objekte sind, aber wie sichere Schlüssel-Wert-Zuordnungen für benutzerkontrollierte Namen verwendet werden.
var fieldsArray = fields[name] || (fields[name] = [])
fieldsArray.push(value)
var filesArray = files[name] || (files[name] = [])
filesArray.push(file)
Das Problem ist, dass fields[name] und files[name] eine normale JavaScript-Eigenschaftssuche verwenden. Bei einfachen Objekten kann diese Suche geerbte Eigenschaften aus der Prototyp-Kette zurückgeben, anstatt nur Werte, die direkt auf dem Objekt gespeichert sind.
Wenn der Name __proto__ ist, kann JavaScript ihn über die Prototyp-Kette auflösen und das geerbte Prototyp-Objekt anstelle von undefined zurückgeben. Da dieser Wert truthy ist, wird die Fallback-Zuweisung übersprungen und der Parser erstellt nie ein echtes Array für dieses Feld.
Der Patch behebt dies, indem nur Schlüssel vertraut werden, die direkt zum Objekt gehören:
var filesArray = Object.prototype.hasOwnProperty.call(files, name)
? files[name]
: undefined
Dann hängt der Parser nur an, wenn der gespeicherte Wert tatsächlich ein Array ist, andernfalls initialisiert er ein neues:
if (Array.isArray(filesArray)) {
filesArray.push(file)
} else {
files[name] = [file]
}
Wenn .push() auf einen Wert aufgerufen wird, der kein Array ist, wird ein TypeError ausgelöst. Da dies innerhalb des asynchronen Parsing-Ablaufs von Multiparty geschieht, kann die normale Fehlerbehandlung auf Aufruferseite dies möglicherweise nicht abfangen, sodass die Ausnahme den Prozess zum Absturz bringen kann.
Object.prototype.hasOwnProperty.call(...).Führen Sie die Mocklab-Umgebung aus und senden Sie die Test-Payload an beide Ziele:
docker compose up -d
python3 secdos.py -u http://localhost:8080/api/submit
python3 secdos.py -u http://localhost:8081/api/submit
Das anfällige Ziel wird abstürzen und [PASS] zurückgeben. Das gepatchte Ziel wird die Anfrage sicher verarbeiten und [FAIL] zurückgeben.
Wenn Sie es erneut gegen den anfälligen Server ausführen, starten Sie ihn zuerst neu
Das Erstellen eines gepatchten Images aus dem Dockerfile erfordert ein Build-Argument PATCHED=1