Skip to content

Commit 70d0e98

Browse files
committed
Swift: Rewrite PredicateInjection to use DataFlow::ConfigSig
1 parent 4d3fc02 commit 70d0e98

File tree

3 files changed

+28
-8
lines changed

3 files changed

+28
-8
lines changed

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

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ private import codeql.swift.security.PredicateInjectionExtensions
1212
/**
1313
* A taint-tracking configuration for predicate injection vulnerabilities.
1414
*/
15-
class PredicateInjectionConf extends TaintTracking::Configuration {
15+
deprecated class PredicateInjectionConf extends TaintTracking::Configuration {
1616
PredicateInjectionConf() { this = "PredicateInjectionConf" }
1717

1818
override predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource }
@@ -27,3 +27,25 @@ class PredicateInjectionConf extends TaintTracking::Configuration {
2727
any(PredicateInjectionAdditionalTaintStep s).step(n1, n2)
2828
}
2929
}
30+
31+
/**
32+
* A taint-tracking configuration for predicate injection vulnerabilities.
33+
*/
34+
module PredicateInjectionConfig implements DataFlow::ConfigSig {
35+
predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource }
36+
37+
predicate isSink(DataFlow::Node sink) { sink instanceof PredicateInjectionSink }
38+
39+
predicate isBarrier(DataFlow::Node sanitizer) {
40+
sanitizer instanceof PredicateInjectionSanitizer
41+
}
42+
43+
predicate isAdditionalFlowStep(DataFlow::Node n1, DataFlow::Node n2) {
44+
any(PredicateInjectionAdditionalTaintStep s).step(n1, n2)
45+
}
46+
}
47+
48+
/**
49+
* Detect taint flow of predicate injection vulnerabilities.
50+
*/
51+
module PredicateInjectionFlow = TaintTracking::Global<PredicateInjectionConfig>;

swift/ql/src/queries/Security/CWE-943/PredicateInjection.ql

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@
1414
import swift
1515
import codeql.swift.dataflow.DataFlow
1616
import codeql.swift.security.PredicateInjectionQuery
17-
import DataFlow::PathGraph
17+
import PredicateInjectionFlow::PathGraph
1818

19-
from DataFlow::PathNode source, DataFlow::PathNode sink
20-
where any(PredicateInjectionConf c).hasFlowPath(source, sink)
19+
from PredicateInjectionFlow::PathNode source, PredicateInjectionFlow::PathNode sink
20+
where PredicateInjectionFlow::flowPath(source, sink)
2121
select sink.getNode(), source, sink, "This predicate depends on a $@.", source.getNode(),
2222
"user-provided value"

swift/ql/test/query-tests/Security/CWE-946/PredicateInjectionTest.ql

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

1111
override predicate hasActualResult(Location location, string element, string tag, string value) {
12-
exists(
13-
PredicateInjectionConf config, DataFlow::Node source, DataFlow::Node sink, Expr sinkExpr
14-
|
15-
config.hasFlow(source, sink) and
12+
exists(DataFlow::Node source, DataFlow::Node sink, Expr sinkExpr |
13+
PredicateInjectionFlow::flow(source, sink) and
1614
sinkExpr = sink.asExpr() and
1715
location = sinkExpr.getLocation() and
1816
element = sinkExpr.toString() and

0 commit comments

Comments
 (0)