Skip to content

Commit

Permalink
fix(zipObjectDeep): prototype pollution
Browse files Browse the repository at this point in the history
  • Loading branch information
JackuB committed May 11, 2020
1 parent 0cec225 commit 787b42b
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 0 deletions.
4 changes: 4 additions & 0 deletions lodash.js
Expand Up @@ -3990,6 +3990,10 @@
var key = toKey(path[index]),
newValue = value;

if (key === '__proto__' || key === 'constructor' || key === 'prototype') {
return object;
}

if (index != lastIndex) {
var objValue = nested[key];
newValue = customizer ? customizer(objValue, key, nested) : undefined;
Expand Down
33 changes: 33 additions & 0 deletions test/test.js
Expand Up @@ -25787,6 +25787,39 @@
});
});

// zipObjectDeep prototype pollution
['__proto__', 'constructor', 'prototype'].forEach(function (keyToTest) {
QUnit.test('zipObjectDeep is not setting ' + keyToTest + ' on global', function (assert) {
assert.expect(1);

_.zipObjectDeep([keyToTest + '.a'], ['newValue']);
// Can't access plain `a` as it's not defined and test fails
assert.notEqual(root['a'], 'newValue');
});

QUnit.test('zipObjectDeep is not overwriting ' + keyToTest + ' on vars', function (assert) {
assert.expect(3);

const b = 'oldValue'
_.zipObjectDeep([keyToTest + '.b'], ['newValue']);
assert.equal(b, 'oldValue');
assert.notEqual(root['b'], 'newValue');

// ensure nothing was created
assert.notOk(root['b']);
});

QUnit.test('zipObjectDeep is not overwriting global.' + keyToTest, function (assert) {
assert.expect(2);

_.zipObjectDeep([root + '.' + keyToTest + '.c'], ['newValue']);
assert.notEqual(root['c'], 'newValue');

// ensure nothing was created
assert.notOk(root['c']);
});
});

/*--------------------------------------------------------------------------*/

QUnit.module('lodash.zipWith');
Expand Down

0 comments on commit 787b42b

Please sign in to comment.