漏洞
原型链污染
别称: Object.prototype 污染, __proto__ 注入
定义
JavaScript 漏洞,攻击者通过不可信输入修改 Object.prototype,向所有对象注入属性,从而改变应用行为甚至导致 RCE。
原型链污染利用 JavaScript 的原型链:在 merge/clone/assign 操作中设置 __proto__、constructor.prototype 或 prototype 等键,攻击者可改变 Object.prototype,使所有普通对象继承这些属性。该问题常出现于递归合并工具、深拷贝函数、查询字符串解析器或接受用户 JSON 的模板引擎中。后果包括拒绝服务、认证绕过,以及当被污染的属性影响安全相关查询(isAdmin、sandbox、渲染选项等)时的远程代码执行。具有代表性的 CVE 包括 lodash CVE-2019-10744 以及众多 Node.js 库的漏洞。缓解措施包括拒绝 __proto__/constructor 键、对不可信数据使用 Map 或 Object.create(null)、对原型 Object.freeze,并选择更安全的库。
示例
- 向使用 JSON merge 的端点发送 {"__proto__":{"isAdmin":true}},从而在全局获得管理员权限。
- 污染原型以更改模板渲染选项并触发 RCE。