Skip to content

Commit f8c43ca

Browse files
committed
Python: make sure all django and flask request sources conform to interface.
1 parent 61e6ae7 commit f8c43ca

File tree

4 files changed

+11
-11
lines changed

4 files changed

+11
-11
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ class RefectedXssConfiguration extends TaintTracking::Configuration {
3030

3131
RefectedXssConfiguration() { this = "Reflected XSS configuration" }
3232

33-
override predicate isSource(TaintTracking::Source source) { source.isSourceOf(any(UntrustedStringKind u)) }
33+
override predicate isSource(TaintTracking::Source source) { source instanceof HttpRequestTaintSource }
3434

35-
override predicate isSink(TaintTracking::Sink sink) { sink.sinks(any(UntrustedStringKind u)) }
35+
override predicate isSink(TaintTracking::Sink sink) { sink instanceof SimpleHttpResponseTaintSink }
3636

3737
}
3838

python/ql/src/semmle/python/web/Http.qll

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,7 @@ import semmle.python.security.TaintTracking
33
import semmle.python.security.strings.External
44

55
/** Generic taint source from a http request */
6-
abstract class SimpleHttpRequestTaintSource extends TaintSource {
7-
8-
override predicate isSourceOf(TaintKind kind) {
9-
kind instanceof ExternalStringKind
10-
}
6+
abstract class HttpRequestTaintSource extends TaintSource {
117

128
}
139

python/ql/src/semmle/python/web/django/Request.qll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ class DjangoQueryDict extends TaintKind {
4949

5050
}
5151

52-
abstract class DjangoRequestSource extends TaintSource {
52+
abstract class DjangoRequestSource extends HttpRequestTaintSource {
5353

5454
override string toString() {
5555
result = "Django request source"
@@ -144,7 +144,7 @@ class UrlRouting extends CallNode {
144144
}
145145

146146
/** An argument specified in a url routing table */
147-
class HttpRequestParameter extends TaintSource {
147+
class HttpRequestParameter extends HttpRequestTaintSource {
148148

149149
HttpRequestParameter() {
150150
exists(UrlRouting url |

python/ql/src/semmle/python/web/flask/Request.qll

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ private predicate flask_request_attr(AttrNode attr, string name) {
1616
}
1717

1818
/** Source of external data from a flask request */
19-
class FlaskRequestData extends SimpleHttpRequestTaintSource {
19+
class FlaskRequestData extends HttpRequestTaintSource {
2020

2121
FlaskRequestData() {
2222
not this instanceof FlaskRequestArgs and
@@ -27,14 +27,18 @@ class FlaskRequestData extends SimpleHttpRequestTaintSource {
2727
)
2828
}
2929

30+
override predicate isSourceOf(TaintKind kind) {
31+
kind instanceof ExternalStringKind
32+
}
33+
3034
override string toString() {
3135
result = "flask.request"
3236
}
3337

3438
}
3539

3640
/** Source of dictionary whose values are externally controlled */
37-
class FlaskRequestArgs extends TaintSource {
41+
class FlaskRequestArgs extends HttpRequestTaintSource {
3842

3943
FlaskRequestArgs() {
4044
exists(string attr |

0 commit comments

Comments
 (0)