@@ -8,129 +8,13 @@ private import semmle.python.dataflow.new.DataFlow
88private import semmle.python.Concepts
99private import semmle.python.ApiGraphs
1010
11- private module XmlEtree {
12- /**
13- * Provides models for `xml.etree` parsers
14- *
15- * See
16- * - https://docs.python.org/3.10/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser
17- * - https://docs.python.org/3.10/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLPullParser
18- */
19- module XMLParser {
20- /**
21- * A source of instances of `xml.etree` parsers, extend this class to model new instances.
22- *
23- * This can include instantiations of the class, return values from function
24- * calls, or a special parameter that will be set when functions are called by an external
25- * library.
26- *
27- * Use the predicate `XMLParser::instance()` to get references to instances of `xml.etree` parsers.
28- */
29- abstract class InstanceSource extends DataFlow:: LocalSourceNode { }
30-
31- /** A direct instantiation of `xml.etree` parsers. */
32- private class ClassInstantiation extends InstanceSource , DataFlow:: CallCfgNode {
33- ClassInstantiation ( ) {
34- this =
35- API:: moduleImport ( "xml" )
36- .getMember ( "etree" )
37- .getMember ( "ElementTree" )
38- .getMember ( "XMLParser" )
39- .getACall ( )
40- or
41- this =
42- API:: moduleImport ( "xml" )
43- .getMember ( "etree" )
44- .getMember ( "ElementTree" )
45- .getMember ( "XMLPullParser" )
46- .getACall ( )
47- }
48- }
49-
50- /** Gets a reference to an `xml.etree` parser instance. */
51- private DataFlow:: TypeTrackingNode instance ( DataFlow:: TypeTracker t ) {
52- t .start ( ) and
53- result instanceof InstanceSource
54- or
55- exists ( DataFlow:: TypeTracker t2 | result = instance ( t2 ) .track ( t2 , t ) )
56- }
57-
58- /** Gets a reference to an `xml.etree` parser instance. */
59- DataFlow:: Node instance ( ) { instance ( DataFlow:: TypeTracker:: end ( ) ) .flowsTo ( result ) }
60-
61- /**
62- * A call to the `feed` method of an `xml.etree` parser.
63- */
64- private class XMLEtreeParserFeedCall extends DataFlow:: MethodCallNode , XML:: XMLParsing:: Range {
65- XMLEtreeParserFeedCall ( ) { this .calls ( instance ( ) , "feed" ) }
66-
67- override DataFlow:: Node getAnInput ( ) { result in [ this .getArg ( 0 ) , this .getArgByName ( "data" ) ] }
68-
69- override predicate vulnerableTo ( XML:: XMLParsingVulnerabilityKind kind ) {
70- kind .isBillionLaughs ( ) or kind .isQuadraticBlowup ( )
71- }
72-
73- override predicate mayExecuteInput ( ) { none ( ) }
74-
75- override DataFlow:: Node getOutput ( ) {
76- exists ( DataFlow:: Node objRef |
77- DataFlow:: localFlow ( this .getObject ( ) , objRef ) and
78- result .( DataFlow:: MethodCallNode ) .calls ( objRef , "close" )
79- )
80- }
81- }
82- }
83-
84- /**
85- * A call to either of:
86- * - `xml.etree.ElementTree.fromstring`
87- * - `xml.etree.ElementTree.fromstringlist`
88- * - `xml.etree.ElementTree.XML`
89- * - `xml.etree.ElementTree.XMLID`
90- * - `xml.etree.ElementTree.parse`
91- * - `xml.etree.ElementTree.iterparse`
92- */
93- private class XMLEtreeParsing extends DataFlow:: CallCfgNode , XML:: XMLParsing:: Range {
94- XMLEtreeParsing ( ) {
95- this =
96- API:: moduleImport ( "xml" )
97- .getMember ( "etree" )
98- .getMember ( "ElementTree" )
99- .getMember ( [ "fromstring" , "fromstringlist" , "XML" , "XMLID" , "parse" , "iterparse" ] )
100- .getACall ( )
101- }
102-
103- override DataFlow:: Node getAnInput ( ) {
104- result in [
105- this .getArg ( 0 ) ,
106- // fromstring / XML / XMLID
107- this .getArgByName ( "text" ) ,
108- // fromstringlist
109- this .getArgByName ( "sequence" ) ,
110- // parse / iterparse
111- this .getArgByName ( "source" ) ,
112- ]
113- }
114-
115- override predicate vulnerableTo ( XML:: XMLParsingVulnerabilityKind kind ) {
116- // note: it does not matter what `xml.etree` parser you are using, you cannot
117- // change the security features anyway :|
118- kind .isBillionLaughs ( ) or kind .isQuadraticBlowup ( )
119- }
120-
121- override predicate mayExecuteInput ( ) { none ( ) }
122-
123- override DataFlow:: Node getOutput ( ) { result = this }
124- }
125- }
126-
12711private module SaxBasedParsing {
12812 /**
12913 * A call to the `setFeature` method on a XML sax parser.
13014 *
13115 * See https://docs.python.org/3.10/library/xml.sax.reader.html#xml.sax.xmlreader.XMLReader.setFeature
13216 */
133- class SaxParserSetFeatureCall extends DataFlow:: MethodCallNode {
17+ private class SaxParserSetFeatureCall extends DataFlow:: MethodCallNode {
13418 SaxParserSetFeatureCall ( ) {
13519 this =
13620 API:: moduleImport ( "xml" )
0 commit comments