Skip to content

Commit 5f5c0b1

Browse files
committed
Python: Refactor Werkzeugmodeling
Having the additional taint step just next to the other definitions, so everything is together.
1 parent 4f4dec5 commit 5f5c0b1

File tree

1 file changed

+34
-34
lines changed

1 file changed

+34
-34
lines changed

python/ql/src/semmle/python/frameworks/Werkzeug.qll

Lines changed: 34 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,21 @@ module Werkzeug {
4949
DataFlow::Node getlist() {
5050
result = any(InstanceSourceApiNode a).getMember("getlist").getAUse()
5151
}
52+
53+
private class MultiDictAdditionalTaintStep extends TaintTracking::AdditionalTaintStep {
54+
override predicate step(DataFlow::Node nodeFrom, DataFlow::Node nodeTo) {
55+
// obj -> obj.getlist
56+
exists(DataFlow::AttrRead read |
57+
read.getObject() = nodeFrom and
58+
nodeTo = read and
59+
nodeTo = werkzeug::datastructures::MultiDict::getlist()
60+
)
61+
or
62+
// getlist -> getlist()
63+
nodeFrom = werkzeug::datastructures::MultiDict::getlist() and
64+
nodeTo.(DataFlow::CallCfgNode).getFunction() = nodeFrom
65+
}
66+
}
5267
}
5368

5469
/**
@@ -73,41 +88,26 @@ module Werkzeug {
7388

7489
/** Gets a reference to an instance of `werkzeug.datastructures.FileStorage`. */
7590
DataFlow::Node instance() { result = any(InstanceSourceApiNode a).getAUse() }
76-
}
77-
}
78-
}
7991

80-
private class MultiDictAdditionalTaintStep extends TaintTracking::AdditionalTaintStep {
81-
override predicate step(DataFlow::Node nodeFrom, DataFlow::Node nodeTo) {
82-
// obj -> obj.getlist
83-
exists(DataFlow::AttrRead read |
84-
read.getObject() = nodeFrom and
85-
nodeTo = read and
86-
nodeTo = werkzeug::datastructures::MultiDict::getlist()
87-
)
88-
or
89-
// getlist -> getlist()
90-
nodeFrom = werkzeug::datastructures::MultiDict::getlist() and
91-
nodeTo.(DataFlow::CallCfgNode).getFunction() = nodeFrom
92-
}
93-
}
94-
95-
private class FileStorageAdditionalTaintStep extends TaintTracking::AdditionalTaintStep {
96-
override predicate step(DataFlow::Node nodeFrom, DataFlow::Node nodeTo) {
97-
nodeFrom = werkzeug::datastructures::FileStorage::instance() and
98-
exists(DataFlow::AttrRead read | nodeTo = read |
99-
read.getAttributeName() in [
100-
// str
101-
"filename", "name", "content_type", "mimetype",
102-
// file-like
103-
"stream",
104-
// TODO: werkzeug.datastructures.Headers
105-
"headers",
106-
// dict[str, str]
107-
"mimetype_params"
108-
] and
109-
read.getObject() = nodeFrom
110-
)
92+
private class FileStorageAdditionalTaintStep extends TaintTracking::AdditionalTaintStep {
93+
override predicate step(DataFlow::Node nodeFrom, DataFlow::Node nodeTo) {
94+
nodeFrom = werkzeug::datastructures::FileStorage::instance() and
95+
exists(DataFlow::AttrRead read | nodeTo = read |
96+
read.getAttributeName() in [
97+
// str
98+
"filename", "name", "content_type", "mimetype",
99+
// file-like
100+
"stream",
101+
// TODO: werkzeug.datastructures.Headers
102+
"headers",
103+
// dict[str, str]
104+
"mimetype_params"
105+
] and
106+
read.getObject() = nodeFrom
107+
)
108+
}
109+
}
110+
}
111111
}
112112
}
113113
}

0 commit comments

Comments
 (0)