Skip to content

Commit 4d9c86a

Browse files
committed
Python: Model Werkzeug FileStorage.save as FileSystemAccess
1 parent 9cb4899 commit 4d9c86a

File tree

2 files changed

+16
-0
lines changed

2 files changed

+16
-0
lines changed

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ private import semmle.python.dataflow.new.DataFlow
1010
private import semmle.python.dataflow.new.TaintTracking
1111
private import semmle.python.ApiGraphs
1212
private import semmle.python.frameworks.Stdlib
13+
private import semmle.python.Concepts
1314

1415
/**
1516
* Provides models for the `Werkzeug` PyPI package.
@@ -110,6 +111,15 @@ module Werkzeug {
110111
private class FileStorageFileLikeInstances extends Stdlib::FileLikeObject::InstanceSource {
111112
FileStorageFileLikeInstances() { this.(DataFlow::AttrRead).accesses(instance(), "stream") }
112113
}
114+
115+
/** A call to the `save` method of a `FileStorage`. */
116+
private class FileStorageSaveCall extends FileSystemAccess::Range, DataFlow::MethodCallNode {
117+
FileStorageSaveCall() { this.calls(instance(), "save") }
118+
119+
override DataFlow::Node getAPathArgument() {
120+
result in [this.getArg(0), this.getArgByName("dst")]
121+
}
122+
}
113123
}
114124

115125
import WerkzeugOld
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from flask import Flask, request
2+
app = Flask(__name__)
3+
4+
@app.route("/save-uploaded-file") # $routeSetup="/save-uploaded-file"
5+
def test_taint(): # $requestHandler
6+
request.files['key'].save("path") # $ getAPathArgument="path"

0 commit comments

Comments
 (0)