File tree Expand file tree Collapse file tree 2 files changed +25
-6
lines changed
lib/semmle/javascript/dataflow
test/query-tests/Security/CWE-079/DomBasedXss Expand file tree Collapse file tree 2 files changed +25
-6
lines changed Original file line number Diff line number Diff line change @@ -1225,19 +1225,25 @@ module TaintTracking {
1225
1225
* An equality test on `e.origin` or `e.source` where `e` is a `postMessage` event object,
1226
1226
* considered as a sanitizer for `e`.
1227
1227
*/
1228
- private class PostMessageEventSanitizer extends AdditionalSanitizerGuardNode , DataFlow :: ValueNode {
1228
+ private class PostMessageEventSanitizer extends AdditionalSanitizerGuardNode {
1229
1229
VarAccess event ;
1230
- override EqualityTest astNode ;
1230
+ boolean polarity ;
1231
1231
1232
1232
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
+ )
1236
1242
)
1237
1243
}
1238
1244
1239
1245
override predicate sanitizes ( boolean outcome , Expr e ) {
1240
- outcome = astNode . getPolarity ( ) and
1246
+ outcome = polarity and
1241
1247
e = event
1242
1248
}
1243
1249
Original file line number Diff line number Diff line change @@ -14,4 +14,17 @@ function test() {
14
14
}
15
15
16
16
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
+ }
17
30
}
You can’t perform that action at this time.
0 commit comments