|
14 | 14 | */ |
15 | 15 |
|
16 | 16 | import java |
17 | | -import semmle.code.java.security.XmlParsers |
18 | | -import semmle.code.java.dataflow.FlowSources |
19 | | -import semmle.code.java.dataflow.TaintTracking2 |
| 17 | +import semmle.code.java.dataflow.DataFlow |
| 18 | +import semmle.code.java.security.XxeRemoteQuery |
20 | 19 | import DataFlow::PathGraph |
21 | 20 |
|
22 | | -class SafeSaxSourceFlowConfig extends TaintTracking2::Configuration { |
23 | | - SafeSaxSourceFlowConfig() { this = "XmlParsers::SafeSAXSourceFlowConfig" } |
24 | | - |
25 | | - override predicate isSource(DataFlow::Node src) { src.asExpr() instanceof SafeSaxSource } |
26 | | - |
27 | | - override predicate isSink(DataFlow::Node sink) { |
28 | | - sink.asExpr() = any(XmlParserCall parse).getSink() |
29 | | - } |
30 | | - |
31 | | - override int fieldFlowBranchLimit() { result = 0 } |
32 | | -} |
33 | | - |
34 | | -class UnsafeXxeSink extends DataFlow::ExprNode { |
35 | | - UnsafeXxeSink() { |
36 | | - not exists(SafeSaxSourceFlowConfig safeSource | safeSource.hasFlowTo(this)) and |
37 | | - exists(XmlParserCall parse | |
38 | | - parse.getSink() = this.getExpr() and |
39 | | - not parse.isSafe() |
40 | | - ) |
41 | | - } |
42 | | -} |
43 | | - |
44 | | -class XxeConfig extends TaintTracking::Configuration { |
45 | | - XxeConfig() { this = "XXE.ql::XxeConfig" } |
46 | | - |
47 | | - override predicate isSource(DataFlow::Node src) { src instanceof RemoteFlowSource } |
48 | | - |
49 | | - override predicate isSink(DataFlow::Node sink) { sink instanceof UnsafeXxeSink } |
50 | | -} |
51 | | - |
52 | 21 | from DataFlow::PathNode source, DataFlow::PathNode sink, XxeConfig conf |
53 | 22 | where conf.hasFlowPath(source, sink) |
54 | 23 | select sink.getNode(), source, sink, |
|
0 commit comments