Skip to content

Commit cb8568f

Browse files
committed
Swift: Rewrite PathInjection to use DataFlow::ConfigSig
1 parent 9757580 commit cb8568f

File tree

3 files changed

+28
-8
lines changed

3 files changed

+28
-8
lines changed

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

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ private import codeql.swift.security.PathInjectionExtensions
1313
/**
1414
* A taint-tracking configuration for path injection vulnerabilities.
1515
*/
16-
class PathInjectionConfiguration extends TaintTracking::Configuration {
16+
deprecated class PathInjectionConfiguration extends TaintTracking::Configuration {
1717
PathInjectionConfiguration() { this = "PathInjectionConfiguration" }
1818

1919
override predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource }
@@ -28,3 +28,25 @@ class PathInjectionConfiguration extends TaintTracking::Configuration {
2828
any(PathInjectionAdditionalTaintStep s).step(node1, node2)
2929
}
3030
}
31+
32+
/**
33+
* A taint-tracking configuration for path injection vulnerabilities.
34+
*/
35+
module PathInjectionConfig implements DataFlow::ConfigSig {
36+
predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource }
37+
38+
predicate isSink(DataFlow::Node sink) { sink instanceof PathInjectionSink }
39+
40+
predicate isBarrier(DataFlow::Node sanitizer) {
41+
sanitizer instanceof PathInjectionSanitizer
42+
}
43+
44+
predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) {
45+
any(PathInjectionAdditionalTaintStep s).step(node1, node2)
46+
}
47+
}
48+
49+
/**
50+
* Detect taint flow of path injection vulnerabilities.
51+
*/
52+
module PathInjectionFlow = TaintTracking::Global<PathInjectionConfig>;

swift/ql/src/queries/Security/CWE-022/PathInjection.ql

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@
1717
import swift
1818
import codeql.swift.dataflow.DataFlow
1919
import codeql.swift.security.PathInjectionQuery
20-
import DataFlow::PathGraph
20+
import PathInjectionFlow::PathGraph
2121

22-
from DataFlow::PathNode source, DataFlow::PathNode sink
23-
where any(PathInjectionConfiguration c).hasFlowPath(source, sink)
22+
from PathInjectionFlow::PathNode source, PathInjectionFlow::PathNode sink
23+
where PathInjectionFlow::flowPath(source, sink)
2424
select sink.getNode(), source, sink, "This path depends on a $@.", source.getNode(),
2525
"user-provided value"

swift/ql/test/query-tests/Security/CWE-022/PathInjectionTest.ql

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,8 @@ class PathInjectionTest extends InlineExpectationsTest {
1010
override string getARelevantTag() { result = "hasPathInjection" }
1111

1212
override predicate hasActualResult(Location location, string element, string tag, string value) {
13-
exists(
14-
PathInjectionConfiguration config, DataFlow::Node source, DataFlow::Node sink, Expr sinkExpr
15-
|
16-
config.hasFlow(source, sink) and
13+
exists(DataFlow::Node source, DataFlow::Node sink, Expr sinkExpr |
14+
PathInjectionFlow::flow(source, sink) and
1715
sinkExpr = sink.asExpr() and
1816
location = sinkExpr.getLocation() and
1917
element = sinkExpr.toString() and

0 commit comments

Comments
 (0)