Skip to content

Commit 1040561

Browse files
committed
Swift: Model formatting append methods.
1 parent a6fe620 commit 1040561

File tree

3 files changed

+23
-2
lines changed

3 files changed

+23
-2
lines changed

swift/ql/lib/codeql/swift/StringFormat.qll

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,19 @@ class LocalizedStringWithFormat extends FormattingFunction, Method {
5555
override int getFormatParameterIndex() { result = 0 }
5656
}
5757

58+
/**
59+
* A method that appends a formatted string.
60+
*/
61+
class StringMethodWithFormat extends FormattingFunction, Method {
62+
StringMethodWithFormat() {
63+
this.hasQualifiedName("NSMutableString", "appendFormat(_:_:)")
64+
or
65+
this.hasQualifiedName("StringProtocol", "appendingFormat(_:_:)")
66+
}
67+
68+
override int getFormatParameterIndex() { result = 0 }
69+
}
70+
5871
/**
5972
* The functions `NSLog` and `NSLogv`.
6073
*/

swift/ql/test/query-tests/Security/CWE-134/UncontrolledFormatString.expected

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,14 @@ edges
1717
| UncontrolledFormatString.swift:91:24:91:77 | call to String.init(contentsOf:) | UncontrolledFormatString.swift:115:11:115:11 | tainted |
1818
| UncontrolledFormatString.swift:91:24:91:77 | call to String.init(contentsOf:) | UncontrolledFormatString.swift:116:11:116:11 | tainted |
1919
| UncontrolledFormatString.swift:91:24:91:77 | call to String.init(contentsOf:) | UncontrolledFormatString.swift:118:61:118:61 | tainted |
20+
| UncontrolledFormatString.swift:91:24:91:77 | call to String.init(contentsOf:) | UncontrolledFormatString.swift:130:39:130:39 | tainted |
21+
| UncontrolledFormatString.swift:91:24:91:77 | call to String.init(contentsOf:) | UncontrolledFormatString.swift:135:37:135:37 | tainted |
2022
| UncontrolledFormatString.swift:108:43:108:43 | tainted | UncontrolledFormatString.swift:108:26:108:50 | call to NSString.init(string:) |
2123
| UncontrolledFormatString.swift:109:57:109:57 | tainted | UncontrolledFormatString.swift:109:40:109:64 | call to NSString.init(string:) |
2224
| UncontrolledFormatString.swift:111:50:111:50 | tainted | UncontrolledFormatString.swift:111:33:111:57 | call to NSString.init(string:) |
2325
| UncontrolledFormatString.swift:112:64:112:64 | tainted | UncontrolledFormatString.swift:112:47:112:71 | call to NSString.init(string:) |
2426
| UncontrolledFormatString.swift:116:11:116:11 | tainted | UncontrolledFormatString.swift:77:12:77:22 | format |
27+
| UncontrolledFormatString.swift:135:37:135:37 | tainted | UncontrolledFormatString.swift:135:20:135:44 | call to NSString.init(string:) |
2528
nodes
2629
| UncontrolledFormatString.swift:77:12:77:22 | format | semmle.label | format |
2730
| UncontrolledFormatString.swift:78:22:80:5 | format | semmle.label | format |
@@ -47,6 +50,9 @@ nodes
4750
| UncontrolledFormatString.swift:115:11:115:11 | tainted | semmle.label | tainted |
4851
| UncontrolledFormatString.swift:116:11:116:11 | tainted | semmle.label | tainted |
4952
| UncontrolledFormatString.swift:118:61:118:61 | tainted | semmle.label | tainted |
53+
| UncontrolledFormatString.swift:130:39:130:39 | tainted | semmle.label | tainted |
54+
| UncontrolledFormatString.swift:135:20:135:44 | call to NSString.init(string:) | semmle.label | call to NSString.init(string:) |
55+
| UncontrolledFormatString.swift:135:37:135:37 | tainted | semmle.label | tainted |
5056
subpaths
5157
#select
5258
| UncontrolledFormatString.swift:79:16:79:16 | format | UncontrolledFormatString.swift:91:24:91:77 | call to String.init(contentsOf:) | UncontrolledFormatString.swift:79:16:79:16 | format | This format string depends on $@. | UncontrolledFormatString.swift:91:24:91:77 | call to String.init(contentsOf:) | this user-provided value |
@@ -63,3 +69,5 @@ subpaths
6369
| UncontrolledFormatString.swift:112:47:112:71 | call to NSString.init(string:) | UncontrolledFormatString.swift:91:24:91:77 | call to String.init(contentsOf:) | UncontrolledFormatString.swift:112:47:112:71 | call to NSString.init(string:) | This format string depends on $@. | UncontrolledFormatString.swift:91:24:91:77 | call to String.init(contentsOf:) | this user-provided value |
6470
| UncontrolledFormatString.swift:115:11:115:11 | tainted | UncontrolledFormatString.swift:91:24:91:77 | call to String.init(contentsOf:) | UncontrolledFormatString.swift:115:11:115:11 | tainted | This format string depends on $@. | UncontrolledFormatString.swift:91:24:91:77 | call to String.init(contentsOf:) | this user-provided value |
6571
| UncontrolledFormatString.swift:118:61:118:61 | tainted | UncontrolledFormatString.swift:91:24:91:77 | call to String.init(contentsOf:) | UncontrolledFormatString.swift:118:61:118:61 | tainted | This format string depends on $@. | UncontrolledFormatString.swift:91:24:91:77 | call to String.init(contentsOf:) | this user-provided value |
72+
| UncontrolledFormatString.swift:130:39:130:39 | tainted | UncontrolledFormatString.swift:91:24:91:77 | call to String.init(contentsOf:) | UncontrolledFormatString.swift:130:39:130:39 | tainted | This format string depends on $@. | UncontrolledFormatString.swift:91:24:91:77 | call to String.init(contentsOf:) | this user-provided value |
73+
| UncontrolledFormatString.swift:135:20:135:44 | call to NSString.init(string:) | UncontrolledFormatString.swift:91:24:91:77 | call to String.init(contentsOf:) | UncontrolledFormatString.swift:135:20:135:44 | call to NSString.init(string:) | This format string depends on $@. | UncontrolledFormatString.swift:91:24:91:77 | call to String.init(contentsOf:) | this user-provided value |

swift/ql/test/query-tests/Security/CWE-134/UncontrolledFormatString.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,12 +127,12 @@ func tests() throws {
127127

128128
_ = String("abc").appendingFormat("%s", "abc") // GOOD: not tainted
129129
_ = String("abc").appendingFormat("%s", tainted) // GOOD: format not tainted
130-
_ = String("abc").appendingFormat(tainted, "abc") // BAD [NOT DETECTED]
130+
_ = String("abc").appendingFormat(tainted, "abc") // BAD
131131
_ = String(tainted).appendingFormat("%s", "abc") // GOOD: format not tainted
132132

133133
let s = NSMutableString(string: "foo")
134134
s.appendFormat(NSString(string: "%s"), "abc") // GOOD: not tainted
135-
s.appendFormat(NSString(string: tainted), "abc") // BAD [NOT DETECTED]
135+
s.appendFormat(NSString(string: tainted), "abc") // BAD
136136

137137
_ = NSPredicate(format: tainted) // GOOD: this should be flagged by `swift/predicate-injection`, not `swift/uncontrolled-format-string`
138138

0 commit comments

Comments
 (0)