@@ -525,13 +525,20 @@ module Flask {
525525 *
526526 * See https://flask.palletsprojects.com/en/1.1.x/api/#flask.send_from_directory
527527 */
528- class FlaskSendFromDirectory extends FileSystemAccess:: Range , DataFlow:: CallCfgNode {
529- FlaskSendFromDirectory ( ) {
528+ private class FlaskSendFromDirectoryCall extends FileSystemAccess:: Range , DataFlow:: CallCfgNode {
529+ FlaskSendFromDirectoryCall ( ) {
530530 this = API:: moduleImport ( "flask" ) .getMember ( "send_from_directory" ) .getACall ( )
531531 }
532532
533533 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+ ]
535542 }
536543 }
537544
@@ -540,8 +547,8 @@ module Flask {
540547 *
541548 * See https://flask.palletsprojects.com/en/1.1.x/api/#flask.send_file
542549 */
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 ( ) }
545552
546553 override DataFlow:: Node getAPathArgument ( ) {
547554 result in [ this .getArg ( 0 ) , this .getArgByName ( "filename_or_fp" ) ]
0 commit comments