@@ -2,6 +2,7 @@ private import python
2
2
private import semmle.python.dataflow.new.DataFlow
3
3
private import semmle.python.dataflow.new.internal.DataFlowPrivate as DataFlowPrivate
4
4
private import semmle.python.dataflow.new.internal.TaintTrackingPublic
5
+ private import semmle.python.ApiGraphs
5
6
6
7
/**
7
8
* Holds if `node` should be a sanitizer in all global taint flow configurations
@@ -152,15 +153,14 @@ predicate containerStep(DataFlow::CfgNode nodeFrom, DataFlow::Node nodeTo) {
152
153
or
153
154
// constructor call
154
155
exists ( DataFlow:: CallCfgNode call | call = nodeTo |
155
- call .getFunction ( ) .asCfgNode ( ) .( NameNode ) .getId ( ) in [
156
- "list" , "set" , "frozenset" , "dict" , "defaultdict" , "tuple"
157
- ] and
156
+ call = API:: builtin ( [ "list" , "set" , "frozenset" , "dict" , "tuple" ] ) .getACall ( ) and
158
157
call .getArg ( 0 ) = nodeFrom
158
+ // TODO: Properly handle defaultdict/namedtuple
159
159
)
160
160
or
161
161
// functions operating on collections
162
162
exists ( DataFlow:: CallCfgNode call | call = nodeTo |
163
- call . getFunction ( ) . asCfgNode ( ) . ( NameNode ) . getId ( ) in [ "sorted" , "reversed" , "iter" , "next" ] and
163
+ call = API :: builtin ( [ "sorted" , "reversed" , "iter" , "next" ] ) . getACall ( ) and
164
164
call .getArg ( 0 ) = nodeFrom
165
165
)
166
166
or
@@ -187,14 +187,9 @@ predicate containerStep(DataFlow::CfgNode nodeFrom, DataFlow::Node nodeTo) {
187
187
* Holds if taint can flow from `nodeFrom` to `nodeTo` with a step related to copying.
188
188
*/
189
189
predicate copyStep ( DataFlow:: CfgNode nodeFrom , DataFlow:: CfgNode nodeTo ) {
190
- exists ( CallNode call | call = nodeTo .getNode ( ) |
191
- // Fully qualified: copy.copy, copy.deepcopy
192
- (
193
- call .getFunction ( ) .( NameNode ) .getId ( ) in [ "copy" , "deepcopy" ]
194
- or
195
- call .getFunction ( ) .( AttrNode ) .getObject ( [ "copy" , "deepcopy" ] ) .( NameNode ) .getId ( ) = "copy"
196
- ) and
197
- call .getArg ( 0 ) = nodeFrom .getNode ( )
190
+ exists ( DataFlow:: CallCfgNode call | call = nodeTo |
191
+ call = API:: moduleImport ( "copy" ) .getMember ( [ "copy" , "deepcopy" ] ) .getACall ( ) and
192
+ call .getArg ( 0 ) = nodeFrom
198
193
)
199
194
}
200
195
0 commit comments