Skip to content

Commit 2830605

Browse files
committed
JS: Add DOM event sources in Angular2 model
1 parent 530f72e commit 2830605

File tree

3 files changed

+33
-2
lines changed

3 files changed

+33
-2
lines changed

javascript/ql/lib/semmle/javascript/frameworks/Angular2.qll

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -554,4 +554,25 @@ module Angular2 {
554554
this = API::Node::ofType("@angular/core", "ElementRef").getMember("nativeElement").asSource()
555555
}
556556
}
557+
558+
/**
559+
* A source of DOM events originating from the `$event` variable in an event handler installed in an Angular template.
560+
*/
561+
private class DomEventSources extends DOM::DomEventSource::Range {
562+
DomEventSources() {
563+
exists(HTML::Element elm, string attributeName |
564+
elm = any(ComponentClass cls).getATemplateElement() and
565+
// Ignore instantiations of known element (mainly focus on native DOM elements)
566+
not elm = any(ComponentClass cls).getATemplateInstantiation() and
567+
not elm.getName().matches("ng-%") and
568+
this =
569+
elm.getAttributeByName(attributeName)
570+
.getCodeInAttribute()
571+
.(TemplateTopLevel)
572+
.getAVariableUse("$event") and
573+
attributeName.matches("(%)") and // event handler attribute
574+
not attributeName.matches("(ng%)") // exclude NG events which aren't necessarily DOM events
575+
)
576+
}
577+
}
557578
}

javascript/ql/test/query-tests/Security/CWE-079/XssThroughDom/XssThroughDom.expected

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
11
nodes
2+
| angular.ts:11:24:11:41 | event.target.value |
3+
| angular.ts:11:24:11:41 | event.target.value |
4+
| angular.ts:11:24:11:41 | event.target.value |
5+
| angular.ts:15:24:15:35 | target.value |
6+
| angular.ts:15:24:15:35 | target.value |
7+
| angular.ts:15:24:15:35 | target.value |
28
| forms.js:8:23:8:28 | values |
39
| forms.js:8:23:8:28 | values |
410
| forms.js:9:31:9:36 | values |
@@ -165,6 +171,8 @@ nodes
165171
| xss-through-dom.js:159:34:159:52 | $("textarea").val() |
166172
| xss-through-dom.js:159:34:159:52 | $("textarea").val() |
167173
edges
174+
| angular.ts:11:24:11:41 | event.target.value | angular.ts:11:24:11:41 | event.target.value |
175+
| angular.ts:15:24:15:35 | target.value | angular.ts:15:24:15:35 | target.value |
168176
| forms.js:8:23:8:28 | values | forms.js:9:31:9:36 | values |
169177
| forms.js:8:23:8:28 | values | forms.js:9:31:9:36 | values |
170178
| forms.js:9:31:9:36 | values | forms.js:9:31:9:40 | values.foo |
@@ -273,6 +281,8 @@ edges
273281
| xss-through-dom.js:159:34:159:52 | $("textarea").val() | xss-through-dom.js:154:25:154:27 | msg |
274282
| xss-through-dom.js:159:34:159:52 | $("textarea").val() | xss-through-dom.js:154:25:154:27 | msg |
275283
#select
284+
| angular.ts:11:24:11:41 | event.target.value | angular.ts:11:24:11:41 | event.target.value | angular.ts:11:24:11:41 | event.target.value | $@ is reinterpreted as HTML without escaping meta-characters. | angular.ts:11:24:11:41 | event.target.value | DOM text |
285+
| angular.ts:15:24:15:35 | target.value | angular.ts:15:24:15:35 | target.value | angular.ts:15:24:15:35 | target.value | $@ is reinterpreted as HTML without escaping meta-characters. | angular.ts:15:24:15:35 | target.value | DOM text |
276286
| forms.js:9:31:9:40 | values.foo | forms.js:8:23:8:28 | values | forms.js:9:31:9:40 | values.foo | $@ is reinterpreted as HTML without escaping meta-characters. | forms.js:8:23:8:28 | values | DOM text |
277287
| forms.js:12:31:12:40 | values.bar | forms.js:11:24:11:29 | values | forms.js:12:31:12:40 | values.bar | $@ is reinterpreted as HTML without escaping meta-characters. | forms.js:11:24:11:29 | values | DOM text |
278288
| forms.js:25:23:25:34 | values.email | forms.js:24:15:24:20 | values | forms.js:25:23:25:34 | values.email | $@ is reinterpreted as HTML without escaping meta-characters. | forms.js:24:15:24:20 | values | DOM text |

javascript/ql/test/query-tests/Security/CWE-079/XssThroughDom/angular.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ import { Component } from "@angular/core";
88
})
99
export class Foo {
1010
setInput1(event) {
11-
document.write(event.target.value); // NOT OK [INCONSISTENCY]
11+
document.write(event.target.value); // NOT OK
1212
}
1313

1414
setInput2(target) {
15-
document.write(target.value); // NOT OK [INCONSISTENCY]
15+
document.write(target.value); // NOT OK
1616
}
1717
}

0 commit comments

Comments
 (0)