@@ -16,6 +16,8 @@ import python
1616import semmle.python.dataflow.new.DataFlow
1717import semmle.python.dataflow.new.TaintTracking
1818import semmle.python.filters.Tests
19+ private import semmle.python.dataflow.new.internal.DataFlowDispatch as DataFlowDispatch
20+ private import semmle.python.dataflow.new.internal.Builtins:: Builtins as Builtins
1921
2022bindingset [ char, fraction]
2123predicate fewer_characters_than ( StrConst str , string char , float fraction ) {
@@ -30,15 +32,13 @@ predicate fewer_characters_than(StrConst str, string char, float fraction) {
3032}
3133
3234predicate possible_reflective_name ( string name ) {
33- exists ( any ( ModuleValue m ) . attr ( name ) )
35+ any ( Function f ) . getName ( ) = name
3436 or
35- exists ( any ( ClassValue c ) .lookup ( name ) )
37+ any ( Class c ) .getName ( ) = name
3638 or
37- any ( ClassValue c ) .getName ( ) = name
39+ any ( Module m ) .getName ( ) = name
3840 or
39- exists ( Module:: named ( name ) )
40- or
41- exists ( Value:: named ( name ) )
41+ exists ( Builtins:: likelyBuiltin ( name ) )
4242}
4343
4444int char_count ( StrConst str ) { result = count ( string c | c = str .getText ( ) .charAt ( _) ) }
@@ -84,7 +84,9 @@ class CredentialSink extends DataFlow::Node {
8484 name .regexpMatch ( getACredentialRegex ( ) ) and
8585 not name .matches ( "%file" )
8686 |
87- any ( FunctionValue func ) .getNamedArgumentForCall ( _, name ) = this .asCfgNode ( )
87+ exists ( DataFlowDispatch:: ArgumentPosition pos | pos .isKeyword ( name ) |
88+ this .( DataFlow:: ArgumentNode ) .argumentOf ( _, pos )
89+ )
8890 or
8991 exists ( Keyword k | k .getArg ( ) = name and k .getValue ( ) .getAFlowNode ( ) = this .asCfgNode ( ) )
9092 or
0 commit comments