@@ -252,14 +252,14 @@ class LogonUser extends SystemData {
252
252
* the `regQuery` predicate concisely.
253
253
*/
254
254
private newtype TRegQueryParameter =
255
- TSubKeyName ( Expr e ) or
256
- TValueName ( Expr e ) or
257
- TReturnData ( Expr e )
255
+ TSubKeyName ( ) or
256
+ TValueName ( ) or
257
+ TReturnData ( )
258
258
259
259
/**
260
260
* Registry query call (`source`) with information about parameters (`param`).
261
261
*/
262
- private predicate regQuery ( FunctionCall source , TRegQueryParameter param ) {
262
+ private predicate regQuery ( FunctionCall source , TRegQueryParameter paramType , Expr param ) {
263
263
// LONG WINAPI RegQueryValue(
264
264
// _In_ HKEY hKey,
265
265
// _In_opt_ LPCTSTR lpSubKey,
@@ -268,8 +268,9 @@ private predicate regQuery(FunctionCall source, TRegQueryParameter param) {
268
268
// );
269
269
source .getTarget ( ) .hasGlobalName ( [ "RegQueryValue" , "RegQueryValueA" , "RegQueryValueW" ] ) and
270
270
(
271
- param = TSubKeyName ( source .getArgument ( 1 ) ) or
272
- param = TReturnData ( source .getArgument ( 2 ) )
271
+ paramType = TSubKeyName ( ) and param = source .getArgument ( 1 )
272
+ or
273
+ paramType = TReturnData ( ) and param = source .getArgument ( 2 )
273
274
)
274
275
or
275
276
// LONG WINAPI RegQueryMultipleValues(
@@ -284,7 +285,8 @@ private predicate regQuery(FunctionCall source, TRegQueryParameter param) {
284
285
.hasGlobalName ( [
285
286
"RegQueryMultipleValues" , "RegQueryMultipleValuesA" , "RegQueryMultipleValuesW"
286
287
] ) and
287
- param = TReturnData ( source .getArgument ( 3 ) )
288
+ paramType = TReturnData ( ) and
289
+ param = source .getArgument ( 3 )
288
290
or
289
291
// LONG WINAPI RegQueryValueEx(
290
292
// _In_ HKEY hKey,
@@ -296,8 +298,9 @@ private predicate regQuery(FunctionCall source, TRegQueryParameter param) {
296
298
// );
297
299
source .getTarget ( ) .hasGlobalName ( [ "RegQueryValueEx" , "RegQueryValueExA" , "RegQueryValueExW" ] ) and
298
300
(
299
- param = TValueName ( source .getArgument ( 1 ) ) or
300
- param = TReturnData ( source .getArgument ( 4 ) )
301
+ paramType = TValueName ( ) and param = source .getArgument ( 1 )
302
+ or
303
+ paramType = TReturnData ( ) and param = source .getArgument ( 4 )
301
304
)
302
305
or
303
306
// LONG WINAPI RegGetValue(
@@ -311,25 +314,27 @@ private predicate regQuery(FunctionCall source, TRegQueryParameter param) {
311
314
// );
312
315
source .getTarget ( ) .hasGlobalName ( [ "RegGetValue" , "RegGetValueA" , "RegGetValueW" ] ) and
313
316
(
314
- param = TSubKeyName ( source .getArgument ( 1 ) ) or
315
- param = TValueName ( source .getArgument ( 2 ) ) or
316
- param = TReturnData ( source .getArgument ( 5 ) )
317
+ paramType = TSubKeyName ( ) and param = source .getArgument ( 1 )
318
+ or
319
+ paramType = TValueName ( ) and param = source .getArgument ( 2 )
320
+ or
321
+ paramType = TReturnData ( ) and param = source .getArgument ( 5 )
317
322
)
318
323
}
319
324
320
325
/**
321
326
* Data read from the Windows registry.
322
327
*/
323
328
class RegQuery extends SystemData {
324
- RegQuery ( ) { regQuery ( this , _) }
329
+ RegQuery ( ) { regQuery ( this , _, _ ) }
325
330
326
- override DataFlow:: Node getAnExpr ( ) { regQuery ( this , TReturnData ( result .asDefiningArgument ( ) ) ) }
331
+ override DataFlow:: Node getAnExpr ( ) { regQuery ( this , TReturnData ( ) , result .asDefiningArgument ( ) ) }
327
332
328
333
override predicate isSensitive ( ) {
329
334
exists ( Expr e |
330
335
(
331
- regQuery ( this , TSubKeyName ( e ) ) or
332
- regQuery ( this , TValueName ( e ) )
336
+ regQuery ( this , TSubKeyName ( ) , e ) or
337
+ regQuery ( this , TValueName ( ) , e )
333
338
) and
334
339
e .getValue ( ) .toLowerCase ( ) .regexpMatch ( ".*(pass|token|key).*" )
335
340
)
0 commit comments