Contaminación de Prototipo
Hacer merge de objetos controlados por el usuario sin filtrar permite que atacantes modifiquen Object.prototype y afecten todos los objetos de la app.
Cómo Funciona
Los objetos de JavaScript heredan de Object.prototype. Si haces un deep merge de un payload como { '__proto__': { 'admin': true } }, acabas de poner admin=true en todos los objetos del proceso. Esto puede saltarse verificaciones de autorización, tirar la app o habilitar ejecución remota de código en algunos frameworks.
// MAL: deep merge sin filtrar __proto__
function merge(target, source) {
for (const key in source) {
if (typeof source[key] === 'object') merge(target[key], source[key]);
else target[key] = source[key]; // contamina si key es '__proto__'
}
}// BIEN: ignorar las keys peligrosas durante el merge
function merge(target, source) {
for (const key in source) {
if (key === '__proto__' || key === 'constructor' || key === 'prototype') continue;
if (typeof source[key] === 'object') merge(target[key] ?? {}, source[key]);
else target[key] = source[key];
}
}Ejemplo Real
CVE-2019-10744 afectó las funciones merge() y defaultsDeep() de lodash, usadas por millones de proyectos. Un atacante podía mandar un JSON body manipulado a cualquier API que usara lodash merge y modificar el estado global de la aplicación.
Cómo Prevenirlo
- Filtra las keys '__proto__', 'constructor' y 'prototype' antes de cualquier deep merge
- Usa Object.create(null) para crear objetos sin prototipo cuando mergeas datos de usuarios
- Prefiere structuredClone() o JSON.parse(JSON.stringify()) sobre un deep merge custom
- Mantén lodash y librerías similares actualizadas — los parches de prototype pollution son frecuentes
Tecnologías Afectadas
Data Hogo detecta esta vulnerabilidad automáticamente.
Escanea Tu Repo GratisVulnerabilidades Relacionadas
ReDoS (Denegación de Servicio por Regex)
mediumLas expresiones regulares con cuantificadores anidados pueden tomar tiempo exponencial con ciertos inputs, congelando el event loop de Node.js.
Aleatoriedad Insegura
highUsar Math.random() para valores sensibles como tokens o IDs es predecible y puede romperse por fuerza bruta.
Service Worker Malicioso
mediumUn service worker registrado sin restricciones de scope puede interceptar todas las requests de red de un dominio, incluyendo las de otras páginas.