Skip to content

Commit e7bc71f

Browse files
authored
Merge pull request #17540 from joefarebrother/python-const-compare
Python: Expand `StringConstCompareBarrier` sanitizer gaurds to cover additional constants
2 parents 04e3b39 + 48f9e0e commit e7bc71f

19 files changed

+130
-45
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
category: minorAnalysis
3+
---
4+
* The common sanitizer guard `StringConstCompareBarrier` has been renamed to `ConstCompareBarrier` and expanded to cover comparisons with other constant values such as `None`. This may result in fewer false positive results for several queries.

python/ql/lib/semmle/python/dataflow/new/BarrierGuards.qll

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,34 +3,45 @@
33
private import python
44
private import semmle.python.dataflow.new.DataFlow
55

6-
private predicate stringConstCompare(DataFlow::GuardNode g, ControlFlowNode node, boolean branch) {
6+
private predicate constCompare(DataFlow::GuardNode g, ControlFlowNode node, boolean branch) {
77
exists(CompareNode cn | cn = g |
8-
exists(StringLiteral str_const, Cmpop op |
8+
exists(ImmutableLiteral const, Cmpop op |
99
op = any(Eq eq) and branch = true
1010
or
1111
op = any(NotEq ne) and branch = false
1212
|
13-
cn.operands(str_const.getAFlowNode(), op, node)
13+
cn.operands(const.getAFlowNode(), op, node)
1414
or
15-
cn.operands(node, op, str_const.getAFlowNode())
15+
cn.operands(node, op, const.getAFlowNode())
1616
)
1717
or
18-
exists(IterableNode str_const_iterable, Cmpop op |
18+
exists(NameConstant const, Cmpop op |
19+
op = any(Is is_) and branch = true
20+
or
21+
op = any(IsNot isn) and branch = false
22+
|
23+
cn.operands(const.getAFlowNode(), op, node)
24+
or
25+
cn.operands(node, op, const.getAFlowNode())
26+
)
27+
or
28+
exists(IterableNode const_iterable, Cmpop op |
1929
op = any(In in_) and branch = true
2030
or
2131
op = any(NotIn ni) and branch = false
2232
|
23-
forall(ControlFlowNode elem | elem = str_const_iterable.getAnElement() |
24-
elem.getNode() instanceof StringLiteral
33+
forall(ControlFlowNode elem | elem = const_iterable.getAnElement() |
34+
elem.getNode() instanceof ImmutableLiteral
2535
) and
26-
cn.operands(node, op, str_const_iterable)
36+
cn.operands(node, op, const_iterable)
2737
)
2838
)
2939
}
3040

31-
/** A validation of unknown node by comparing with a constant string value. */
32-
class StringConstCompareBarrier extends DataFlow::Node {
33-
StringConstCompareBarrier() {
34-
this = DataFlow::BarrierGuard<stringConstCompare/3>::getABarrierNode()
35-
}
41+
/** A validation of unknown node by comparing with a constant value. */
42+
class ConstCompareBarrier extends DataFlow::Node {
43+
ConstCompareBarrier() { this = DataFlow::BarrierGuard<constCompare/3>::getABarrierNode() }
3644
}
45+
46+
/** DEPRECATED: Use ConstCompareBarrier instead. */
47+
deprecated class StringConstCompareBarrier = ConstCompareBarrier;

python/ql/lib/semmle/python/security/dataflow/CodeInjectionCustomizations.qll

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,10 @@ module CodeInjection {
4949
}
5050

5151
/**
52-
* A comparison with a constant string, considered as a sanitizer-guard.
52+
* A comparison with a constant, considered as a sanitizer-guard.
5353
*/
54-
class StringConstCompareAsSanitizer extends Sanitizer, StringConstCompareBarrier { }
54+
class ConstCompareAsSanitizerGuard extends Sanitizer, ConstCompareBarrier { }
55+
56+
/** DEPRECATED: Use ConstCompareAsSanitizerGuard instead. */
57+
deprecated class StringConstCompareAsSanitizerGuard = ConstCompareAsSanitizerGuard;
5558
}

python/ql/lib/semmle/python/security/dataflow/CommandInjectionCustomizations.qll

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,10 @@ module CommandInjection {
8484
}
8585

8686
/**
87-
* A comparison with a constant string, considered as a sanitizer-guard.
87+
* A comparison with a constant, considered as a sanitizer-guard.
8888
*/
89-
class StringConstCompareAsSanitizerGuard extends Sanitizer, StringConstCompareBarrier { }
89+
class ConstCompareAsSanitizerGuard extends Sanitizer, ConstCompareBarrier { }
90+
91+
/** DEPRECATED: Use ConstCompareAsSanitizerGuard instead. */
92+
deprecated class StringConstCompareAsSanitizerGuard = ConstCompareAsSanitizerGuard;
9093
}

python/ql/lib/semmle/python/security/dataflow/LdapInjectionCustomizations.qll

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,15 +61,20 @@ module LdapInjection {
6161
}
6262

6363
/**
64-
* A comparison with a constant string, considered as a sanitizer-guard.
64+
* A comparison with a constant, considered as a sanitizer-guard.
6565
*/
66-
class StringConstCompareAsDnSanitizerGuard extends DnSanitizer, StringConstCompareBarrier { }
66+
class ConstCompareAsDnSanitizerGuard extends DnSanitizer, ConstCompareBarrier { }
67+
68+
/** DEPRECATED: Use ConstCompareAsDnSanitizerGuard instead. */
69+
deprecated class StringConstCompareAsSanitizerGuard = ConstCompareAsDnSanitizerGuard;
6770

6871
/**
69-
* A comparison with a constant string, considered as a sanitizer-guard.
72+
* A comparison with a constant, considered as a sanitizer-guard.
7073
*/
71-
class StringConstCompareAsFilterSanitizerGuard extends FilterSanitizer, StringConstCompareBarrier {
72-
}
74+
class ConstCompareAsFilterSanitizerGuard extends FilterSanitizer, ConstCompareBarrier { }
75+
76+
/** DEPRECATED: Use ConstCompareAsFilterSanitizerGuard instead. */
77+
deprecated class StringConstCompareAsFilterSanitizerGuard = ConstCompareAsFilterSanitizerGuard;
7378

7479
/**
7580
* A call to replace line breaks functions as a sanitizer.

python/ql/lib/semmle/python/security/dataflow/LogInjectionCustomizations.qll

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,12 @@ module LogInjection {
7777
}
7878

7979
/**
80-
* A comparison with a constant string, considered as a sanitizer-guard.
80+
* A comparison with a constant, considered as a sanitizer-guard.
8181
*/
82-
class StringConstCompareAsSanitizerGuard extends Sanitizer, StringConstCompareBarrier { }
82+
class ConstCompareAsSanitizerGuard extends Sanitizer, ConstCompareBarrier { }
83+
84+
/** DEPRECATED: Use ConstCompareAsSanitizerGuard instead. */
85+
deprecated class StringConstCompareAsSanitizerGuard = ConstCompareAsSanitizerGuard;
8386

8487
/**
8588
* A call to replace line breaks, considered as a sanitizer.

python/ql/lib/semmle/python/security/dataflow/PathInjectionCustomizations.qll

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,10 @@ module PathInjection {
8787
}
8888

8989
/**
90-
* A comparison with a constant string, considered as a sanitizer-guard.
90+
* A comparison with a constant, considered as a sanitizer-guard.
9191
*/
92-
class StringConstCompareAsSanitizerGuard extends Sanitizer, StringConstCompareBarrier { }
92+
class ConstCompareAsSanitizerGuard extends Sanitizer, ConstCompareBarrier { }
93+
94+
/** DEPRECATED: Use ConstCompareAsSanitizerGuard instead. */
95+
deprecated class StringConstCompareAsSanitizerGuard = ConstCompareAsSanitizerGuard;
9396
}

python/ql/lib/semmle/python/security/dataflow/PolynomialReDoSCustomizations.qll

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,10 @@ module PolynomialReDoS {
7070
}
7171

7272
/**
73-
* A comparison with a constant string, considered as a sanitizer-guard.
73+
* A comparison with a constant, considered as a sanitizer-guard.
7474
*/
75-
class StringConstCompareAsSanitizerGuard extends Sanitizer, StringConstCompareBarrier { }
75+
class ConstCompareAsSanitizerGuard extends Sanitizer, ConstCompareBarrier { }
76+
77+
/** DEPRECATED: Use ConstCompareAsSanitizerGuard instead. */
78+
deprecated class StringConstCompareAsSanitizerGuard = ConstCompareAsSanitizerGuard;
7679
}

python/ql/lib/semmle/python/security/dataflow/ReflectedXSSCustomizations.qll

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,10 @@ module ReflectedXss {
7575
}
7676

7777
/**
78-
* A comparison with a constant string, considered as a sanitizer-guard.
78+
* A comparison with a constant, considered as a sanitizer-guard.
7979
*/
80-
class StringConstCompareAsSanitizerGuard extends Sanitizer, StringConstCompareBarrier { }
80+
class ConstCompareAsSanitizerGuard extends Sanitizer, ConstCompareBarrier { }
81+
82+
/** DEPRECATED: Use ConstCompareAsSanitizerGuard instead. */
83+
deprecated class StringConstCompareAsSanitizerGuard = ConstCompareAsSanitizerGuard;
8184
}

python/ql/lib/semmle/python/security/dataflow/ServerSideRequestForgeryCustomizations.qll

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,12 @@ module ServerSideRequestForgery {
7272
}
7373

7474
/**
75-
* A comparison with a constant string, considered as a sanitizer-guard.
75+
* A comparison with a constant, considered as a sanitizer-guard.
7676
*/
77-
class StringConstCompareAsSanitizerGuard extends Sanitizer, StringConstCompareBarrier { }
77+
class ConstCompareAsSanitizerGuard extends Sanitizer, ConstCompareBarrier { }
78+
79+
/** DEPRECATED: Use ConstCompareAsSanitizerGuard instead. */
80+
deprecated class StringConstCompareAsSanitizerGuard = ConstCompareAsSanitizerGuard;
7881

7982
/**
8083
* A string construction (concat, format, f-string) where the left side is not

0 commit comments

Comments
 (0)