@@ -20,21 +20,21 @@ import semmle.code.java.dataflow.TaintTracking2
2020//import DataFlow::PathGraph
2121import github.LocalSources
2222
23- class SafeSAXSourceFlowConfig extends TaintTracking2 :: Configuration {
24- SafeSAXSourceFlowConfig ( ) { this = "XmlParsers::SafeSAXSourceFlowConfig" }
23+ module SafeSAXSourceFlowConfig implements DataFlow :: ConfigSig {
24+ predicate isSource ( DataFlow :: Node src ) { src . asExpr ( ) instanceof SafeSaxSource }
2525
26- override predicate isSource ( DataFlow:: Node src ) { src .asExpr ( ) instanceof SafeSaxSource }
27-
28- override predicate isSink ( DataFlow:: Node sink ) {
26+ predicate isSink ( DataFlow:: Node sink ) {
2927 sink .asExpr ( ) = any ( XmlParserCall parse ) .getSink ( )
3028 }
3129
32- override int fieldFlowBranchLimit ( ) { result = 0 }
30+ int fieldFlowBranchLimit ( ) { result = 0 }
3331}
3432
33+ module SafeSAXSourceFlow = TaintTracking:: Global< SafeSAXSourceFlowConfig > ;
34+
3535class UnsafeXxeSink extends DataFlow:: ExprNode {
3636 UnsafeXxeSink ( ) {
37- not exists ( SafeSAXSourceFlowConfig safeSource | safeSource . hasFlowTo ( this ) ) and
37+ not SafeSAXSourceFlow :: flowTo ( this ) and
3838 exists ( XmlParserCall parse |
3939 parse .getSink ( ) = this .getExpr ( ) and
4040 not parse .isSafe ( )
@@ -43,7 +43,9 @@ class UnsafeXxeSink extends DataFlow::ExprNode {
4343}
4444
4545module XXELocalConfig implements DataFlow:: ConfigSig {
46- predicate isSource ( DataFlow:: Node source ) { source instanceof LocalUserInput }
46+ predicate isSource ( DataFlow:: Node source ) {
47+ source instanceof LocalUserInput and
48+ not exists ( DataFlow:: Node src | src .asExpr ( ) instanceof SafeSaxSource ) }
4749
4850 predicate isSink ( DataFlow:: Node sink ) { sink instanceof UnsafeXxeSink }
4951}
0 commit comments