diff --git a/lib/parse.js b/lib/parse.js index 731161e..707522d 100644 --- a/lib/parse.js +++ b/lib/parse.js @@ -126,6 +126,9 @@ function parsePlistXML (node) { ); new_obj[key] = parsePlistXML(node.childNodes[i]); } + if ( key === __proto__) { + key = '__proto__'; + } counter += 1; } if (counter % 2 === 1) { diff --git a/test/parse.js b/test/parse.js index 0dd10ba..da2b963 100644 --- a/test/parse.js +++ b/test/parse.js @@ -499,5 +499,27 @@ int main(int argc, char *argv[]) CFBundleAllowMixedLocalizations: true }); }); + it('fixed Prototype Pollution using .parse() #114', function () { + var xml = multiline(function () { + /* + var xmlPollution = ` + + + __proto__ + + length + polluted + + + `; + */ + }); + var parsed = parse(xml); + assert.deepEqual(parsed, { + __proto__: { + length: 'polluted' + } + }); + }); }); });