Skip to content

Commit 4fad01a

Browse files
committed
Further refactoring
Avoid having two taint tracking configurations in the same file
1 parent f3e0b6e commit 4fad01a

File tree

6 files changed

+83
-31
lines changed

6 files changed

+83
-31
lines changed
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/** Provides classes to reason about XML eXternal Entity (XXE) vulnerabilities. */
2+
3+
import java
4+
import semmle.code.java.security.XmlParsers
5+
6+
/** A node where insecure XML parsing takes place. */
7+
abstract class XxeSink extends DataFlow::Node { }
8+
9+
/** A node that acts as a sanitizer in configurations realted to XXE vulnerabilities. */
10+
abstract class XxeSanitizer extends DataFlow::Node { }
11+
12+
/**
13+
* A unit class for adding additional taint steps.
14+
*
15+
* Extend this class to add additional taint steps that should apply to flows related to
16+
* XXE vulnerabilities.
17+
*/
18+
class XxeAdditionalTaintStep extends Unit {
19+
/**
20+
* Holds if the step from `node1` to `node2` should be considered a taint
21+
* step for flows related to XXE vulnerabilities.
22+
*/
23+
abstract predicate step(DataFlow::Node n1, DataFlow::Node n2);
24+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/** Provides taint tracking configurations to be used in local XXE queries. */
2+
3+
import java
4+
private import semmle.code.java.dataflow.FlowSources
5+
private import semmle.code.java.dataflow.TaintTracking
6+
private import semmle.code.java.security.XxeQuery
7+
8+
/**
9+
* A taint-tracking configuration for unvalidated local user input that is used in XML external entity expansion.
10+
*/
11+
class XxeLocalConfig extends TaintTracking::Configuration {
12+
XxeLocalConfig() { this = "XxeLocalConfig" }
13+
14+
override predicate isSource(DataFlow::Node src) { src instanceof LocalUserInput }
15+
16+
override predicate isSink(DataFlow::Node sink) { sink instanceof XxeSink }
17+
18+
override predicate isSanitizer(DataFlow::Node sanitizer) { sanitizer instanceof XxeSanitizer }
19+
20+
override predicate isAdditionalTaintStep(DataFlow::Node n1, DataFlow::Node n2) {
21+
any(XxeAdditionalTaintStep s).step(n1, n2)
22+
}
23+
}

java/ql/lib/semmle/code/java/security/XxeQuery.qll

Lines changed: 9 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,18 @@
1-
/** Provides taint tracking configurations to be used in XXE queries. */
1+
/** Provides default definitions to be used in XXE queries. */
22

33
import java
4-
import semmle.code.java.dataflow.FlowSources
5-
import semmle.code.java.dataflow.TaintTracking
6-
import semmle.code.java.dataflow.TaintTracking2
7-
import semmle.code.java.security.XmlParsers
4+
private import semmle.code.java.dataflow.TaintTracking2
5+
import semmle.code.java.security.Xxe
86

97
/**
10-
* A taint-tracking configuration for unvalidated remote user input that is used in XML external entity expansion.
8+
* The default implementation of a XXE sink.
9+
* The argument of a parse call on an insecurely configured XML parser.
1110
*/
12-
class XxeConfig extends TaintTracking::Configuration {
13-
XxeConfig() { this = "XxeConfig" }
14-
15-
override predicate isSource(DataFlow::Node src) { src instanceof RemoteFlowSource }
16-
17-
override predicate isSink(DataFlow::Node sink) { sink instanceof UnsafeXxeSink }
18-
}
19-
20-
/**
21-
* A taint-tracking configuration for unvalidated local user input that is used in XML external entity expansion.
22-
*/
23-
class XxeLocalConfig extends TaintTracking::Configuration {
24-
XxeLocalConfig() { this = "XxeLocalConfig" }
25-
26-
override predicate isSource(DataFlow::Node src) { src instanceof LocalUserInput }
27-
28-
override predicate isSink(DataFlow::Node sink) { sink instanceof UnsafeXxeSink }
29-
}
30-
31-
private class UnsafeXxeSink extends DataFlow::ExprNode {
32-
UnsafeXxeSink() {
11+
private class DefaultXxeSink extends XxeSink {
12+
DefaultXxeSink() {
3313
not exists(SafeSaxSourceFlowConfig safeSource | safeSource.hasFlowTo(this)) and
3414
exists(XmlParserCall parse |
35-
parse.getSink() = this.getExpr() and
15+
parse.getSink() = this.asExpr() and
3616
not parse.isSafe()
3717
)
3818
}
@@ -42,7 +22,7 @@ private class UnsafeXxeSink extends DataFlow::ExprNode {
4222
* A taint-tracking configuration for safe XML readers used to parse XML documents.
4323
*/
4424
private class SafeSaxSourceFlowConfig extends TaintTracking2::Configuration {
45-
SafeSaxSourceFlowConfig() { this = "XmlParsers::SafeSAXSourceFlowConfig" }
25+
SafeSaxSourceFlowConfig() { this = "SafeSaxSourceFlowConfig" }
4626

4727
override predicate isSource(DataFlow::Node src) { src.asExpr() instanceof SafeSaxSource }
4828

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/** Provides taint tracking configurations to be used in remote XXE queries. */
2+
3+
import java
4+
private import semmle.code.java.dataflow.FlowSources
5+
private import semmle.code.java.dataflow.TaintTracking
6+
private import semmle.code.java.security.XxeQuery
7+
8+
/**
9+
* A taint-tracking configuration for unvalidated remote user input that is used in XML external entity expansion.
10+
*/
11+
class XxeConfig extends TaintTracking::Configuration {
12+
XxeConfig() { this = "XxeConfig" }
13+
14+
override predicate isSource(DataFlow::Node src) { src instanceof RemoteFlowSource }
15+
16+
override predicate isSink(DataFlow::Node sink) { sink instanceof XxeSink }
17+
18+
override predicate isSanitizer(DataFlow::Node sanitizer) { sanitizer instanceof XxeSanitizer }
19+
20+
override predicate isAdditionalTaintStep(DataFlow::Node n1, DataFlow::Node n2) {
21+
any(XxeAdditionalTaintStep s).step(n1, n2)
22+
}
23+
}

java/ql/src/Security/CWE/CWE-611/XXE.ql

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@
1414
*/
1515

1616
import java
17-
import semmle.code.java.security.XxeQuery
17+
import semmle.code.java.dataflow.DataFlow
18+
import semmle.code.java.security.XxeRemoteQuery
1819
import DataFlow::PathGraph
1920

2021
from DataFlow::PathNode source, DataFlow::PathNode sink, XxeConfig conf

java/ql/src/Security/CWE/CWE-611/XXELocal.ql

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@
1414
*/
1515

1616
import java
17-
import semmle.code.java.security.XxeQuery
17+
import semmle.code.java.dataflow.DataFlow
18+
import semmle.code.java.security.XxeLocalQuery
1819
import DataFlow::PathGraph
1920

2021
from DataFlow::PathNode source, DataFlow::PathNode sink, XxeLocalConfig conf

0 commit comments

Comments
 (0)