@@ -20,21 +20,22 @@ 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" }
2523
26- override predicate isSource ( DataFlow:: Node src ) { src .asExpr ( ) instanceof SafeSaxSource }
24+ module SafeSAXSourceFlowConfig implements DataFlow:: ConfigSig {
25+ predicate isSource ( DataFlow:: Node src ) { src .asExpr ( ) instanceof SafeSaxSource }
2726
28- override predicate isSink ( DataFlow:: Node sink ) {
27+ predicate isSink ( DataFlow:: Node sink ) {
2928 sink .asExpr ( ) = any ( XmlParserCall parse ) .getSink ( )
3029 }
3130
32- override int fieldFlowBranchLimit ( ) { result = 0 }
31+ int fieldFlowBranchLimit ( ) { result = 0 }
3332}
3433
34+ module SafeSAXSourceFlow = TaintTracking:: Global< SafeSAXSourceFlowConfig > ;
35+
3536class UnsafeXxeSink extends DataFlow:: ExprNode {
3637 UnsafeXxeSink ( ) {
37- not exists ( SafeSAXSourceFlowConfig safeSource | safeSource . hasFlowTo ( this ) ) and
38+ not exists ( SafeSAXSourceFlow :: flowPath ( this ) ) and
3839 exists ( XmlParserCall parse |
3940 parse .getSink ( ) = this .getExpr ( ) and
4041 not parse .isSafe ( )
@@ -43,7 +44,9 @@ class UnsafeXxeSink extends DataFlow::ExprNode {
4344}
4445
4546module XXELocalConfig implements DataFlow:: ConfigSig {
46- predicate isSource ( DataFlow:: Node source ) { source instanceof LocalUserInput }
47+ predicate isSource ( DataFlow:: Node source ) {
48+ source instanceof LocalUserInput and
49+ not exists ( DataFlow:: Node src | src .asExpr ( ) instanceof SafeSaxSource ) }
4750
4851 predicate isSink ( DataFlow:: Node sink ) { sink instanceof UnsafeXxeSink }
4952}
0 commit comments