File tree Expand file tree Collapse file tree 2 files changed +42
-1
lines changed
lib/semmle/python/frameworks
test/library-tests/frameworks/flask Expand file tree Collapse file tree 2 files changed +42
-1
lines changed Original file line number Diff line number Diff line change @@ -519,4 +519,34 @@ module Flask {
519
519
520
520
override DataFlow:: Node getValueArg ( ) { none ( ) }
521
521
}
522
+
523
+ /**
524
+ * A `send_from_directory` call considered a sink for file system access vulnerabilities.
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 `send_file` call considered a sink for file system access vulnerabilities.
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 ( ) {
545
+ this = API:: moduleImport ( "flask" ) .getMember ( "send_file" ) .getACall ( )
546
+ }
547
+
548
+ override DataFlow:: Node getAPathArgument ( ) {
549
+ result in [ this .getArg ( 0 ) , this .getArgByName ( "filename_or_fp" ) ]
550
+ }
551
+ }
522
552
}
Original file line number Diff line number Diff line change 1
- from flask import Flask , request
1
+ from flask import Flask , request , send_from_directory , send_file
2
2
app = Flask (__name__ )
3
3
4
4
@app .route ("/save-uploaded-file" ) # $routeSetup="/save-uploaded-file"
5
5
def test_taint (): # $requestHandler
6
6
request .files ['key' ].save ("path" ) # $ getAPathArgument="path"
7
+
8
+
9
+ @app .route ("/path-injection" ) # $routeSetup="/path-injection"
10
+ def test_path (): # $requestHandler
11
+
12
+ flask .send_from_directory ("filepath" ,"file" ) # $ getAPathArgument="filepath" getAPathArgument="file"
13
+ flask .send_file ("file" ) # $ getAPathArgument="file"
14
+
15
+ flask .send_from_directory (directory = "filepath" ,"file" ) # $ getAPathArgument="filepath" getAPathArgument="file"
16
+ flask .send_from_directory (filename = "filepath" ,"file" ) # $ getAPathArgument="filepath" getAPathArgument="file"
17
+ flask .send_file (filename_or_fp = "file" ) # $ getAPathArgument="file"
You can’t perform that action at this time.
0 commit comments