Skip to content

Commit d4daa21

Browse files
committed
JS: Add DOM event sources in Angular2 model
1 parent b8ba50a commit d4daa21

File tree

3 files changed

+27
-2
lines changed

3 files changed

+27
-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: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ edges
4242
| xss-through-dom.js:154:25:154:27 | msg | xss-through-dom.js:155:27:155:29 | msg | provenance | |
4343
| xss-through-dom.js:159:34:159:52 | $("textarea").val() | xss-through-dom.js:154:25:154:27 | msg | provenance | |
4444
nodes
45+
| angular.ts:11:24:11:41 | event.target.value | semmle.label | event.target.value |
46+
| angular.ts:15:24:15:35 | target.value | semmle.label | target.value |
4547
| forms.js:8:23:8:28 | values | semmle.label | values |
4648
| forms.js:9:31:9:36 | values | semmle.label | values |
4749
| forms.js:9:31:9:40 | values.foo | semmle.label | values.foo |
@@ -124,6 +126,8 @@ nodes
124126
| xss-through-dom.js:159:34:159:52 | $("textarea").val() | semmle.label | $("textarea").val() |
125127
subpaths
126128
#select
129+
| 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 |
130+
| 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 |
127131
| 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 |
128132
| 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 |
129133
| 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)