Skip to content

Commit dba3444

Browse files
committed
Swift: Add UncontrolledFormatStringExtensions.qll.
1 parent cf3345e commit dba3444

File tree

2 files changed

+45
-2
lines changed

2 files changed

+45
-2
lines changed
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/**
2+
* Provides classes and predicates for reasoning about uncontrolled
3+
* format string vulnerabilities.
4+
*/
5+
6+
import swift
7+
import codeql.swift.StringFormat
8+
import codeql.swift.dataflow.DataFlow
9+
import codeql.swift.dataflow.TaintTracking
10+
11+
/**
12+
* A dataflow sink for uncontrolled format string vulnerabilities.
13+
*/
14+
abstract class UncontrolledFormatStringSink extends DataFlow::Node { }
15+
16+
/**
17+
* A sanitizer for uncontrolled format string vulnerabilities.
18+
*/
19+
abstract class UncontrolledFormatStringSanitizer extends DataFlow::Node { }
20+
21+
/**
22+
* A unit class for adding additional taint steps.
23+
*/
24+
class UncontrolledFormatStringAdditionalTaintStep extends Unit {
25+
abstract predicate step(DataFlow::Node nodeFrom, DataFlow::Node nodeTo);
26+
}
27+
28+
/**
29+
* A default uncontrolled format string sink, that is, the format argument to
30+
* a `FormattingFunctionCall`.
31+
*/
32+
private class DefaultUncontrolledFormatStringSink extends UncontrolledFormatStringSink {
33+
DefaultUncontrolledFormatStringSink() {
34+
this.asExpr() = any(FormattingFunctionCall fc).getFormat()
35+
}
36+
}

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import codeql.swift.StringFormat
88
import codeql.swift.dataflow.DataFlow
99
import codeql.swift.dataflow.TaintTracking
1010
import codeql.swift.dataflow.FlowSources
11+
import codeql.swift.security.UncontrolledFormatStringExtensions
1112

1213
/**
1314
* A taint configuration for tainted data that reaches a format string.
@@ -17,7 +18,13 @@ class TaintedFormatConfiguration extends TaintTracking::Configuration {
1718

1819
override predicate isSource(DataFlow::Node node) { node instanceof FlowSource }
1920

20-
override predicate isSink(DataFlow::Node node) {
21-
node.asExpr() = any(FormattingFunctionCall fc).getFormat()
21+
override predicate isSink(DataFlow::Node node) { node instanceof UncontrolledFormatStringSink }
22+
23+
override predicate isSanitizer(DataFlow::Node sanitizer) {
24+
sanitizer instanceof UncontrolledFormatStringSanitizer
25+
}
26+
27+
override predicate isAdditionalTaintStep(DataFlow::Node nodeFrom, DataFlow::Node nodeTo) {
28+
any(UncontrolledFormatStringAdditionalTaintStep s).step(nodeFrom, nodeTo)
2229
}
2330
}

0 commit comments

Comments
 (0)