Object對象原型污染

事件

七月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報道

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章