@@ -16,6 +16,54 @@ module InsecureFeatureFlag {
16
16
* Returns a flag name of this type.
17
17
*/
18
18
abstract string getAFlagName ( ) ;
19
+
20
+ /** Gets a global value number representing a (likely) security flag. */
21
+ GVN getAFlag ( ) {
22
+ // a call like `cfg.disableVerification()`
23
+ exists ( DataFlow:: CallNode c | c .getTarget ( ) .getName ( ) = getAFlagName ( ) |
24
+ result = globalValueNumber ( c )
25
+ )
26
+ or
27
+ // a variable or field like `insecure`
28
+ exists ( ValueEntity flag | flag .getName ( ) = getAFlagName ( ) |
29
+ result = globalValueNumber ( flag .getARead ( ) )
30
+ )
31
+ or
32
+ // a string constant such as `"insecure"` or `"skipVerification"`
33
+ exists ( DataFlow:: Node const | const .getStringValue ( ) = getAFlagName ( ) |
34
+ result = globalValueNumber ( const )
35
+ )
36
+ or
37
+ // track feature flags through various operations
38
+ exists ( DataFlow:: Node flag | flag = getAFlag ( ) .getANode ( ) |
39
+ // tuple destructurings
40
+ result = globalValueNumber ( DataFlow:: extractTupleElement ( flag , _) )
41
+ or
42
+ // type casts
43
+ exists ( DataFlow:: TypeCastNode tc |
44
+ tc .getOperand ( ) = flag and
45
+ result = globalValueNumber ( tc )
46
+ )
47
+ or
48
+ // pointer dereferences
49
+ exists ( DataFlow:: PointerDereferenceNode deref |
50
+ deref .getOperand ( ) = flag and
51
+ result = globalValueNumber ( deref )
52
+ )
53
+ or
54
+ // calls like `os.Getenv("DISABLE_TLS_VERIFICATION")`
55
+ exists ( DataFlow:: CallNode call |
56
+ call .getAnArgument ( ) = flag and
57
+ result = globalValueNumber ( call )
58
+ )
59
+ or
60
+ // comparisons like `insecure == true`
61
+ exists ( DataFlow:: EqualityTestNode eq |
62
+ eq .getAnOperand ( ) = flag and
63
+ result = globalValueNumber ( eq )
64
+ )
65
+ )
66
+ }
19
67
}
20
68
21
69
/**
@@ -28,54 +76,6 @@ module InsecureFeatureFlag {
28
76
override string getAFlagName ( ) { result .regexpMatch ( "(?i).*(secure|(en|dis)able).*" ) }
29
77
}
30
78
31
- /** Gets a global value number representing a (likely) security flag. */
32
- GVN getAFlag ( FlagKind flagKind ) {
33
- // a call like `cfg.disableVerification()`
34
- exists ( DataFlow:: CallNode c | c .getTarget ( ) .getName ( ) = flagKind .getAFlagName ( ) |
35
- result = globalValueNumber ( c )
36
- )
37
- or
38
- // a variable or field like `insecure`
39
- exists ( ValueEntity flag | flag .getName ( ) = flagKind .getAFlagName ( ) |
40
- result = globalValueNumber ( flag .getARead ( ) )
41
- )
42
- or
43
- // a string constant such as `"insecure"` or `"skipVerification"`
44
- exists ( DataFlow:: Node const | const .getStringValue ( ) = flagKind .getAFlagName ( ) |
45
- result = globalValueNumber ( const )
46
- )
47
- or
48
- // track feature flags through various operations
49
- exists ( DataFlow:: Node flag | flag = getAFlag ( flagKind ) .getANode ( ) |
50
- // tuple destructurings
51
- result = globalValueNumber ( DataFlow:: extractTupleElement ( flag , _) )
52
- or
53
- // type casts
54
- exists ( DataFlow:: TypeCastNode tc |
55
- tc .getOperand ( ) = flag and
56
- result = globalValueNumber ( tc )
57
- )
58
- or
59
- // pointer dereferences
60
- exists ( DataFlow:: PointerDereferenceNode deref |
61
- deref .getOperand ( ) = flag and
62
- result = globalValueNumber ( deref )
63
- )
64
- or
65
- // calls like `os.Getenv("DISABLE_TLS_VERIFICATION")`
66
- exists ( DataFlow:: CallNode call |
67
- call .getAnArgument ( ) = flag and
68
- result = globalValueNumber ( call )
69
- )
70
- or
71
- // comparisons like `insecure == true`
72
- exists ( DataFlow:: EqualityTestNode eq |
73
- eq .getAnOperand ( ) = flag and
74
- result = globalValueNumber ( eq )
75
- )
76
- )
77
- }
78
-
79
79
/**
80
80
* Holds for string literals or named values matching `flagKind` and their fields.
81
81
*/
@@ -113,6 +113,6 @@ module InsecureFeatureFlag {
113
113
* Gets a control-flow node that represents a (likely) security feature-flag check
114
114
*/
115
115
ControlFlow:: ConditionGuardNode getASecurityFeatureFlagCheck ( ) {
116
- result .ensures ( getAFlag ( any ( SecurityFeatureFlag f ) ) .getANode ( ) , _)
116
+ result .ensures ( any ( SecurityFeatureFlag f ) . getAFlag ( ) .getANode ( ) , _)
117
117
}
118
118
}
0 commit comments