@@ -90,13 +90,22 @@ module DynamicCreation {
9090 call .getArgument ( 0 ) .getStringValue ( ) .toLowerCase ( ) = name
9191 }
9292
93+ DataFlow:: Node getAttributeAssignmentRhs ( DataFlow:: CallNode createCall , string name ) {
94+ result = createCall .getAPropertyWrite ( name ) .getRhs ( )
95+ or
96+ exists ( DataFlow:: InvokeNode inv | inv = createCall .getAMemberInvocation ( "setAttribute" ) |
97+ inv .getArgument ( 0 ) .getStringValue ( ) = name and
98+ result = inv .getArgument ( 1 )
99+ )
100+ }
101+
93102 /**
94103 * Holds if `createCall` creates a `<script ../>` element which never
95104 * has its `integrity` attribute set locally.
96105 */
97106 predicate isCreateScriptNodeWoIntegrityCheck ( DataFlow:: CallNode createCall ) {
98107 isCreateElementNode ( createCall , "script" ) and
99- not exists ( createCall . getAPropertyWrite ( "integrity" ) )
108+ not exists ( getAttributeAssignmentRhs ( createCall , "integrity" ) )
100109 }
101110
102111 DataFlow:: Node urlTrackedFromUnsafeSourceLiteral ( DataFlow:: TypeTracker t ) {
@@ -126,15 +135,17 @@ module DynamicCreation {
126135 result = urlTrackedFromUnsafeSourceLiteral ( DataFlow:: TypeTracker:: end ( ) )
127136 }
128137
138+ /** Holds if `sink` is assigned to the attribute `name` of any HTML element. */
129139 predicate isAssignedToSrcAttribute ( string name , DataFlow:: Node sink ) {
130140 exists ( DataFlow:: CallNode createElementCall |
131- name = "script" and
132- isCreateScriptNodeWoIntegrityCheck ( createElementCall ) and
133- sink = createElementCall .getAPropertyWrite ( "src" ) .getRhs ( )
134- or
135- name = "iframe" and
136- isCreateElementNode ( createElementCall , "iframe" ) and
137- sink = createElementCall .getAPropertyWrite ( "src" ) .getRhs ( )
141+ sink = getAttributeAssignmentRhs ( createElementCall , "src" ) and
142+ (
143+ name = "script" and
144+ isCreateScriptNodeWoIntegrityCheck ( createElementCall )
145+ or
146+ name = "iframe" and
147+ isCreateElementNode ( createElementCall , "iframe" )
148+ )
138149 )
139150 }
140151
@@ -143,8 +154,8 @@ module DynamicCreation {
143154
144155 IframeOrScriptSrcAssignment ( ) {
145156 exists ( DataFlow:: Node n | n .asExpr ( ) = this |
146- DynamicCreation :: isAssignedToSrcAttribute ( name , n ) and
147- n = DynamicCreation :: urlTrackedFromUnsafeSourceLiteral ( )
157+ isAssignedToSrcAttribute ( name , n ) and
158+ n = urlTrackedFromUnsafeSourceLiteral ( )
148159 )
149160 }
150161
0 commit comments