Skip to content

Commit 64e8be6

Browse files
committed
Python: Use new taint-tracking query in reflected-xss query.
1 parent 7fc5d69 commit 64e8be6

File tree

11 files changed

+40
-18
lines changed

11 files changed

+40
-18
lines changed

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

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,17 @@ import semmle.python.web.HttpResponse
2525
/* Flow */
2626
import semmle.python.security.strings.Untrusted
2727

28-
from TaintedPathSource src, TaintedPathSink sink
29-
where src.flowsTo(sink)
28+
29+
class RefectedXssConfiguration extends TaintTracking::Configuration {
30+
31+
RefectedXssConfiguration() { this = "Reflected XSS configuration" }
32+
33+
override predicate isSource(TaintTracking::Source source) { source.isSourceOf(any(UntrustedStringKind u)) }
34+
35+
override predicate isSink(TaintTracking::Sink sink) { sink.sinks(any(UntrustedStringKind u)) }
36+
37+
}
38+
39+
from RefectedXssConfiguration config, TaintedPathSource src, TaintedPathSink sink
40+
where config.hasFlowPath(src, sink)
3041
select sink.getSink(), src, sink, "Cross-site scripting vulnerability due to $@.", src.getSource(), "user-provided value"

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,3 +89,11 @@ class UntrustedCookie extends TaintKind {
8989
}
9090

9191

92+
/** Generic taint sink in a http response */
93+
abstract class SimpleHttpResponseTaintSink extends TaintSink {
94+
95+
override predicate sinks(TaintKind kind) {
96+
kind instanceof ExternalStringKind
97+
}
98+
99+
}

python/ql/src/semmle/python/web/bottle/Response.qll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ private Object theBottleResponseObject() {
2222
result = theBottleModule().attr("response")
2323
}
2424

