Skip to content

Commit 2d6d304

Browse files
committed
add InclusionTest to PostMessageEventSanitizer
1 parent e2badab commit 2d6d304

File tree

2 files changed

+25
-6
lines changed

2 files changed

+25
-6
lines changed

javascript/ql/lib/semmle/javascript/dataflow/TaintTracking.qll

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1225,19 +1225,25 @@ module TaintTracking {
12251225
* An equality test on `e.origin` or `e.source` where `e` is a `postMessage` event object,
12261226
* considered as a sanitizer for `e`.
12271227
*/
1228-
private class PostMessageEventSanitizer extends AdditionalSanitizerGuardNode, DataFlow::ValueNode {
1228+
private class PostMessageEventSanitizer extends AdditionalSanitizerGuardNode {
12291229
VarAccess event;
1230-
override EqualityTest astNode;
1230+
boolean polarity;
12311231

12321232
PostMessageEventSanitizer() {
1233-
exists(string prop | prop = "origin" or prop = "source" |
1234-
astNode.getAnOperand().(PropAccess).accesses(event, prop) and
1235-
event.mayReferToParameter(any(PostMessageEventHandler h).getEventParameter())
1233+
event.mayReferToParameter(any(PostMessageEventHandler h).getEventParameter()) and
1234+
exists(DataFlow::PropRead read | read.accesses(event.flow(), ["origin", "source"]) |
1235+
exists(EqualityTest test | polarity = test.getPolarity() and this.getAstNode() = test |
1236+
test.getAnOperand().flow() = read
1237+
)
1238+
or
1239+
exists(InclusionTest test | polarity = test.getPolarity() and this = test |
1240+
test.getContainedNode() = read
1241+
)
12361242
)
12371243
}
12381244

12391245
override predicate sanitizes(boolean outcome, Expr e) {
1240-
outcome = astNode.getPolarity() and
1246+
outcome = polarity and
12411247
e = event
12421248
}
12431249

javascript/ql/test/query-tests/Security/CWE-079/DomBasedXss/addEventListener.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,17 @@ function test() {
1414
}
1515

1616
window.addEventListener("message", foo.bind(null, {data: 'items'}));
17+
18+
window.onmessage = e => {
19+
if (e.origin !== "https://foobar.com") {
20+
return;
21+
}
22+
document.write(e.data); // OK - there is an origin check
23+
}
24+
25+
window.onmessage = e => {
26+
if (mySet.includes(e.origin)) {
27+
document.write(e.data); // OK - there is an origin check
28+
}
29+
}
1730
}

0 commit comments

Comments
 (0)