FlawOpen

flawopen.com/Prototype Pollution/lodash.merge()

Ist lodash.merge() vor Prototype Pollution sicher?

CWE-1321: Prototype PollutionReferenzleitfaden
Short answer

Stell dir einen Deep Merge so vor, als würden Etiketten aus einem fremden Aktenschrank in die zentralen Datensätze deiner Anwendung kopiert. Ältere Lodash-Pfade konnten besondere Eigenschaftsnamen als Anweisungen zu gemeinsamem Prototypzustand behandeln. Neuere Fixes blockieren bekannte Pfade; alle Anfragefelder zu kopieren bleibt jedoch ein Mass-Assignment-Risiko. Prüfe die von der Anwendung akzeptierten Felder.

VERWUNDBAR — betroffene Lodash-Versionen
const _ = require("lodash");

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

_.merge(settings, input);
_.set(settings, request.query.path, request.query.value);
ABGESICHERT — aktualisieren und bekannte Form erzeugen
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",
};

So verläuft der Angriffspfad

Bei einer betroffenen Version erreicht nicht vertrauenswürdiges JSON oder ein vom Aufrufer kontrollierter Pfad eine verwundbare Lodash-Funktion. Ein rekursiver Merge oder eine Pfadoperation behandelt eine besondere Pfadkomponente falsch und ändert oder löscht eine Eigenschaft eines eingebauten Prototyps. Anderer Code kann diese geerbte Eigenschaft später lesen; die Wirkung hängt von der Eigenschaft und einem erreichbaren Gadget in der Anwendung ab. Prototype Pollution allein belegt keine Remote Code Execution.

Die npm-lodash-Advisories haben unterschiedliche Geltungsbereiche: CVE-2018-16487 betraf defaultsDeep, merge und mergeWith vor 4.17.11; CVE-2019-10744 betraf defaultsDeep vor 4.17.12; CVE-2020-8203 betraf pick, set, setWith, update, updateWith und zipObjectDeep vor 4.17.19. CVE-2025-13465 betraf unset und omit bis 4.17.22; behoben in 4.17.23. Danach betraf CVE-2026-2950 dieselben Methoden in 4.17.23; behoben in 4.18.0. Die für diesen Leitfaden zuletzt geprüfte Version ist 4.18.1. Diese Grenzen gelten paketbezogen: Prüfe Advisories für lodash-es, modulare Pakete und Betriebssystem-Builds separat.

Abhängigkeit prüfen und beheben

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

Aktualisiere direkte und transitive Kopien, speichere die aktualisierte Lockdatei und prüfe vendorte oder gebündelte Kopien. Übergib Anfragedaten weder direkt an Deep-Merge- noch an Pfad-APIs; erstelle ein neues Objekt aus geprüften, erlaubten Feldern. Das Beispiel vermeidet angreifergesteuerte Schlüssel und Pfade. Stand 2026-10-05 ist Lodash 4.18.1 die neueste Version; beachte spätere Security-Advisories.

Häufige Fragen

Ist lodash.merge() in der neuesten Version sicher?

Die geprüften Advisories für das npm-Paket lodash führen die relevanten Fixes in späteren Versionen auf; 4.18.1 ist die hier geprüfte neueste Version. Halte sie aktuell, prüfe alle installierten Kopien und merge keine vollständigen Request-Bodies, da dies Mass Assignment ermöglichen kann.

Führt Prototype Pollution immer zu Remote Code Execution?

Nein. Sie ändert oder löscht geerbte Eigenschaften. Die Auswirkung hängt davon ab, was der Anwendungscode anschließend liest oder aufruft und ob ein erreichbares Gadget existiert. Beschreibe nur die belegte Wirkung, nicht pauschal RCE.

Gelten für lodash-es und lodash.*-Pakete dieselben Versionsgrenzen?

Nicht unbedingt. Advisories können je Paket unterschiedliche betroffene und behobene Versionen nennen. Prüfe Paketname, Lockdatei und Advisory exakt; übertrage den lodash-Bereich nicht ungeprüft auf andere Distributionen.

Quellen

Siehe auch JavaScript Prototype Pollution: Ursachen und Schutz Object.assign() und Prototype Pollution: Was ist sicher? Verursacht JSON.parse() Prototype Pollution? Ist JSON.parse() sicherer als eval()?