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 {
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
Original file line number Diff line number Diff 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}
You can’t perform that action at this time.
0 commit comments