FlawOpen

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

Apakah lodash.merge() aman dari prototype pollution?

CWE-1321: Prototype PollutionPanduan referensi
Short answer

Bayangkan deep merge seperti menyalin label dari lemari arsip orang lain ke catatan utama aplikasi. Pada versi lama, jalur tertentu di Lodash dapat memperlakukan nama properti khusus sebagai petunjuk menuju state prototype bersama. Perbaikan baru memblokir jalur yang diketahui, tetapi menyalin semua field permintaan tetap berisiko menyebabkan mass assignment. Validasi field yang diterima aplikasi.

RENTAN — versi Lodash terdampak
const _ = require("lodash");

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

_.merge(settings, input);
_.set(settings, request.query.path, request.query.value);
DIPERKUAT — perbarui dan bentuk objek yang diketahui
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",
};

Cara kerja jalur kerentanan

Pada rilis yang terdampak, JSON tak tepercaya atau path yang dikendalikan pemanggil mencapai helper Lodash yang rentan. Merge rekursif atau operasi path salah menangani komponen khusus lalu mengubah atau menghapus properti pada prototype bawaan. Kode lain kemudian dapat membaca properti warisan itu; dampaknya bergantung pada properti dan gadget yang dapat dijangkau dalam aplikasi. Prototype pollution saja tidak membuktikan eksekusi kode jarak jauh.

Advisory npm lodash memiliki cakupan berbeda: CVE-2018-16487 berdampak pada defaultsDeep, merge, dan mergeWith sebelum 4.17.11; CVE-2019-10744 pada defaultsDeep sebelum 4.17.12; CVE-2020-8203 pada pick, set, setWith, update, updateWith, dan zipObjectDeep sebelum 4.17.19. CVE-2025-13465 berdampak pada unset dan omit hingga 4.17.22, diperbaiki di 4.17.23. CVE-2026-2950 kemudian berdampak pada dua metode itu di 4.17.23, diperbaiki di 4.18.0. Versi terbaru yang diperiksa untuk panduan ini adalah 4.18.1. Rentang ini khusus paket: periksa advisory lodash-es, paket modular, dan build distribusi OS secara terpisah.

Cara memeriksa dan memperbaiki dependensi

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

Perbarui salinan langsung dan transitif, simpan lockfile terbaru, dan periksa salinan vendor atau bundle. Jangan teruskan data permintaan langsung ke deep merge atau API path; buat objek baru dari field yang divalidasi dan diizinkan. Contoh ini menghindari kunci dan path yang dipilih penyerang. Per 2026-10-05, Lodash 4.18.1 adalah rilis terbaru; ikuti advisory untuk perbaikan berikutnya.

Pertanyaan umum

Apakah lodash.merge() aman pada versi terbaru?

Advisory yang diperiksa untuk paket npm lodash mencantumkan perbaikan terkait di rilis berikutnya; versi terbaru yang diperiksa di sini adalah 4.18.1. Selalu perbarui, periksa semua salinan terpasang, dan hindari merge seluruh body permintaan karena dapat menyebabkan mass assignment.

Apakah prototype pollution selalu menyebabkan eksekusi kode jarak jauh?

Tidak. Dampaknya mengubah atau menghapus properti warisan. Efek lanjut bergantung pada apa yang dibaca atau dipanggil kode aplikasi dan apakah ada gadget yang dapat dijangkau. Jelaskan dampak yang terbukti, jangan mengasumsikan RCE.

Apakah lodash-es dan paket lodash.* memiliki rentang versi yang sama?

Belum tentu. Advisory dapat menetapkan versi terdampak dan versi perbaikan berbeda untuk setiap paket. Periksa nama paket, entri lockfile, dan advisory secara tepat; jangan menerapkan rentang lodash pada semua distribusi.

Referensi

Lihat juga Prototype Pollution JavaScript: penyebab dan perbaikan Object.assign() dan Prototype Pollution: apa yang aman? Apakah JSON.parse() menyebabkan prototype pollution? Apakah JSON.parse() lebih aman daripada eval()?