11/** Provides classes to reason about XSLT injection vulnerabilities. */
22
33import java
4- import semmle.code.java.dataflow.ExternalFlow
4+ import semmle.code.java.dataflow.FlowSources
55import semmle.code.java.security.XmlParsers
66import semmle.code.java.dataflow.DataFlow
77
@@ -11,20 +11,6 @@ import semmle.code.java.dataflow.DataFlow
1111 */
1212abstract class XsltInjectionSink extends DataFlow:: Node { }
1313
14- private class DefaultXsltInjectionSinkModel extends SinkModelCsv {
15- override predicate row ( string row ) {
16- row =
17- [
18- "javax.xml.transform;Transformer;false;transform;;;Argument[-1];xslt" ,
19- "net.sf.saxon.s9api;XsltTransformer;false;transform;;;Argument[-1];xslt" ,
20- "net.sf.saxon.s9api;Xslt30Transformer;false;transform;;;Argument[-1];xslt" ,
21- "net.sf.saxon.s9api;Xslt30Transformer;false;applyTemplates;;;Argument[-1];xslt" ,
22- "net.sf.saxon.s9api;Xslt30Transformer;false;callFunction;;;Argument[-1];xslt" ,
23- "net.sf.saxon.s9api;Xslt30Transformer;false;callTemplate;;;Argument[-1];xslt"
24- ]
25- }
26- }
27-
2814/** A default sink representing methods susceptible to XSLT Injection attacks. */
2915private class DefaultXsltInjectionSink extends XsltInjectionSink {
3016 DefaultXsltInjectionSink ( ) { sinkNode ( this , "xslt" ) }
@@ -59,6 +45,25 @@ private class DefaultXsltInjectionAdditionalTaintStep extends XsltInjectionAddit
5945 }
6046}
6147
48+ /**
49+ * A taint-tracking configuration for unvalidated user input that is used in XSLT transformation.
50+ */
51+ class XsltInjectionFlowConfig extends TaintTracking:: Configuration {
52+ XsltInjectionFlowConfig ( ) { this = "XsltInjectionFlowConfig" }
53+
54+ override predicate isSource ( DataFlow:: Node source ) { source instanceof RemoteFlowSource }
55+
56+ override predicate isSink ( DataFlow:: Node sink ) { sink instanceof XsltInjectionSink }
57+
58+ override predicate isSanitizer ( DataFlow:: Node node ) {
59+ node .getType ( ) instanceof PrimitiveType or node .getType ( ) instanceof BoxedType
60+ }
61+
62+ override predicate isAdditionalTaintStep ( DataFlow:: Node node1 , DataFlow:: Node node2 ) {
63+ any ( XsltInjectionAdditionalTaintStep c ) .step ( node1 , node2 )
64+ }
65+ }
66+
6267/**
6368 * Holds if `n1` to `n2` is a dataflow step that converts between `InputStream` or `Reader` and
6469 * `XMLStreamReader`, i.e. `XMLInputFactory.createXMLStreamReader(tainted)`.
0 commit comments