highCWE-1321A03:2021

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.

Código Vulnerable
// 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__'
  }
}
Código Seguro
// 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

Node.jsjavascript

Data Hogo detecta esta vulnerabilidad automáticamente.

Escanea Tu Repo Gratis

Vulnerabilidades Relacionadas