@@ -120,43 +120,51 @@ class TlsVersionFlowConfig extends TaintTracking::Configuration {
120
120
}
121
121
122
122
/**
123
- * Holds if a secure TLS version may reach ` sink`, which writes to `base`.` fld`
123
+ * Holds if `config` exhibits a secure TLS version flowing from `source` to ` sink`, which flows into ` fld`.
124
124
*/
125
- predicate secureTlsVersionFlowsToSink ( DataFlow:: PathNode sink , Field fld , DataFlow:: Node base ) {
126
- exists ( TlsVersionFlowConfig secureCfg , DataFlow:: PathNode source , int version |
127
- secureCfg .hasFlowPath ( source , sink ) and
128
- secureCfg .isSink ( sink .getNode ( ) , fld , base , _) and
129
- secureCfg .isSource ( source .getNode ( ) , version ) and
125
+ predicate secureTlsVersionFlow (
126
+ TlsVersionFlowConfig config , DataFlow:: PathNode source , DataFlow:: PathNode sink , Field fld
127
+ ) {
128
+ exists ( int version |
129
+ config .hasFlowPath ( source , sink ) and
130
+ config .isSource ( source .getNode ( ) , version ) and
130
131
not isInsecureTlsVersion ( version , _, fld .getName ( ) )
131
132
)
132
133
}
133
134
134
135
/**
135
- * Holds if a secure TLS version may reach `baseEntity`. `fld`
136
+ * Holds if a secure TLS version reaches `sink`, which flows into `fld`.
136
137
*/
137
- predicate secureTlsVersionFlowsToEntity ( ValueEntity baseEntity , Field fld ) {
138
- exists ( DataFlow:: PathNode sink , DataFlow:: Node base |
139
- secureTlsVersionFlowsToSink ( sink , fld , base ) and
140
- base .( DataFlow:: ReadNode ) .reads ( baseEntity )
141
- )
138
+ predicate secureTlsVersionFlowsToSink ( DataFlow:: PathNode sink , Field fld ) {
139
+ secureTlsVersionFlow ( _, _, sink , fld )
142
140
}
143
141
144
142
/**
145
143
* Holds if a secure TLS version may reach `base`.`fld`
146
144
*/
147
- predicate secureTlsVersionFlowsToField ( DataFlow:: Node base , Field fld ) {
148
- secureTlsVersionFlowsToSink ( _, fld , base )
149
- or
150
- exists ( ValueEntity baseEntity |
151
- base .( DataFlow:: ReadNode ) .reads ( baseEntity ) and
152
- secureTlsVersionFlowsToEntity ( baseEntity , fld )
145
+ predicate secureTlsVersionFlowsToField ( SsaWithFields accessPath , Field fld ) {
146
+ exists (
147
+ TlsVersionFlowConfig config , DataFlow:: PathNode source , DataFlow:: PathNode sink ,
148
+ DataFlow:: Node base
149
+ |
150
+ secureTlsVersionFlow ( config , source , sink , fld ) and
151
+ config .isSink ( sink .getNode ( ) , fld , base , _) and
152
+ accessPath .getAUse ( ) = base
153
153
)
154
154
}
155
155
156
+ /**
157
+ * Returns `node` or an implicit-deref node referring to it
158
+ */
159
+ DataFlow:: Node nodeOrDeref ( DataFlow:: Node node ) {
160
+ result = node or
161
+ result .asInstruction ( ) = IR:: implicitDerefInstruction ( node .asExpr ( ) )
162
+ }
163
+
156
164
/**
157
165
* Find insecure TLS versions.
158
166
*/
159
- predicate checkTlsVersions (
167
+ query predicate checkTlsVersions (
160
168
DataFlow:: PathNode source , DataFlow:: PathNode sink , string message , DataFlow:: Node base
161
169
) {
162
170
exists ( TlsVersionFlowConfig cfg , int version , Field fld |
@@ -167,12 +175,13 @@ predicate checkTlsVersions(
167
175
not nodeSuggestsOldVersion ( base .asExpr ( ) .getParent * ( ) ) and
168
176
// Exclude cases where a secure TLS version can also flow to the same
169
177
// sink, or to different sinks that refer to the same base and field,
170
- // which suggests a configurable security mode. baseAlias is used because
171
- // isSink will return both implicit dereferences and the expression
172
- // accessed.
173
- not exists ( DataFlow:: Node baseAlias |
174
- cfg .isSink ( sink .getNode ( ) , fld , baseAlias , _) and
175
- secureTlsVersionFlowsToField ( baseAlias , fld )
178
+ // which suggests a configurable security mode.
179
+ not secureTlsVersionFlowsToSink ( sink , fld ) and
180
+ not exists ( SsaWithFields insecureAccessPath , SsaWithFields secureAccessPath |
181
+ nodeOrDeref ( insecureAccessPath .getAUse ( ) ) = base and
182
+ secureAccessPath = insecureAccessPath .similar ( )
183
+ |
184
+ secureTlsVersionFlowsToField ( secureAccessPath , fld )
176
185
)
177
186
|
178
187
version = 0 and
0 commit comments