flawopen.com/原型污染/lodash.merge()
lodash.merge() 能防止原型污染吗?
把深度合并想成把别人文件柜里的标签复制到应用的主记录中。旧版 Lodash 的某些路径可能把特殊属性名当作通往共享原型状态的指令。新修复会阻断已知路径,但复制请求中的所有字段仍可能造成批量赋值风险。请验证应用实际接受的字段。
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",
};
漏洞利用路径如何形成
在受影响版本中,不可信 JSON 或调用方控制的路径会进入有缺陷的 Lodash 辅助函数。递归合并或路径操作错误处理特殊路径组件,从而修改或删除内置原型上的属性。其他代码随后可能读取该继承属性;影响取决于属性本身以及应用中是否存在可达的 gadget。原型污染本身并不能证明可远程执行代码。
npm lodash 公告的范围各不相同:CVE-2018-16487 影响 4.17.11 之前的 defaultsDeep、merge 和 mergeWith;CVE-2019-10744 影响 4.17.12 之前的 defaultsDeep;CVE-2020-8203 影响 4.17.19 之前的 pick、set、setWith、update、updateWith 和 zipObjectDeep。CVE-2025-13465 影响至 4.17.22 的 unset 和 omit,在 4.17.23 修复。随后 CVE-2026-2950 影响 4.17.23 中这两个方法,在 4.18.0 修复。本指南最近核实的版本是 4.18.1。这些范围按包区分:请分别核对 lodash-es、模块化包和操作系统发行版的公告。
如何检查并修复依赖
npm install lodash@^4.18.1
npm ls lodash
npm audit
npm explain lodash
升级直接和传递依赖,提交更新后的 lockfile,并检查 vendored 或打包副本。不要把请求数据直接传入深度合并或路径 API;应从经过验证且允许的字段构造新对象。示例避免使用攻击者选择的键和路径。截至 2026-10-05,Lodash 最新版本为 4.18.1;后续安全修复请跟进项目公告。
常见问题
核查的 npm lodash 公告列出了后续版本中的相关修复;本指南核实的最新版本是 4.18.1。保持更新、检查所有已安装副本,并避免整体合并请求体,因为这仍可能导致批量赋值。
不会。它会修改或删除继承属性。影响取决于应用之后读取或调用什么,以及是否存在可达的 gadget。应描述已证实的影响,不要直接推断 RCE。
不一定。不同包的公告可能给出不同的受影响和修复版本。请核对确切包名、lockfile 条目和公告,不要把 lodash 的范围套用到所有发行包。