Skip to content

Commit 6aec7f2

Browse files
authored
Merge pull request github#6264 from RasmusWL/customization-files-for-path-problems
Python: Provide proper source/sink customization for most path queries
2 parents 48ec223 + 6f8969a commit 6aec7f2

27 files changed

+986
-372
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
lgtm,codescanning
2+
* Changed the way to provide extra sources/sinks for `@kind path-problem` queries, to avoid a potential performance problem due to re-evaluation of data-flow configurations. Please use the new `<query>Customization.qll` files and extend their classes instead (such as extending the `Sink` class from `python/ql/src/semmle/python/security/dataflow/SqlInjectionCustomizations.qll`). This is relevant for the queries: `py/sql-injection`, `py/code-injection`, `py/command-line-injection`, `py/reflective-xss`, `py/url-redirection`, `py/unsafe-deserialization`, `py/stack-trace-exposure`, `py/path-injection`.

python/ql/src/Security/CWE-078/CommandInjection.ql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import python
1919
import semmle.python.security.dataflow.CommandInjection
2020
import DataFlow::PathGraph
2121

22-
from CommandInjectionConfiguration config, DataFlow::PathNode source, DataFlow::PathNode sink
22+
from CommandInjection::Configuration config, DataFlow::PathNode source, DataFlow::PathNode sink
2323
where config.hasFlowPath(source, sink)
2424
select sink.getNode(), source, sink, "This command depends on $@.", source.getNode(),
2525
"a user-provided value"

python/ql/src/Security/CWE-079/ReflectedXss.ql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import python
1717
import semmle.python.security.dataflow.ReflectedXSS
1818
import DataFlow::PathGraph
1919

20-
from ReflectedXssConfiguration config, DataFlow::PathNode source, DataFlow::PathNode sink
20+
from ReflectedXSS::Configuration config, DataFlow::PathNode source, DataFlow::PathNode sink
2121
where config.hasFlowPath(source, sink)
2222
select sink.getNode(), source, sink, "Cross-site scripting vulnerability due to $@.",
2323
source.getNode(), "a user-provided value"

python/ql/src/Security/CWE-089/SqlInjection.ql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import python
1616
import semmle.python.security.dataflow.SqlInjection
1717
import DataFlow::PathGraph
1818

19-
from SQLInjectionConfiguration config, DataFlow::PathNode source, DataFlow::PathNode sink
19+
from SqlInjection::Configuration config, DataFlow::PathNode source, DataFlow::PathNode sink
2020
where config.hasFlowPath(source, sink)
2121
select sink.getNode(), source, sink, "This SQL query depends on $@.", source.getNode(),
2222
"a user-provided value"

python/ql/src/Security/CWE-094/CodeInjection.ql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import python
1919
import semmle.python.security.dataflow.CodeInjection
2020
import DataFlow::PathGraph
2121

22-
from CodeInjectionConfiguration config, DataFlow::PathNode source, DataFlow::PathNode sink
22+
from CodeInjection::Configuration config, DataFlow::PathNode source, DataFlow::PathNode sink
2323
where config.hasFlowPath(source, sink)
2424
select sink.getNode(), source, sink, "$@ flows to here and is interpreted as code.",
2525
source.getNode(), "A user-provided value"

python/ql/src/Security/CWE-209/StackTraceExposure.ql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import python
1717
import semmle.python.security.dataflow.StackTraceExposure
1818
import DataFlow::PathGraph
1919

20-
from StackTraceExposureConfiguration config, DataFlow::PathNode source, DataFlow::PathNode sink
20+
from StackTraceExposure::Configuration config, DataFlow::PathNode source, DataFlow::PathNode sink
2121
where config.hasFlowPath(source, sink)
2222
select sink.getNode(), source, sink, "$@ may be exposed to an external user", source.getNode(),
2323
"Error information"

python/ql/src/Security/CWE-502/UnsafeDeserialization.ql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,6 @@ import python
1616
import semmle.python.security.dataflow.UnsafeDeserialization
1717
import DataFlow::PathGraph
1818

