@@ -525,13 +525,20 @@ module Flask {
525
525
*
526
526
* See https://flask.palletsprojects.com/en/1.1.x/api/#flask.send_from_directory
527
527
*/
528
- class FlaskSendFromDirectory extends FileSystemAccess:: Range , DataFlow:: CallCfgNode {
529
- FlaskSendFromDirectory ( ) {
528
+ private class FlaskSendFromDirectoryCall extends FileSystemAccess:: Range , DataFlow:: CallCfgNode {
529
+ FlaskSendFromDirectoryCall ( ) {
530
530
this = API:: moduleImport ( "flask" ) .getMember ( "send_from_directory" ) .getACall ( )
531
531
}
532
532
533
533
override DataFlow:: Node getAPathArgument ( ) {
534
- result in [ this .getArg ( _) , this .getArgByName ( [ "directory" , "filename" ] ) ]
534
+ result in [
535
+ this .getArg ( 0 ) , this .getArgByName ( "directory" ) ,
536
+ // as described in the docs, the `filename` argument is restrained to be within
537
+ // the provided directory, so is not exposed to path-injection. (but is still a
538
+ // path-argument).
539
+ this .getArg ( 1 ) , this .getArgByName ( "filename" )
540
+ // TODO: Exclude filename as path-injection sink
541
+ ]
535
542
}
536
543
}
537
544
@@ -540,8 +547,8 @@ module Flask {
540
547
*
541
548
* See https://flask.palletsprojects.com/en/1.1.x/api/#flask.send_file
542
549
*/
543
- class FlaskSendFile extends FileSystemAccess:: Range , DataFlow:: CallCfgNode {
544
- FlaskSendFile ( ) { this = API:: moduleImport ( "flask" ) .getMember ( "send_file" ) .getACall ( ) }
550
+ private class FlaskSendFileCall extends FileSystemAccess:: Range , DataFlow:: CallCfgNode {
551
+ FlaskSendFileCall ( ) { this = API:: moduleImport ( "flask" ) .getMember ( "send_file" ) .getACall ( ) }
545
552
546
553
override DataFlow:: Node getAPathArgument ( ) {
547
554
result in [ this .getArg ( 0 ) , this .getArgByName ( "filename_or_fp" ) ]
0 commit comments