Ecosyste.ms: Advisories
An open API service providing security vulnerability metadata for many open source software ecosystems.
Security Advisories: GSA_kwCzR0hTQS04Mmp2LTl3anctcHFoNs4AA7KU
Prototype pollution in emit function
Summary
A prototype pollution in derby can crash the application, if the application author has atypical HTML templates that feed user input into an object key.
Attribute keys are almost always developer-controlled, not end-user-controlled, so this shouldn't be an issue in practice for most applications.
Details
emit(context: Context, target: T) {
const node = traverseAndCreate(context.controller, this.segments);
node[this.lastSegment] = target;
this.addListeners(target, node, this.lastSegment);
}
The emit() function in src/templates/templates.ts is called without sanitizing the variable this.lastSegment
. The variable this.lastSegment
can be set to __proto__
, and this will pollute the prototype of Javascipt Object (node['__proto__'] = target
).
PoC
To reproduce this vulnerability, you can adjust the test case ignores DOM mutations in components\' create()
in test/dom/ComponentHarness.mocha.js
.
it('ignores DOM mutations in components\' create()', function() {
function Box() {}
Box.view = {
is: 'box',
- source: '<index:><div class="box" as="boxElement"></div>'
+ source: '<index:><div class="box" as="__proto__"></div>'
};
Box.prototype.create = function() {
this.boxElement.className = 'box-changed-in-create';
};
var harness = runner.createHarness('<view is="box" />', Box);
expect(harness).to.render('<div class="box"></div>');
});
When as
attribute is controlled by attackers, the variable in this.lastSegment
will exactly take value __proto__
and prototype pollution happens.
Patch
Add a check on this.lastSegment
can prevent this attack.
emit(context: Context, target: T) {
const node = traverseAndCreate(context.controller, this.segments);
+ if (this.lastSegment.includes('__proto__') || this.lastSegment.includes('prototype')) {
+ throw new Error('Unsafe code detected');
+ }
node[this.lastSegment] = target;
this.addListeners(target, node, this.lastSegment);
}
Permalink: https://github.com/advisories/GHSA-82jv-9wjw-pqh6JSON: https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS04Mmp2LTl3anctcHFoNs4AA7KU
Source: GitHub Advisory Database
Origin: Unspecified
Severity: Low
Classification: General
Published: 8 months ago
Updated: 8 months ago
Identifiers: GHSA-82jv-9wjw-pqh6
References:
- https://github.com/derbyjs/derby/security/advisories/GHSA-82jv-9wjw-pqh6
- https://github.com/derbyjs/derby/commit/24524e96f36976883c7c619811320428536bd4d0
- https://github.com/derbyjs/derby/commit/465a0c2f6a77361eda4a09b77a8c94ba6a9da440
- https://github.com/advisories/GHSA-82jv-9wjw-pqh6
Blast Radius: 0.0
Affected Packages
npm:derby
Dependent packages: 29Dependent repositories: 252
Downloads: 1,401 last month
Affected Version Ranges: >= 4.0.0-beta1, <= 4.0.0-beta.10, >= 3.0.0, <= 3.0.1, <= 2.3.1
Fixed in: 4.0.0-beta.11, 3.0.2, 2.3.2
All affected versions: 0.0.1, 0.0.2, 0.0.3, 0.0.4, 0.0.5, 0.0.6, 0.0.7, 0.0.8, 0.0.9, 0.0.10, 0.1.0, 0.1.1, 0.1.2, 0.1.3, 0.1.4, 0.1.5, 0.1.6, 0.1.7, 0.1.8, 0.1.9, 0.1.10, 0.3.0, 0.3.1, 0.3.2, 0.3.3, 0.3.4, 0.3.5, 0.3.6, 0.3.7, 0.3.8, 0.3.9, 0.3.10, 0.3.11, 0.3.12, 0.3.13, 0.3.14, 0.3.15, 0.3.16, 0.3.17, 0.3.18, 0.3.19, 0.5.0, 0.5.1, 0.5.2, 0.5.3, 0.5.4, 0.5.5, 0.5.6, 0.5.7, 0.5.9, 0.5.10, 0.5.11, 0.5.12, 0.5.16, 0.7.1, 0.8.0, 0.8.1, 0.8.2, 0.8.3, 0.8.4, 0.8.5, 0.9.0, 0.9.1, 0.9.2, 0.9.3, 0.9.4, 0.9.5, 0.9.6, 0.9.7, 0.10.0, 0.10.1, 0.10.2, 0.10.3, 0.10.4, 0.10.5, 0.10.8, 0.10.9, 0.10.10, 0.10.11, 0.10.12, 0.10.13, 0.10.14, 0.10.15, 0.10.16, 0.10.17, 0.10.18, 0.10.19, 0.10.20, 0.10.21, 0.10.22, 0.10.23, 0.10.24, 0.10.25, 0.10.26, 0.10.27, 0.10.28, 0.10.29, 0.10.30, 0.10.31, 1.0.0, 1.0.1, 1.1.0, 2.0.0, 2.0.1, 2.0.2, 2.0.3, 2.1.0, 2.2.0, 2.3.0, 2.3.1, 3.0.0, 3.0.1
All unaffected versions: 2.3.2, 2.3.3, 3.0.2, 3.0.3, 4.0.0, 4.1.0, 4.1.1, 4.1.2, 4.1.3, 4.2.0, 4.2.1, 4.2.2, 4.2.3