事件
七月 2 日,Snyk 报告了一个 lodash 潜在的安全风险,该风险可能导致用户代码被用以执行有危险的脚本。
缘由
据报告,lodash 的 defaultsDeep 方法可能会被欺骗导致 Object 对象原型链被污染
原理
原理代码
const mergeFn = require('lodash').defaultsDeep;
const payload = '{"constructor": {"prototype": {"a0": true}} }';
function check() {mergeFn({}, JSON.parse(payload));
if (({})['a0'] === true) {console.log(`Vulnerable to Prototype Pollution via ${payload}`);
}
}
check();
原理讲解
很明显的可以看出,该方法是利用了 lodash.defaultsDeep 深拷贝未过滤危险对象成员 constructor 来达到污染原型链的目的。
使用 JavaScript 作为编程语言的人对原型继承方法并不陌生,js object 的构造器为 Object, Object 的原型链上挂载的内容可以被所有 js object 所继承。
因此,如果对 js 对象深度拷贝了有危险的 json 字符串所构造出的 js 对象,将会把污染扩大到程序全局。
修复
Snyk 的工程师 Kirll 已经给 lodash 开源库推送了一条修改, 具体修改为
原文章
snyk 报道