Skip to content

Commit 6947e99

Browse files
jorgectfKwstubbs
andcommitted
Add models for webix
Co-authored-by: Kevin Stubbings <[email protected]>
1 parent 318a60b commit 6947e99

File tree

9 files changed

+145
-77
lines changed

9 files changed

+145
-77
lines changed

javascript/ql/lib/javascript.qll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ import semmle.javascript.frameworks.TrustedTypes
134134
import semmle.javascript.frameworks.UriLibraries
135135
import semmle.javascript.frameworks.Vue
136136
import semmle.javascript.frameworks.Vuex
137+
import semmle.javascript.frameworks.Webix
137138
import semmle.javascript.frameworks.WebSocket
138139
import semmle.javascript.frameworks.XmlParsers
139140
import semmle.javascript.frameworks.xUnit

javascript/ql/lib/semmle/javascript/Extend.qll

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,8 @@ private class ExtendCallDeep extends ExtendCall {
9696
callee = LodashUnderscore::member("merge") or
9797
callee = LodashUnderscore::member("mergeWith") or
9898
callee = LodashUnderscore::member("defaultsDeep") or
99-
callee = AngularJS::angular().getAPropertyRead("merge")
99+
callee = AngularJS::angular().getAPropertyRead("merge") or
100+
callee = DataFlow::moduleImport("webix").getAPropertyRead("extend")
100101
)
101102
}
102103

javascript/ql/lib/semmle/javascript/security/dataflow/CodeInjectionCustomizations.qll

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,13 @@ module CodeInjection {
312312
}
313313
}
314314

315+
/**
316+
* A value interpreted as code by the `webix` library.
317+
*/
318+
class WebixExec extends Sink {
319+
WebixExec() { this = DataFlow::moduleImport("webix").getAMemberCall("exec").getArgument(0) }
320+
}
321+
315322
/** A sink for code injection via template injection. */
316323
abstract private class TemplateSink extends Sink {
317324
deprecated override string getMessageSuffix() {
@@ -419,6 +426,23 @@ module CodeInjection {
419426
}
420427
}
421428

429+
/**
430+
* A value interpreted as a template by the `webix` library.
431+
*/
432+
class WebixTemplateSink extends TemplateSink {
433+
WebixTemplateSink() {
434+
this = DataFlow::moduleImport("webix").getAMemberCall("ui").getOptionArgument(0, "template")
435+
or
436+
this.asExpr() =
437+
DataFlow::moduleImport("webix")
438+
.getAMemberCall("ui")
439+
.getOptionArgument(0, "template")
440+
.asExpr()
441+
.(Function)
442+
.getAReturnedExpr()
443+
}
444+
}
445+
422446
/**
423447
* A call to JSON.stringify() seen as a sanitizer.
424448
*/

javascript/ql/lib/semmle/javascript/security/dataflow/PrototypePollutionCustomizations.qll

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,5 +171,9 @@ module PrototypePollution {
171171
call.isDeep() and
172172
call = AngularJS::angular().getAMemberCall("merge") and
173173
id = "angular"
174+
or
175+
call.isDeep() and
176+
call = DataFlow::moduleImport("webix").getAMemberCall("extend") and
177+
id = "webix"
174178
}
175179
}

javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/CodeInjection.expected

Lines changed: 90 additions & 75 deletions
Large diffs are not rendered by default.

javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/template-sinks.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,11 @@ import * as mustache from 'mustache';
1010
const Hogan = require("hogan.js");
1111
import * as Eta from 'eta';
1212
import * as Sqrl from 'squirrelly'
13+
import * as webix from "webix";
1314

1415
var app = express();
1516

