@@ -90,13 +90,22 @@ module DynamicCreation {
90
90
call .getArgument ( 0 ) .getStringValue ( ) .toLowerCase ( ) = name
91
91
}
92
92
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
+
93
102
/**
94
103
* Holds if `createCall` creates a `<script ../>` element which never
95
104
* has its `integrity` attribute set locally.
96
105
*/
97
106
predicate isCreateScriptNodeWoIntegrityCheck ( DataFlow:: CallNode createCall ) {
98
107
isCreateElementNode ( createCall , "script" ) and
99
- not exists ( createCall . getAPropertyWrite ( "integrity" ) )
108
+ not exists ( getAttributeAssignmentRhs ( createCall , "integrity" ) )
100
109
}
101
110
102
111
DataFlow:: Node urlTrackedFromUnsafeSourceLiteral ( DataFlow:: TypeTracker t ) {
@@ -126,15 +135,17 @@ module DynamicCreation {
126
135
result = urlTrackedFromUnsafeSourceLiteral ( DataFlow:: TypeTracker:: end ( ) )
127
136
}
128
137
138
+ /** Holds if `sink` is assigned to the attribute `name` of any HTML element. */
129
139
predicate isAssignedToSrcAttribute ( string name , DataFlow:: Node sink ) {
130
140
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
+ )
138
149
)
139
150
}
140
151
@@ -143,8 +154,8 @@ module DynamicCreation {
143
154
144
155
IframeOrScriptSrcAssignment ( ) {
145
156
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 ( )
148
159
)
149
160
}
150
161
0 commit comments