Skip to content

Commit 0ff607c

Browse files
committed
Swift: Rewrite XXEQuery to use DataFlow::ConfigSig
1 parent 9220bea commit 0ff607c

File tree

3 files changed

+26
-6
lines changed

3 files changed

+26
-6
lines changed

swift/ql/lib/codeql/swift/security/XXEQuery.qll

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import codeql.swift.security.XXEExtensions
1212
/**
1313
* A taint-tracking configuration for XML external entities (XXE) vulnerabilities.
1414
*/
15-
class XxeConfiguration extends TaintTracking::Configuration {
15+
deprecated class XxeConfiguration extends TaintTracking::Configuration {
1616
XxeConfiguration() { this = "XxeConfiguration" }
1717

1818
override predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource }
@@ -25,3 +25,23 @@ class XxeConfiguration extends TaintTracking::Configuration {
2525
any(XxeAdditionalTaintStep s).step(n1, n2)
2626
}
2727
}
28+
29+
/**
30+
* A taint-tracking configuration for XML external entities (XXE) vulnerabilities.
31+
*/
32+
module XxeConfig implements DataFlow::ConfigSig {
33+
predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource }
34+
35+
predicate isSink(DataFlow::Node sink) { sink instanceof XxeSink }
36+
37+
predicate isBarrier(DataFlow::Node sanitizer) { sanitizer instanceof XxeSanitizer }
38+
39+
predicate isAdditionalFlowStep(DataFlow::Node n1, DataFlow::Node n2) {
40+
any(XxeAdditionalTaintStep s).step(n1, n2)
41+
}
42+
}
43+
44+
/**
45+
* Detect taint flow of XML external entities (XXE) vulnerabilities.
46+
*/
47+
module XxeFlow = TaintTracking::Global<XxeConfig>;

swift/ql/src/queries/Security/CWE-611/XXE.ql

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@
1616
import swift
1717
import codeql.swift.dataflow.DataFlow
1818
import codeql.swift.security.XXEQuery
19-
import DataFlow::PathGraph
19+
import XxeFlow::PathGraph
2020

21-
from DataFlow::PathNode source, DataFlow::PathNode sink
22-
where any(XxeConfiguration c).hasFlowPath(source, sink)
21+
from XxeFlow::PathNode source, XxeFlow::PathNode sink
22+
where XxeFlow::flowPath(source, sink)
2323
select sink.getNode(), source, sink,
2424
"XML parsing depends on a $@ without guarding against external entity expansion.",
2525
source.getNode(), "user-provided value"

swift/ql/test/query-tests/Security/CWE-611/XXETest.ql

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ class XxeTest extends InlineExpectationsTest {
1515
override string getARelevantTag() { result = "hasXXE" }
1616

1717
override predicate hasActualResult(Location location, string element, string tag, string value) {
18-
exists(XxeConfiguration config, DataFlow::Node source, DataFlow::Node sink, Expr sinkExpr |
19-
config.hasFlow(source, sink) and
18+
exists(DataFlow::Node source, DataFlow::Node sink, Expr sinkExpr |
19+
XxeFlow::flow(source, sink) and
2020
sinkExpr = sink.asExpr() and
2121
location = sinkExpr.getLocation() and
2222
element = sinkExpr.toString() and

0 commit comments

Comments
 (0)