事件
七月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开源库推送了一条修改,具体修改为
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。