@@ -36,6 +36,20 @@ string headerAllowOrigin() { result = "Access-Control-Allow-Origin".toLowerCase(
36
36
*/
37
37
string headerAllowCredentials ( ) { result = "Access-Control-Allow-Credentials" .toLowerCase ( ) }
38
38
39
+ /**
40
+ * An `Access-Control-Allow-Origin` header write.
41
+ */
42
+ class AllowOriginHeaderWrite extends HTTP:: HeaderWrite {
43
+ AllowOriginHeaderWrite ( ) { this .getHeaderName ( ) = headerAllowOrigin ( ) }
44
+ }
45
+
46
+ /**
47
+ * An `Access-Control-Allow-Credentials` header write.
48
+ */
49
+ class AllowCredentialsHeaderWrite extends HTTP:: HeaderWrite {
50
+ AllowCredentialsHeaderWrite ( ) { this .getHeaderName ( ) = headerAllowCredentials ( ) }
51
+ }
52
+
39
53
/**
40
54
* A taint-tracking configuration for reasoning about when an UntrustedFlowSource
41
55
* flows to a HeaderWrite that writes an `Access-Control-Allow-Origin` header's value.
@@ -45,9 +59,7 @@ class FlowsUntrustedToAllowOriginHeader extends TaintTracking::Configuration {
45
59
46
60
override predicate isSource ( DataFlow:: Node source ) { source instanceof UntrustedFlowSource }
47
61
48
- predicate isSink ( DataFlow:: Node sink , HTTP:: HeaderWrite hw ) {
49
- hw .getHeaderName ( ) = headerAllowOrigin ( ) and sink = hw .getValue ( )
50
- }
62
+ predicate isSink ( DataFlow:: Node sink , AllowOriginHeaderWrite hw ) { sink = hw .getValue ( ) }
51
63
52
64
override predicate isSanitizer ( DataFlow:: Node node ) {
53
65
exists ( ControlFlow:: ConditionGuardNode cgn |
@@ -65,9 +77,8 @@ class FlowsUntrustedToAllowOriginHeader extends TaintTracking::Configuration {
65
77
* also has another HeaderWrite that sets a `Access-Control-Allow-Credentials`
66
78
* header to `true`.
67
79
*/
68
- predicate allowCredentialsIsSetToTrue ( HTTP:: HeaderWrite allowOriginHW ) {
69
- exists ( HTTP:: HeaderWrite allowCredentialsHW |
70
- allowCredentialsHW .getHeaderName ( ) = headerAllowCredentials ( ) and
80
+ predicate allowCredentialsIsSetToTrue ( AllowOriginHeaderWrite allowOriginHW ) {
81
+ exists ( AllowCredentialsHeaderWrite allowCredentialsHW |
71
82
allowCredentialsHW .getHeaderValue ( ) .toLowerCase ( ) = "true"
72
83
|
73
84
allowOriginHW .getResponseWriter ( ) = allowCredentialsHW .getResponseWriter ( )
@@ -79,7 +90,7 @@ predicate allowCredentialsIsSetToTrue(HTTP::HeaderWrite allowOriginHW) {
79
90
* UntrustedFlowSource.
80
91
* The `message` parameter is populated with the warning message to be returned by the query.
81
92
*/
82
- predicate flowsFromUntrustedToAllowOrigin ( HTTP :: HeaderWrite allowOriginHW , string message ) {
93
+ predicate flowsFromUntrustedToAllowOrigin ( AllowOriginHeaderWrite allowOriginHW , string message ) {
83
94
exists ( FlowsUntrustedToAllowOriginHeader cfg , DataFlow:: PathNode source , DataFlow:: PathNode sink |
84
95
cfg .hasFlowPath ( source , sink ) and
85
96
cfg .isSink ( sink .getNode ( ) , allowOriginHW )
@@ -94,8 +105,7 @@ predicate flowsFromUntrustedToAllowOrigin(HTTP::HeaderWrite allowOriginHW, strin
94
105
* Holds if the provided `allowOriginHW` HeaderWrite is for a `Access-Control-Allow-Origin`
95
106
* header and the value is set to `null`.
96
107
*/
97
- predicate allowOriginIsNull ( HTTP:: HeaderWrite allowOriginHW , string message ) {
98
- allowOriginHW .getHeaderName ( ) = headerAllowOrigin ( ) and
108
+ predicate allowOriginIsNull ( AllowOriginHeaderWrite allowOriginHW , string message ) {
99
109
allowOriginHW .getHeaderValue ( ) .toLowerCase ( ) = "null" and
100
110
message =
101
111
headerAllowOrigin ( ) + " header is set to `" + allowOriginHW .getHeaderValue ( ) + "`, and " +
@@ -157,7 +167,7 @@ class FlowsFromUntrusted extends TaintTracking::Configuration {
157
167
/**
158
168
* Holds if the provided `dst` is also destination of a `UntrustedFlowSource`.
159
169
*/
160
- predicate flowsToGuardedByCheckOnUntrusted ( HTTP :: HeaderWrite allowOriginHW ) {
170
+ predicate flowsToGuardedByCheckOnUntrusted ( AllowOriginHeaderWrite allowOriginHW ) {
161
171
exists (
162
172
FlowsFromUntrusted cfg , DataFlow:: PathNode source , DataFlow:: PathNode sink ,
163
173
ControlFlow:: ConditionGuardNode cgn
@@ -168,7 +178,7 @@ predicate flowsToGuardedByCheckOnUntrusted(HTTP::HeaderWrite allowOriginHW) {
168
178
)
169
179
}
170
180
171
- from HTTP :: HeaderWrite allowOriginHW , string message
181
+ from AllowOriginHeaderWrite allowOriginHW , string message
172
182
where
173
183
allowCredentialsIsSetToTrue ( allowOriginHW ) and
174
184
(
0 commit comments