flawopen.com/Contaminación de prototipos/lodash.merge()
¿lodash.merge() causa contaminación de prototipos?
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.
const _ = require("lodash");
const settings = {};
const input = request.body;
_.merge(settings, input);
_.set(settings, request.query.path, request.query.value);
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
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.
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.
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
- Aviso de GitHub — CVE-2018-16487
- Aviso de GitHub — CVE-2019-10744
- Aviso de GitHub — CVE-2020-8203
- Aviso de GitHub — CVE-2025-13465
- Aviso de Lodash — CVE-2026-2950
- Lanzamiento Lodash 4.18.1 y registro de seguridad
- CWE-1321 — Contaminación de prototipos
- ¿Qué es la contaminación de prototipos?
- ¿Qué es la asignación masiva?