16-
app.get('/some/path', function(req, res) {
17+
app.get('/some/path', function (req, res) {
1718
let tainted = req.query.foo;
1819

1920
pug.compile(tainted); // NOT OK
@@ -30,4 +31,6 @@ app.get('/some/path', function(req, res) {
3031
Hogan.compile(tainted); // NOT OK
3132
Eta.render(tainted); // NOT OK
3233
Sqrl.render(tainted); // NOT OK
34+
webix.ui({ template: tainted }); // NOT OK
35+
webix.ui({ template: function () { return tainted } }) // NOT OK
3336
});
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import * as webix from 'webix';
2+
3+
webix.exec(document.location.hash); // NOT OK

javascript/ql/test/query-tests/Security/CWE-915/PrototypePollutingMergeCall/PrototypePollutingMergeCall.expected

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,12 @@ nodes
1717
| src-vulnerable-lodash/tst.js:17:17:19:5 | {\\n ... K\\n } |
1818
| src-vulnerable-lodash/tst.js:17:17:19:5 | {\\n ... K\\n } |
1919
| src-vulnerable-lodash/tst.js:18:16:18:25 | opts.thing |
20+
| webix.js:3:30:3:34 | event |
21+
| webix.js:3:30:3:34 | event |
22+
| webix.js:4:22:4:43 | JSON.pa ... t.data) |
23+
| webix.js:4:22:4:43 | JSON.pa ... t.data) |
24+
| webix.js:4:33:4:37 | event |
25+
| webix.js:4:33:4:42 | event.data |
2026
edges
2127
| angularmerge.js:1:30:1:34 | event | angularmerge.js:2:32:2:36 | event |
2228
| angularmerge.js:1:30:1:34 | event | angularmerge.js:2:32:2:36 | event |
@@ -32,8 +38,14 @@ edges
3238
| src-vulnerable-lodash/tst.js:15:14:15:28 | req.query.value | src-vulnerable-lodash/tst.js:18:16:18:25 | opts.thing |
3339
| src-vulnerable-lodash/tst.js:18:16:18:25 | opts.thing | src-vulnerable-lodash/tst.js:17:17:19:5 | {\\n ... K\\n } |
3440
| src-vulnerable-lodash/tst.js:18:16:18:25 | opts.thing | src-vulnerable-lodash/tst.js:17:17:19:5 | {\\n ... K\\n } |
41+
| webix.js:3:30:3:34 | event | webix.js:4:33:4:37 | event |
42+
| webix.js:3:30:3:34 | event | webix.js:4:33:4:37 | event |
43+
| webix.js:4:33:4:37 | event | webix.js:4:33:4:42 | event.data |
44+
| webix.js:4:33:4:42 | event.data | webix.js:4:22:4:43 | JSON.pa ... t.data) |
45+
| webix.js:4:33:4:42 | event.data | webix.js:4:22:4:43 | JSON.pa ... t.data) |
3546
#select
3647
| angularmerge.js:2:21:2:42 | JSON.pa ... t.data) | angularmerge.js:1:30:1:34 | event | angularmerge.js:2:21:2:42 | JSON.pa ... t.data) | Prototype pollution caused by merging a $@ using a vulnerable version of $@. | angularmerge.js:1:30:1:34 | event | user-controlled value | angularmerge.js:2:3:2:43 | angular ... .data)) | angular |
3748
| src-vulnerable-lodash/tst.js:7:17:7:29 | req.query.foo | src-vulnerable-lodash/tst.js:7:17:7:29 | req.query.foo | src-vulnerable-lodash/tst.js:7:17:7:29 | req.query.foo | Prototype pollution caused by merging a $@ using a vulnerable version of $@. | src-vulnerable-lodash/tst.js:7:17:7:29 | req.query.foo | user-controlled value | src-vulnerable-lodash/package.json:3:19:3:26 | "4.17.4" | lodash |
3849
| src-vulnerable-lodash/tst.js:10:17:12:5 | {\\n ... K\\n } | src-vulnerable-lodash/tst.js:11:16:11:30 | req.query.value | src-vulnerable-lodash/tst.js:10:17:12:5 | {\\n ... K\\n } | Prototype pollution caused by merging a $@ using a vulnerable version of $@. | src-vulnerable-lodash/tst.js:11:16:11:30 | req.query.value | user-controlled value | src-vulnerable-lodash/package.json:3:19:3:26 | "4.17.4" | lodash |
3950
| src-vulnerable-lodash/tst.js:17:17:19:5 | {\\n ... K\\n } | src-vulnerable-lodash/tst.js:15:14:15:28 | req.query.value | src-vulnerable-lodash/tst.js:17:17:19:5 | {\\n ... K\\n } | Prototype pollution caused by merging a $@ using a vulnerable version of $@. | src-vulnerable-lodash/tst.js:15:14:15:28 | req.query.value | user-controlled value | src-vulnerable-lodash/package.json:3:19:3:26 | "4.17.4" | lodash |
51+
| webix.js:4:22:4:43 | JSON.pa ... t.data) | webix.js:3:30:3:34 | event | webix.js:4:22:4:43 | JSON.pa ... t.data) | Prototype pollution caused by merging a $@ using a vulnerable version of $@. | webix.js:3:30:3:34 | event | user-controlled value | webix.js:4:5:4:44 | webix.e ... .data)) | webix |
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import * as webix from "webix";
2+
3+
addEventListener("message", (event) => {
4+
webix.extend({}, JSON.parse(event.data)); // NOT OK
5+
});

0 commit comments

Comments
 (0)