
Proof-of-concept exploit per CVE-2026-8161, una vulnerabilità denial-of-service nel parser multipart di multiparty, che dimostra la prototype pollution che porta a un'eccezione non gestita e al crash.
Prova di concetto di CVE-2026-8161 (Multiparty)
[email protected] e versioni precedenti sono vulnerabili a denial of service tramite un'eccezione non gestita.
Il parser memorizza i campi e i file caricati in normali oggetti JavaScript e non distingue in modo sicuro le chiavi di proprietà del parser dalle proprietà ereditate dell'oggetto. Un nome di campo multipart appositamente creato può indurre il parser a leggere valori imprevisti dalla catena dei prototipi e a crashare durante la gestione del caricamento.
Qualsiasi servizio che accetta caricamenti multipart tramite versioni vulnerabili di multiparty può essere interessato.
Il problema si verifica perché fields e files sono normali oggetti JavaScript, ma vengono usati come mappe sicure chiave-valore per nomi controllati dall'utente.
var fieldsArray = fields[name] || (fields[name] = [])
fieldsArray.push(value)
var filesArray = files[name] || (files[name] = [])
filesArray.push(file)
Il problema è che e usano una normale ricerca di proprietà JavaScript. Per gli oggetti semplici, quella ricerca può restituire proprietà ereditate dalla catena dei prototipi invece di soli valori memorizzati sull'oggetto stesso.
fields[name]files[name]Quando name è __proto__, JavaScript può risolverlo attraverso la catena dei prototipi e restituire l'oggetto prototipo ereditato invece di undefined. Poiché quel valore è truthy, l'assegnazione di fallback viene saltata e il parser non crea mai un vero array per quel campo.
La patch risolve il problema fidandosi solo delle chiavi che appartengono direttamente all'oggetto:
var filesArray = Object.prototype.hasOwnProperty.call(files, name)
? files[name]
: undefined
Poi il parser aggiunge solo quando il valore memorizzato è effettivamente un array, altrimenti ne inizializza uno nuovo:
if (Array.isArray(filesArray)) {
filesArray.push(file)
} else {
files[name] = [file]
}
Quando .push() viene chiamato su un valore che non è un array, viene lanciato un TypeError. Poiché ciò accade all'interno del flusso di parsing asincrono di Multiparty, la normale gestione degli errori lato chiamante potrebbe non intercettarlo, consentendo all'eccezione di crashare il processo.
Object.prototype.hasOwnProperty.call(...).Esegui l'ambiente mocklab e invia il payload di test a entrambi i target:
docker compose up -d
python3 secdos.py -u http://localhost:8080/api/submit
python3 secdos.py -u http://localhost:8081/api/submit
Il target vulnerabile crasha e restituisce [PASS]. Il target corretto gestisce la richiesta in modo sicuro e restituisce [FAIL].
Se riesegui contro il server vulnerabile, riavvialo prima
La creazione di un'immagine corretta dal dockerfile richiede un build arg PATCHED=1