19-
from UnsafeDeserializationConfiguration config, DataFlow::PathNode source, DataFlow::PathNode sink
19+
from UnsafeDeserialization::Configuration config, DataFlow::PathNode source, DataFlow::PathNode sink
2020
where config.hasFlowPath(source, sink)
2121
select sink.getNode(), source, sink, "Deserializing of $@.", source.getNode(), "untrusted input"

python/ql/src/Security/CWE-601/UrlRedirect.ql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import python
1616
import semmle.python.security.dataflow.UrlRedirect
1717
import DataFlow::PathGraph
1818

19-
from UrlRedirectConfiguration config, DataFlow::PathNode source, DataFlow::PathNode sink
19+
from UrlRedirect::Configuration config, DataFlow::PathNode source, DataFlow::PathNode sink
2020
where config.hasFlowPath(source, sink)
2121
select sink.getNode(), source, sink, "Untrusted URL redirection due to $@.", source.getNode(),
2222
"A user-provided value"

python/ql/src/Security/CWE-730/PolynomialReDoS.ql

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ import semmle.python.security.dataflow.PolynomialReDoS
1717
import DataFlow::PathGraph
1818

1919
from
20-
PolynomialReDoSConfiguration config, DataFlow::PathNode source, DataFlow::PathNode sink,
21-
PolynomialReDoSSink sinkNode, PolynomialBackTrackingTerm regexp
20+
PolynomialReDoS::Configuration config, DataFlow::PathNode source, DataFlow::PathNode sink,
21+
PolynomialReDoS::Sink sinkNode, PolynomialBackTrackingTerm regexp
2222
where
2323
config.hasFlowPath(source, sink) and
2424
sinkNode = sink.getNode() and
Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,42 @@
11
/**
2-
* Provides a taint-tracking configuration for detecting code injection
3-
* vulnerabilities.
2+
* Provides a taint-tracking configuration for detecting "code injection" vulnerabilities.
3+
*
4+
* Note, for performance reasons: only import this file if
5+
* `CodeInjection::Configuration` is needed, otherwise
6+
* `CodeInjectionCustomizations` should be imported instead.
47
*/
58

6-
import python
9+
private import python
710
import semmle.python.dataflow.new.DataFlow
811
import semmle.python.dataflow.new.TaintTracking
9-
import semmle.python.Concepts
10-
import semmle.python.dataflow.new.RemoteFlowSources
11-
import semmle.python.dataflow.new.BarrierGuards
1212

1313
/**
14-
* A taint-tracking configuration for detecting code injection vulnerabilities.
14+
* Provides a taint-tracking configuration for detecting "code injection" vulnerabilities.
1515
*/
16-
class CodeInjectionConfiguration extends TaintTracking::Configuration {
17-
CodeInjectionConfiguration() { this = "CodeInjectionConfiguration" }
16+
module CodeInjection {
17+
import CodeInjectionCustomizations::CodeInjection
1818

19-
override predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource }
19+
/**
20+
* A taint-tracking configuration for detecting "code injection" vulnerabilities.
21+
*/
22+
class Configuration extends TaintTracking::Configuration {
23+
Configuration() { this = "CodeInjection" }
2024

21-
override predicate isSink(DataFlow::Node sink) { sink = any(CodeExecution e).getCode() }
25+
override predicate isSource(DataFlow::Node source) { source instanceof Source }
2226

23-
override predicate isSanitizerGuard(DataFlow::BarrierGuard guard) {
24-
guard instanceof StringConstCompare
27+
override predicate isSink(DataFlow::Node sink) { sink instanceof Sink }
28+
29+
override predicate isSanitizer(DataFlow::Node node) { node instanceof Sanitizer }
30+
31+
override predicate isSanitizerGuard(DataFlow::BarrierGuard guard) {
32+
guard instanceof SanitizerGuard
33+
}
2534
}
2635
}
36+
37+
/**
38+
* DEPRECATED: Don't extend this class for customization, since this will lead to bad
39+
* performance, instead use the new `CodeInjectionCustomizations.qll` file, and extend
40+
* its' classes.
41+
*/
42+
deprecated class CodeInjectionConfiguration = CodeInjection::Configuration;

0 commit comments

Comments
 (0)