
Prueba de concepto de exploit para CVE-2026-8161, una vulnerabilidad de denegación de servicio en el analizador multipart de multiparty, que demuestra la contaminación de prototipos que provoca una excepción no capturada y un bloqueo del sistema.
Prueba de concepto de CVE-2026-8161 (Multiparty)
[email protected] y versiones anteriores son vulnerables a denegación de servicio mediante una excepción no capturada.
El analizador almacena los campos y archivos subidos en objetos JavaScript simples y no distingue de forma segura las claves propias del analizador de las propiedades heredadas del objeto. Un nombre de campo multipart manipulado puede hacer que el analizador lea valores inesperados de la cadena de prototipos y falle al procesar la subida.
Cualquier servicio que acepte subidas multipart a través de versiones vulnerables de multiparty puede verse afectado.
El problema ocurre porque fields y files son objetos JavaScript simples, pero se usan como mapas seguros de clave-valor para nombres controlados por el usuario.
var fieldsArray = fields[name] || (fields[name] = [])
fieldsArray.push(value)
var filesArray = files[name] || (files[name] = [])
filesArray.push(file)
El problema es que fields[name] y utilizan una búsqueda normal de propiedades de JavaScript. Para objetos simples, esa búsqueda puede devolver propiedades heredadas de la cadena de prototipos en lugar de solo valores almacenados en el propio objeto.
files[name]Cuando el nombre es __proto__, JavaScript puede resolverlo a través de la cadena de prototipos y devolver el objeto prototipo heredado en lugar de undefined. Dado que ese valor es verdadero, se omite la asignación de respaldo y el analizador nunca crea un array real para ese campo.
El parche soluciona esto confiando únicamente en claves que pertenecen directamente al objeto:
var filesArray = Object.prototype.hasOwnProperty.call(files, name)
? files[name]
: undefined
Luego, el analizador solo agrega cuando el valor almacenado es realmente un array; de lo contrario, inicializa uno nuevo:
if (Array.isArray(filesArray)) {
filesArray.push(file)
} else {
files[name] = [file]
}
Cuando se llama a .push() sobre un valor que no es un array, se lanza un TypeError. Debido a que esto ocurre dentro del flujo de análisis asíncrono de Multiparty, el manejo de errores normal del lado del llamador puede no capturarlo, permitiendo que la excepción bloquee el proceso.
Object.prototype.hasOwnProperty.call(...).Ejecute el entorno mocklab y envíe la carga útil de prueba a ambos objetivos:
docker compose up -d
python3 secdos.py -u http://localhost:8080/api/submit
python3 secdos.py -u http://localhost:8081/api/submit
El objetivo vulnerable fallará y devolverá [PASS]. El objetivo parcheado manejará la solicitud de forma segura y devolverá [FAIL].
Si vuelve a ejecutar contra el servidor vulnerable, reinícielo primero
Construir una imagen parcheada desde el dockerfile requiere un argumento de compilación PATCHED=1