Skip to content

Commit a5850f4

Browse files
committed
Use getRegexModule to know used lib
1 parent e78e2ac commit a5850f4

File tree

4 files changed

+15
-10
lines changed

4 files changed

+15
-10
lines changed

python/ql/src/experimental/Security/CWE-730/RegexInjection.ql

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@ import DataFlow::PathGraph
1818

1919
from
2020
RegexInjectionFlowConfig config, DataFlow::PathNode source, DataFlow::PathNode sink,
21-
Attribute sinkAttribute
21+
RegexInjectionSink castedSink
2222
where
2323
config.hasFlowPath(source, sink) and
24-
sinkAttribute = sink.getNode().(RegexInjectionSink).getRegexMethod()
24+
castedSink = sink.getNode()
2525
select sink.getNode(), source, sink,
2626
"$@ regular expression is constructed from a $@ and executed by $@.", sink.getNode(), "This",
27-
source.getNode(), "user-provided value", sinkAttribute,
28-
sinkAttribute.getObject().toString() + "." + sinkAttribute.getName()
27+
source.getNode(), "user-provided value", castedSink,
28+
castedSink.getRegexModule() + "." + castedSink.asExpr().(Attribute).getName()

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ module RegexExecution {
2525
*/
2626
abstract class Range extends DataFlow::Node {
2727
abstract DataFlow::Node getRegexNode();
28+
29+
abstract string getRegexModule();
2830
}
2931
}
3032

@@ -40,6 +42,8 @@ class RegexExecution extends DataFlow::Node {
4042
RegexExecution() { this = range }
4143

4244
DataFlow::Node getRegexNode() { result = range.getRegexNode() }
45+
46+
string getRegexModule() { result = range.getRegexModule() }
4347
}
4448

4549
/** Provides classes for modeling Regular Expression escape-related APIs. */

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,15 @@ private module Re {
2121

2222
private class DirectRegex extends DataFlow::CallCfgNode, RegexExecution::Range {
2323
DataFlow::Node regexNode;
24-
DataFlow::CallCfgNode regexMethod;
2524

2625
DirectRegex() {
27-
// this.getLocation().getFile().getBaseName().regexpMatch("^re_(good|bad)\\.py$") and // debug
2826
this = API::moduleImport("re").getMember(any(ReMethods m)).getACall() and
2927
regexNode = this.getArg(0)
3028
}
3129

3230
override DataFlow::Node getRegexNode() { result = regexNode }
31+
32+
override string getRegexModule() { result = "re" }
3333
}
3434

3535
private class CompiledRegex extends DataFlow::CallCfgNode, RegexExecution::Range {
@@ -38,7 +38,6 @@ private module Re {
3838

3939
CompiledRegex() {
4040
exists(DataFlow::CallCfgNode patternCall, DataFlow::AttrRead reMethod |
41-
// this.getLocation().getFile().getBaseName().regexpMatch("^re_(good|bad)\\.py$") and // debug
4241
this.getFunction() = reMethod and
4342
patternCall = API::moduleImport("re").getMember("compile").getACall() and
4443
patternCall = reMethod.getObject().getALocalSource() and
@@ -48,6 +47,8 @@ private module Re {
4847
}
4948

5049
override DataFlow::Node getRegexNode() { result = regexNode }
50+
51+
override string getRegexModule() { result = "re" }
5152
}
5253

5354
class ReEscape extends DataFlow::CallCfgNode, RegexEscape::Range {

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,16 @@ import semmle.python.dataflow.new.TaintTracking
1010
import semmle.python.dataflow.new.RemoteFlowSources
1111

1212
class RegexInjectionSink extends DataFlow::Node {
13-
Attribute regexMethod;
13+
string regexModule;
1414

1515
RegexInjectionSink() {
1616
exists(RegexExecution reExec |
1717
this = reExec.getRegexNode() and
18-
regexMethod = reExec.asExpr().(Attribute)
18+
regexModule = reExec.getRegexModule()
1919
)
2020
}
2121

22-
Attribute getRegexMethod() { result = regexMethod }
22+
string getRegexModule() { result = regexModule }
2323
}
2424

2525
/**

0 commit comments

Comments
 (0)