Skip to content

Commit be09ffe

Browse files
committed
Create RegexEscape Range
1 parent 805f86a commit be09ffe

3 files changed

Lines changed: 43 additions & 12 deletions

File tree

python/ql/src/experimental/semmle/python/Concepts.qll

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ private import semmle.python.ApiGraphs
1818
/** Provides classes for modeling Regular Expression-related APIs. */
1919
module RegexExecution {
2020
/**
21-
* A data-flow node that works with regular expressions.
21+
* A data-flow node that works with regular expressions immediately executing an expression.
2222
*
2323
* Extend this class to model new APIs. If you want to refine existing API models,
2424
* extend `RegexExecution` instead.
@@ -31,7 +31,7 @@ module RegexExecution {
3131
}
3232

3333
/**
34-
* A data-flow node that works with regular expressions.
34+
* A data-flow node that works with regular expressions immediately executing an expression.
3535
*
3636
* Extend this class to refine existing API models. If you want to model new APIs,
3737
* extend `RegexExecution::Range` instead.
@@ -46,17 +46,33 @@ class RegexExecution extends DataFlow::Node {
4646
Attribute getRegexMethod() { result = range.getRegexMethod() }
4747
}
4848

49-
class RegexEscape extends DataFlow::CallCfgNode {
50-
DataFlow::Node regexNode;
51-
Attribute regexMethod;
49+
/** Provides classes for modeling Regular Expression escape-related APIs. */
50+
module RegexEscape {
51+
/**
52+
* A data-flow node that collects functions escaping regular expressions.
53+
*
54+
* Extend this class to model new APIs. If you want to refine existing API models,
55+
* extend `RegexEscape` instead.
56+
*/
57+
abstract class Range extends DataFlow::Node {
58+
abstract DataFlow::Node getRegexNode();
5259

53-
RegexEscape() {
54-
this = API::moduleImport("re").getMember("escape").getACall() and
55-
regexNode = this.getArg(0) and
56-
regexMethod = this.asExpr().(Attribute)
60+
abstract Attribute getEscapeMethod();
5761
}
62+
}
5863

59-
DataFlow::Node getRegexNode() { result = regexNode }
64+
/**
65+
* A data-flow node that collects functions escaping regular expressions.
66+
*
67+
* Extend this class to refine existing API models. If you want to model new APIs,
68+
* extend `RegexEscape::Range` instead.
69+
*/
70+
class RegexEscape extends DataFlow::Node {
71+
RegexEscape::Range range;
72+
73+
RegexEscape() { this = range }
74+
75+
DataFlow::Node getRegexNode() { result = range.getRegexNode() }
6076

61-
Attribute getRegexMethod() { result = regexMethod }
77+
Attribute getEscapeMethod() { result = range.getEscapeMethod() }
6278
}

python/ql/src/experimental/semmle/python/frameworks/Stdlib.qll

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,4 +53,19 @@ private module Re {
5353

5454
override Attribute getRegexMethod() { result = regexMethod }
5555
}
56+
57+
class ReEscape extends DataFlow::CallCfgNode, RegexEscape::Range {
58+
DataFlow::Node regexNode;
59+
Attribute escapeMethod;
60+
61+
ReEscape() {
62+
this = API::moduleImport("re").getMember("escape").getACall() and
63+
regexNode = this.getArg(0) and
64+
escapeMethod = this.asExpr().(Attribute)
65+
}
66+
67+
override DataFlow::Node getRegexNode() { result = regexNode }
68+
69+
override Attribute getEscapeMethod() { result = escapeMethod }
70+
}
5671
}

python/ql/src/experimental/semmle/python/security/injection/RegexInjection.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,6 @@ class RegexInjectionFlowConfig extends TaintTracking::Configuration {
2121
override predicate isSink(DataFlow::Node sink) { sink = any(RegexExecution re).getRegexNode() }
2222

2323
override predicate isSanitizer(DataFlow::Node sanitizer) {
24-
sanitizer = sanitizer.(RegexEscape).getRegexNode()
24+
sanitizer = any(RegexEscape reEscape).getRegexNode()
2525
}
2626
}

0 commit comments

Comments
 (0)