Skip to content

Commit 6d09334

Browse files
authored
Merge pull request #6330 from porcupineyhairs/pyPathTraversal
Python : Add Flask sinks for path injection query
2 parents 9478faf + d9e5d17 commit 6d09334

File tree

2 files changed

+40
-1
lines changed

2 files changed

+40
-1
lines changed

python/ql/lib/semmle/python/frameworks/Flask.qll

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -519,4 +519,32 @@ module Flask {
519519

520520
override DataFlow::Node getValueArg() { none() }
521521
}
522+
523+
/**
524+
* A call to `flask.send_from_directory`.
525+
*
526+
* See https://flask.palletsprojects.com/en/1.1.x/api/#flask.send_from_directory
527+
*/
528+
class FlaskSendFromDirectory extends FileSystemAccess::Range, DataFlow::CallCfgNode {
529+
FlaskSendFromDirectory() {
530+
this = API::moduleImport("flask").getMember("send_from_directory").getACall()
531+
}
532+
533+
override DataFlow::Node getAPathArgument() {
534+
result in [this.getArg(_), this.getArgByName(["directory", "filename"])]
535+
}
536+
}
537+
538+
/**
539+
* A call to `flask.send_file`.
540+
*
541+
* See https://flask.palletsprojects.com/en/1.1.x/api/#flask.send_file
542+
*/
543+
class FlaskSendFile extends FileSystemAccess::Range, DataFlow::CallCfgNode {
544+
FlaskSendFile() { this = API::moduleImport("flask").getMember("send_file").getACall() }
545+
546+
override DataFlow::Node getAPathArgument() {
547+
result in [this.getArg(0), this.getArgByName("filename_or_fp")]
548+
}
549+
}
522550
}
Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,17 @@
1-
from flask import Flask, request
1+
from flask import Flask, request, send_from_directory, send_file
22
app = Flask(__name__)
33

44
@app.route("/save-uploaded-file") # $routeSetup="/save-uploaded-file"
55
def test_taint(): # $requestHandler
66
request.files['key'].save("path") # $ getAPathArgument="path"
7+
8+
9+
@app.route("/path-injection") # $routeSetup="/path-injection"
10+
def test_path(): # $requestHandler
11+
12+
send_from_directory("filepath","file") # $ getAPathArgument="filepath" getAPathArgument="file"
13+
send_file("file") # $ getAPathArgument="file"
14+
15+
send_from_directory(directory="filepath","file") # $ getAPathArgument="filepath" getAPathArgument="file"
16+
send_from_directory(filename="filepath","file") # $ getAPathArgument="filepath" getAPathArgument="file"
17+
send_file(filename_or_fp="file") # $ getAPathArgument="file"

0 commit comments

Comments
 (0)