FlawOpen

flawopen.com/Contaminación de prototipos/lodash.merge()

¿lodash.merge() causa contaminación de prototipos?

CWE-1321: Prototype PollutionGuía de referencia
Short answer

Imagina que una combinación profunda copia etiquetas de un archivador ajeno a los registros maestros de tu aplicación. En versiones antiguas, ciertas rutas de Lodash podían tratar nombres especiales de propiedades como instrucciones para alcanzar el estado compartido de los prototipos. Las correcciones bloquean rutas conocidas, pero copiar todos los campos de una petición aún permite asignación masiva. Valida los campos que acepta la aplicación.

VULNERABLE — versiones afectadas de Lodash
const _ = require("lodash");

const settings = {};
const input = request.body;

_.merge(settings, input);
_.set(settings, request.query.path, request.query.value);
CORREGIDO — actualizar y construir una forma conocida
const allowedLocales = new Set(["en", "fr"]);
const input = request.body;

const settings = {
  theme: input.theme === "dark" ? "dark" : "light",
  locale: allowedLocales.has(input.locale)
    ? input.locale
    : "en",
};

Cómo funciona la ruta de vulnerabilidad

En una versión afectada, JSON no confiable o una ruta controlada por quien llama llega a una función vulnerable de Lodash. Una combinación recursiva o una operación de rutas maneja mal un componente especial y modifica o elimina una propiedad de un prototipo integrado. Otro código puede leer después esa propiedad heredada; el efecto depende de la propiedad y del gadget alcanzable en la aplicación. La contaminación de prototipos por sí sola no demuestra ejecución remota de código.

Los advisories del paquete npm lodash tienen alcances distintos: CVE-2018-16487 afectó a defaultsDeep, merge y mergeWith antes de 4.17.11; CVE-2019-10744 afectó a defaultsDeep antes de 4.17.12; CVE-2020-8203 afectó a pick, set, setWith, update, updateWith y zipObjectDeep antes de 4.17.19. CVE-2025-13465 afectó a unset y omit hasta 4.17.22; se corrigió en 4.17.23. Después, CVE-2026-2950 afectó a esas dos funciones en 4.17.23 y se corrigió en 4.18.0. La versión más reciente consultada para esta guía es 4.18.1. Estos rangos dependen del paquete: revisa por separado los advisories de lodash-es, los paquetes modulares y las distribuciones del sistema operativo.

Cómo comprobar y corregir la dependencia

npm install lodash@^4.18.1 npm ls lodash npm audit npm explain lodash

Actualiza las copias directas y transitivas, registra el lockfile actualizado e inspecciona las copias vendorizadas o incluidas en los bundles. No pases datos de solicitudes directamente a combinaciones profundas ni a APIs de rutas; crea un objeto con campos validados y permitidos. El ejemplo evita claves y rutas elegidas por el atacante. A fecha de 2026-10-05, Lodash 4.18.1 es la versión más reciente; sigue los advisories para futuras correcciones.

Preguntas frecuentes

¿lodash.merge() es seguro en la versión más reciente?

Los advisories revisados para el paquete npm lodash incluyen las correcciones pertinentes en versiones posteriores; 4.18.1 es la versión más reciente consultada aquí. Mantenla actualizada, comprueba todas las copias instaladas y evita combinar cuerpos de petición completos porque puede producir asignación masiva.

¿La contaminación de prototipos siempre permite ejecución remota de código?

No. La contaminación modifica o elimina propiedades heredadas. El impacto depende de lo que el código lea o invoque después y de si existe un gadget alcanzable. Describe el efecto comprobado, sin asumir RCE.

¿lodash-es y los paquetes lodash.* tienen los mismos rangos?

No necesariamente. Cada advisory puede indicar versiones afectadas y corregidas distintas. Comprueba el nombre exacto del paquete, el lockfile y el advisory; no extrapoles el rango de lodash a todas las distribuciones.

Referencias

Véase también Contaminación de prototipos JS: causas y solución Object.assign() y Prototype Pollution: ¿qué es seguro? ¿JSON.parse() causa contaminación de prototipos? ¿JSON.parse() es más seguro que eval()?