CVE-2019-10744的本质是lodash的merge、defaultsDeep、set等函数处理不可信输入时,将'__proto__.xxx'等键名误解析为原型链路径并写入Object.prototype,导致全局污染;该漏洞影响服务端与客户端,修复需结合输入过滤、白名单校验、升级至4.17.21+并配合customizer或改用安全替代方案。

明确哪些操作是污染入口
原型链污染不是随机发生的,它集中在几类高风险操作上。重点盯住:
• 使用 lodash.merge、_.set、_.defaultsDeep 处理用户输入(如 API 请求体、URL 查询参数、表单 JSON);
• 手动实现的递归赋值函数,尤其当键名来自外部数据时;
• 直接 JSON.parse() 含 {"__proto__": {...}} 或 {"constructor": {"prototype": {...}}} 的字符串后合并进配置对象;
• 第三方库中调用类似逻辑的工具方法(如某些低代码平台 SDK、旧版 axios 拦截器、自定义 deepAssign 工具)。
在关键节点做输入清洗与白名单控制
不能依赖“不传恶意数据”的侥幸。所有外部输入进入对象处理流程前必须过滤:
• 黑名单过滤:移除或拒绝包含 __proto__、constructor、prototype 及其大小写变体(如 __PROTO__、Constructor)的键名;
• 更推荐白名单:只允许明确业务需要的字段名(例如用户资料接口只接受 name、email、avatar),其余一概忽略;
• 对嵌套路径(如 "user.profile.admin")做分段校验,防止攻击者利用点号绕过单层过滤;
• 若使用 JSON 解析,可在 JSON.parse() 的第二个参数 reviver 中统一拦截敏感键。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
升级依赖并切换安全替代方案
别只看版本号,要确认行为是否真正修复:
• Lodash 升级到 4.17.21+,但注意:新版 merge 默认仍允许污染,需配合 customizer 或改用 assignInWith 控制;
• 优先用 Object.assign({}, input) 替代深合并,除非确实需要递归;
• 现代环境(Chrome 98+、Node.js 17+)直接用 structuredClone() 做安全深拷贝;
• Node.js 服务端可启动时加参数 --disable-proto=throw,让任何访问 __proto__ 的操作立即报错;
• 避免使用已知存在缺陷的旧库(如 hoek
运行时加固与主动监控
防御不止于编码阶段,上线后也需设防:
• 在应用入口最开始执行:
Object.freeze(Object.prototype);
Object.freeze(Function.prototype);
(注意:部分老旧浏览器或依赖劫持原型的库可能不兼容,建议先灰度验证);
• 对关键对象(如全局配置、用户上下文对象)用 Object.seal() 或 Object.freeze() 锁定,防止后续误改;
• 在开发和测试环境启用 Proxy 包裹 Object.prototype,记录所有异常属性写入尝试,便于快速定位污染源头;
• 安全扫描工具(如 npm audit、snyk test)应纳入 CI 流程,但报告仅作提示,必须人工确认调用点是否真实构成攻击面。
立即学习“Java免费学习笔记(深入)”;

















