Skip to content

Commit 61e6ae7

Browse files
committed
Python: Use new taint-tracking query in unsafe deserialization query.
1 parent 3c1a5bb commit 61e6ae7

File tree

6 files changed

+32
-5
lines changed

6 files changed

+32
-5
lines changed

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

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,16 @@ import semmle.python.security.injection.Pickle
2424
import semmle.python.security.injection.Marshal
2525
import semmle.python.security.injection.Yaml
2626

27+
class UnsafeDeserializationConfiguration extends TaintTracking::Configuration {
2728

28-
from TaintedPathSource src, TaintedPathSink sink
29-
where src.flowsTo(sink)
29+
UnsafeDeserializationConfiguration() { this = "Unsafe deserialization configuration" }
30+
31+
override predicate isSource(TaintTracking::Source source) { source.isSourceOf(any(UntrustedStringKind u)) }
32+
33+
override predicate isSink(TaintTracking::Sink sink) { sink instanceof DeserializationSink }
34+
35+
}
36+
37+
from UnsafeDeserializationConfiguration config, TaintedPathSource src, TaintedPathSink sink
38+
where config.hasFlowPath(src, sink)
3039
select sink.getSink(), src, sink, "Deserializing of $@.", src.getSource(), "untrusted input"
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
2+
import python
3+
import semmle.python.security.TaintTracking
4+
5+
6+
/** `pickle.loads(untrusted)` vulnerability. */
7+
abstract class DeserializationSink extends TaintSink {
8+
9+
bindingset[this]
10+
DeserializationSink() {
11+
this = this
12+
}
13+
14+
}

python/ql/src/semmle/python/security/injection/Marshal.qll

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import python
99

1010
import semmle.python.security.TaintTracking
1111
import semmle.python.security.strings.Untrusted
12+
import semmle.python.security.injection.Deserialization
1213

1314

1415
private FunctionObject marshalLoads() {
@@ -18,7 +19,7 @@ private FunctionObject marshalLoads() {
1819

1920
/** A taint sink that is potentially vulnerable to malicious marshaled objects.
2021
* The `vuln` in `marshal.loads(vuln)`. */
21-
class UnmarshalingNode extends TaintSink {
22+
class UnmarshalingNode extends DeserializationSink {
2223

2324
override string toString() { result = "unmarshaling vulnerability" }
2425

python/ql/src/semmle/python/security/injection/Pickle.qll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import python
99

1010
import semmle.python.security.TaintTracking
1111
import semmle.python.security.strings.Untrusted
12+
import semmle.python.security.injection.Deserialization
1213

1314

1415
private ModuleObject pickleModule() {

python/ql/src/semmle/python/security/injection/Xml.qll

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import python
88

99
import semmle.python.security.TaintTracking
1010
import semmle.python.security.strings.Untrusted
11+
import semmle.python.security.injection.Deserialization
1112

1213

1314
private ModuleObject xmlElementTreeModule() {
@@ -73,7 +74,7 @@ class ExternalXmlString extends ExternalStringKind {
7374
/** A call to an XML library function that is potentially vulnerable to a
7475
* specially crafted XML string.
7576
*/
76-
class XmlLoadNode extends TaintSink {
77+
class XmlLoadNode extends DeserializationSink {
7778

7879
override string toString() { result = "xml.load vulnerability" }
7980

python/ql/src/semmle/python/security/injection/Yaml.qll

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,15 @@ import python
1010

1111
import semmle.python.security.TaintTracking
1212
import semmle.python.security.strings.Untrusted
13+
import semmle.python.security.injection.Deserialization
1314

1415

1516
private FunctionObject yamlLoad() {
1617
result = ModuleObject::named("yaml").attr("load")
1718
}
1819

1920
/** `yaml.load(untrusted)` vulnerability. */
20-
class YamlLoadNode extends TaintSink {
21+
class YamlLoadNode extends DeserializationSink {
2122

2223
override string toString() { result = "yaml.load vulnerability" }
2324

0 commit comments

Comments
 (0)