25-
class BottleResponseBodyAssignment extends TaintSink {
25+
class BottleResponseBodyAssignment extends SimpleHttpResponseTaintSink {
2626

2727
BottleResponseBodyAssignment() {
2828
exists(DefinitionNode lhs |
@@ -37,7 +37,7 @@ class BottleResponseBodyAssignment extends TaintSink {
3737

3838
}
3939

40-
class BottleHandlerFunctionResult extends TaintSink {
40+
class BottleHandlerFunctionResult extends SimpleHttpResponseTaintSink {
4141

4242
BottleHandlerFunctionResult() {
4343
exists(BottleRoute route, Return ret |

python/ql/src/semmle/python/web/cherrypy/Response.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import semmle.python.web.cherrypy.General
77

88

99

10-
class CherryPyExposedFunctionResult extends TaintSink {
10+
class CherryPyExposedFunctionResult extends SimpleHttpResponseTaintSink {
1111

1212
CherryPyExposedFunctionResult() {
1313
exists(Return ret |

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import python
22
import semmle.python.security.TaintTracking
33
import semmle.python.security.strings.Basic
44
private import semmle.python.web.django.Shared
5+
private import semmle.python.web.Http
56

67

78
/** A django.http.response.Response object
@@ -39,7 +40,7 @@ class DjangoResponseSource extends TaintSource {
3940
}
4041

4142
/** A write to a django response, which is vulnerable to external data (xss) */
42-
class DjangoResponseWrite extends TaintSink {
43+
class DjangoResponseWrite extends SimpleHttpResponseTaintSink {
4344

4445
DjangoResponseWrite() {
4546
exists(AttrNode meth, CallNode call |
@@ -60,7 +61,7 @@ class DjangoResponseWrite extends TaintSink {
6061
}
6162

6263
/** An argument to initialization of a django response, which is vulnerable to external data (xss) */
63-
class DjangoResponseContent extends TaintSink {
64+
class DjangoResponseContent extends SimpleHttpResponseTaintSink {
6465

6566
DjangoResponseContent() {
6667
exists(CallNode call, ClassObject cls |

python/ql/src/semmle/python/web/falcon/Response.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class FalconResponseParameter extends TaintSource {
3030

3131
}
3232

33-
class FalconResponseBodySink extends TaintSink {
33+
class FalconResponseBodySink extends SimpleHttpResponseTaintSink {
3434

3535
FalconResponseBodySink() {
3636
exists(AttrNode attr |

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import semmle.python.web.flask.General
88

99
/** A flask response, which is vulnerable to any sort of
1010
* http response malice. */
11-
class FlaskRoutedResponse extends TaintSink {
11+
class FlaskRoutedResponse extends SimpleHttpResponseTaintSink {
1212

1313
FlaskRoutedResponse() {
1414
exists(PyFunctionObject response |
@@ -28,7 +28,7 @@ class FlaskRoutedResponse extends TaintSink {
2828
}
2929

3030

31-
class FlaskResponseArgument extends TaintSink {
31+
class FlaskResponseArgument extends SimpleHttpResponseTaintSink {
3232

3333
FlaskResponseArgument() {
3434
exists(CallNode call |

python/ql/src/semmle/python/web/pyramid/Response.qll

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@ import semmle.python.security.TaintTracking
55
import semmle.python.security.strings.Basic
66

77
private import semmle.python.web.pyramid.View
8+
private import semmle.python.web.Http
89

910
/** A pyramid response, which is vulnerable to any sort of
1011
* http response malice. */
11-
class PyramidRoutedResponse extends TaintSink {
12+
class PyramidRoutedResponse extends SimpleHttpResponseTaintSink {
1213

1314
PyramidRoutedResponse() {
1415
exists(PyFunctionObject view |

python/ql/src/semmle/python/web/tornado/Response.qll

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import python
33

44
import semmle.python.security.TaintTracking
55
import semmle.python.security.strings.Basic
6+
private import semmle.python.web.Http
67

78
import Tornado
89

@@ -30,7 +31,7 @@ class TornadoConnectionSource extends TaintSource {
3031

3132
}
3233

33-
class TornadoConnectionWrite extends TaintSink {
34+
class TornadoConnectionWrite extends SimpleHttpResponseTaintSink {
3435

3536
override string toString() {
3637
result = "tornado.connection.write"
@@ -52,7 +53,7 @@ class TornadoConnectionWrite extends TaintSink {
5253

5354
}
5455

55-
class TornadoHttpRequestHandlerWrite extends TaintSink {
56+
class TornadoHttpRequestHandlerWrite extends SimpleHttpResponseTaintSink {
5657

5758
override string toString() {
5859
result = "tornado.HttpRequesHandler.write"
@@ -72,7 +73,7 @@ class TornadoHttpRequestHandlerWrite extends TaintSink {
7273

7374
}
7475

75-
class TornadoHttpRequestHandlerRedirect extends TaintSink {
76+
class TornadoHttpRequestHandlerRedirect extends SimpleHttpResponseTaintSink {
7677

7778
override string toString() {
7879
result = "tornado.HttpRequesHandler.redirect"

python/ql/src/semmle/python/web/turbogears/Response.qll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@ import python
22

33
import semmle.python.security.TaintTracking
44
import semmle.python.security.strings.Basic
5-
5+
import semmle.python.web.Http
66
import TurboGears
77

88

99

10-
class ControllerMethodReturnValue extends TaintSink {
10+
class ControllerMethodReturnValue extends SimpleHttpResponseTaintSink {
1111

1212
ControllerMethodReturnValue() {
1313
exists(TurboGearsControllerMethod m |
@@ -22,7 +22,7 @@ class ControllerMethodReturnValue extends TaintSink {
2222

2323
}
2424

25-
class ControllerMethodTemplatedReturnValue extends TaintSink {
25+
class ControllerMethodTemplatedReturnValue extends SimpleHttpResponseTaintSink {
2626

2727
ControllerMethodTemplatedReturnValue() {
2828
exists(TurboGearsControllerMethod m |

0 commit comments

Comments
 (0)