Skip to content

Commit f03a8a8

Browse files
committed
Python: Make any routed parameter a RemoteFlowSource
I'm not 100% sure whether this approach makes everything too magic, but I like the fact that you can't _forget_ to make routed params remove-flow sources.
1 parent b78c665 commit f03a8a8

File tree

3 files changed

+10
-2
lines changed

3 files changed

+10
-2
lines changed

python/ql/src/experimental/dataflow/RemoteFlowSources.qll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ private import python
22
private import experimental.dataflow.DataFlow
33
// Need to import since frameworks can extend `RemoteFlowSource::Range`
44
private import experimental.semmle.python.Frameworks
5+
private import experimental.semmle.python.Concepts
56

67
/**
78
* A data flow source of remote user input.

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import python
88
private import experimental.dataflow.DataFlow
99
private import experimental.semmle.python.Frameworks
10+
private import experimental.dataflow.RemoteFlowSources
1011

1112
/**
1213
* A data-flow node that executes an operating system command,
@@ -89,5 +90,11 @@ module HTTP {
8990
abstract Parameter getARoutedParameter();
9091
}
9192
}
93+
94+
private class RoutedParameter extends RemoteFlowSource::Range, DataFlow::ParameterNode {
95+
RoutedParameter() { this.getParameter() = any(RouteSetup setup).getARoutedParameter() }
96+
97+
override string getSourceType() { result = "RoutedParameter" }
98+
}
9299
}
93100
}

python/ql/test/experimental/library-tests/frameworks/flask/TestTaint.expected

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
| taint_test.py:6 | fail | test_taint | name |
2-
| taint_test.py:6 | fail | test_taint | number |
1+
| taint_test.py:6 | ok | test_taint | name |
2+
| taint_test.py:6 | ok | test_taint | number |
33
| taint_test.py:7 | ok | test_taint | foo |
44
| taint_test.py:14 | ok | test_taint | request.environ |
55
| taint_test.py:15 | ok | test_taint | request.environ.get(..) |

0 commit comments

Comments
 (0)