Skip to content

Commit 0530981

Browse files
authored
Merge pull request #14266 from geoffw0/quickfix
Swift: Improve taint models for NSString
2 parents 7e04ac5 + af315c5 commit 0530981

File tree

5 files changed

+21
-11
lines changed

5 files changed

+21
-11
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
category: minorAnalysis
3+
---
4+
5+
* Modelled varargs function in `NSString` more accurately.

swift/ql/lib/codeql/swift/frameworks/StandardLibrary/NsString.qll

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,10 @@ private class NsStringSummaries extends SummaryModelCsv {
5050
";NSString;true;init(format:arguments:);;;Argument[0..1];ReturnValue;taint",
5151
";NSString;true;init(format:locale:arguments:);;;Argument[0];ReturnValue;taint",
5252
";NSString;true;init(format:locale:arguments:);;;Argument[2];ReturnValue;taint",
53-
";NSString;true;init(format:_:);;;Argument[0];ReturnValue;taint", //0..
54-
";NSString;true;init(format:locale:_:);;;Argument[0];ReturnValue;taint", //0,2..
53+
";NSString;true;init(format:_:);;;Argument[0];ReturnValue;taint",
54+
";NSString;true;init(format:_:);;;Argument[1].CollectionElement;ReturnValue;taint",
55+
";NSString;true;init(format:locale:_:);;;Argument[0];ReturnValue;taint",
56+
";NSString;true;init(format:locale:_:);;;Argument[2].CollectionElement;ReturnValue;taint",
5557
";NSString;true;init(data:encoding:);;;Argument[0];ReturnValue;taint",
5658
";NSString;true;init(contentsOfFile:);;;Argument[0];ReturnValue;taint",
5759
";NSString;true;init(contentsOfFile:encoding:);;;Argument[0];ReturnValue;taint",
@@ -60,7 +62,8 @@ private class NsStringSummaries extends SummaryModelCsv {
6062
";NSString;true;init(contentsOf:encoding:);;;Argument[0];ReturnValue;taint",
6163
";NSString;true;init(contentsOf:usedEncoding:);;;Argument[0];ReturnValue;taint",
6264
";NSString;true;init(coder:);;;Argument[0];ReturnValue;taint",
63-
";NSString;true;localizedStringWithFormat(_:_:);;;Argument[0];ReturnValue;taint", //0..
65+
";NSString;true;localizedStringWithFormat(_:_:);;;Argument[0];ReturnValue;taint",
66+
";NSString;true;localizedStringWithFormat(_:_:);;;Argument[1].CollectionElement;ReturnValue;taint",
6467
";NSString;true;character(at:);;;Argument[-1];ReturnValue;taint",
6568
";NSString;true;getCharacters(_:);;;Argument[-1];Argument[0];taint",
6669
";NSString;true;getCharacters(_:range:);;;Argument[-1];Argument[0];taint",
@@ -72,7 +75,8 @@ private class NsStringSummaries extends SummaryModelCsv {
7275
";NSString;true;getCString(_:maxLength:);;;Argument[-1];Argument[0];taint",
7376
";NSString;true;getCString(_:maxLength:encoding:);;;Argument[-1];Argument[0];taint",
7477
";NSString;true;getCString(_:maxLength:range:remaining:);;;Argument[-1];Argument[0];taint",
75-
";NSString;true;appendingFormat(_:_:);;;Argument[-1..0];ReturnValue;taint", // -1..
78+
";NSString;true;appendingFormat(_:_:);;;Argument[-1..0];ReturnValue;taint",
79+
";NSString;true;appendingFormat(_:_:);;;Argument[1].CollectionElement;ReturnValue;taint",
7680
";NSString;true;appending(_:);;;Argument[-1..0];ReturnValue;taint",
7781
";NSString;true;padding(toLength:withPad:startingAt:);;;Argument[-1];ReturnValue;taint",
7882
";NSString;true;padding(toLength:withPad:startingAt:);;;Argument[1];ReturnValue;taint",
@@ -119,7 +123,8 @@ private class NsStringSummaries extends SummaryModelCsv {
119123
";NSMutableString;true;replaceCharacters(in:with:);;;Argument[1];Argument[-1];taint",
120124
";NSMutableString;true;replaceOccurrences(of:with:options:range:);;;Argument[1];Argument[-1];taint",
121125
";NSMutableString;true;setString(_:);;;Argument[0];Argument[-1];taint",
122-
";NSMutableString;true;appendFormat(_:_:);;;Argument[0];Argument[-1];taint", //0..
126+
";NSMutableString;true;appendFormat(_:_:);;;Argument[0];Argument[-1];taint",
127+
";NSMutableString;true;appendFormat(_:_:);;;Argument[1].CollectionElement;Argument[-1];taint",
123128
]
124129
}
125130
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
failures
21
testFailures
2+
failures

swift/ql/test/library-tests/dataflow/taint/libraries/nsstring.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ class NSString : NSObject, NSCopying, NSMutableCopying {
5252
func copy(with zone: NSZone? = nil) -> Any { return 0 }
5353
func mutableCopy(with zone: NSZone? = nil) -> Any { return 0 }
5454

55-
class func localizedStringWithFormat(_ format: NSString, _ args: CVarArg) -> Self { return (nil as Self?)! }
55+
class func localizedStringWithFormat(_ format: NSString, _ args: CVarArg...) -> Self { return (nil as Self?)! }
5656
class func path(withComponents components: [String]) -> String { return "" }
5757
class func string(withCString bytes: UnsafePointer<CChar>) -> Any? { return nil }
5858
class func string(withCString bytes: UnsafePointer<CChar>, length: Int) -> Any? { return nil }
@@ -185,7 +185,7 @@ func sourceUnsafeMutableRawPointer() -> UnsafeMutableRawPointer { return (nil as
185185
func sourceCString() -> UnsafePointer<CChar> { return (nil as UnsafePointer<CChar>?)! }
186186
func sourceData() -> Data { return Data(0) }
187187
func sourceStringArray() -> [String] { return [] }
188-
188+
func sourceInt() -> Int { return 0 }
189189
func sink(arg: Any) {}
190190

191191
func taintThroughInterpolatedStrings() {
@@ -244,8 +244,8 @@ func taintThroughInterpolatedStrings() {
244244

245245
let harmless = NSString(string: "harmless")
246246
let myRange = NSRange(location:0, length: 128)
247-
248-
sink(arg: NSString.localizedStringWithFormat(sourceNSString(), (nil as CVarArg?)!)) // $ tainted=248
247+
sink(arg: NSString.localizedStringWithFormat(NSString(string: "%i %i %i"), 1, sourceInt(), 3)) // $ tainted=247
248+
sink(arg: NSString.localizedStringWithFormat(sourceNSString(), 1, 2, 3)) // $ tainted=248
249249
sink(arg: sourceNSString().character(at: 0)) // $ tainted=249
250250
sink(arg: sourceNSString().cString(using: 0)!) // $ tainted=250
251251
sink(arg: sourceNSString().cString()) // $ tainted=251

swift/ql/test/library-tests/dataflow/taint/libraries/string.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,7 @@ func taintThroughSimpleStringOperations() {
226226
sink(arg: String(format: tainted, locale: nil, 1, 2, 3)) // $ tainted=217
227227
sink(arg: String(format: tainted, locale: nil, arguments: [])) // $ tainted=217
228228
sink(arg: String.localizedStringWithFormat(tainted, 1, 2, 3)) // $ tainted=217
229+
sink(arg: String.localizedStringWithFormat("%i %s %i", 1, tainted, 3)) // $ tainted=217
229230
sink(arg: String(format: "%s", tainted)) // $ tainted=217
230231
sink(arg: String(format: "%i %i %i", 1, 2, taintedInt)) // $ tainted=218
231232

@@ -235,7 +236,6 @@ func taintThroughSimpleStringOperations() {
235236
sink(arg: tainted.dropFirst(10)) // $ tainted=217
236237
sink(arg: tainted.dropLast(10)) // $ tainted=217
237238
sink(arg: tainted.substring(from: tainted.startIndex)) // $ tainted=217
238-
239239
sink(arg: tainted.lowercased()) // $ tainted=217
240240
sink(arg: tainted.uppercased()) // $ tainted=217
241241
sink(arg: tainted.lowercased(with: nil)) // $ tainted=217

0 commit comments

Comments
 (0)