Skip to content

Commit bbec408

Browse files
authored
Merge pull request #14312 from geoffw0/sqlpathinject2
Swift: Add sinks for sqlite3 and SQLite.swift to swift/cleartext-storage-database
2 parents d3a1dbc + fdcc6b4 commit bbec408

File tree

9 files changed

+579
-2
lines changed

9 files changed

+579
-2
lines changed

swift/ql/lib/codeql/swift/frameworks/Frameworks.qll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
private import Alamofire.Alamofire
66
private import JavaScriptCore.JavaScriptCore
7+
private import SQL.SQL
78
private import StandardLibrary.StandardLibrary
89
private import UIKit.UIKit
910
private import Xml.Xml
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/**
2+
* Provides models for SQL libraries.
3+
*/
4+
5+
import swift
6+
private import codeql.swift.dataflow.ExternalFlow
7+
8+
/**
9+
* A model for SQL library functions that permit taint flow.
10+
*/
11+
private class FilePathSummaries extends SummaryModelCsv {
12+
override predicate row(string row) {
13+
row =
14+
[
15+
// SQLite.Swift
16+
";;false;<-(_:_:);;;Argument[0..1];ReturnValue;taint",
17+
";Expression;true;init(_:_:);;;Argument[0];ReturnValue;taint",
18+
";Expression;true;init(_:_:);;;Argument[1].CollectionElement;ReturnValue;taint",
19+
";ExpressionType;true;init(_:);;;Argument[0];ReturnValue;taint",
20+
";ExpressionType;true;replace(_:with:);;;Argument[1];ReturnValue;taint",
21+
]
22+
}
23+
}

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

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,48 @@ private class CleartextStorageDatabaseSinks extends SinkModelCsv {
108108
";FetchableRecord;true;fetchOne(_:arguments:adapter:);;;Argument[1];database-store",
109109
";Statement;true;execute(arguments:);;;Argument[0];database-store",
110110
";CommonTableExpression;true;init(recursive:named:columns:sql:arguments:);;;Argument[4];database-store",
111-
";Statement;true;setArguments(_:);;;Argument[0];database-store"
111+
";Statement;true;setArguments(_:);;;Argument[0];database-store",
112+
// sqlite3 sinks
113+
";;false;sqlite3_exec(_:_:_:_:_:);;;Argument[1];database-store",
114+
";;false;sqlite3_prepare(_:_:_:_:_:);;;Argument[1];database-store",
115+
";;false;sqlite3_prepare_v2(_:_:_:_:_:);;;Argument[1];database-store",
116+
";;false;sqlite3_prepare_v3(_:_:_:_:_:_:);;;Argument[1];database-store",
117+
";;false;sqlite3_prepare16(_:_:_:_:_:);;;Argument[1];database-store",
118+
";;false;sqlite3_prepare16_v2(_:_:_:_:_:);;;Argument[1];database-store",
119+
";;false;sqlite3_prepare16_v3(_:_:_:_:_:);;;Argument[1];database-store",
120+
";;false;sqlite3_bind_blob(_:_:_:_:_:);;;Argument[2];database-store",
121+
";;false;sqlite3_bind_blob64(_:_:_:_:_:);;;Argument[2];database-store",
122+
";;false;sqlite3_bind_double(_:_:_:);;;Argument[2];database-store",
123+
";;false;sqlite3_bind_int(_:_:_:);;;Argument[2];database-store",
124+
";;false;sqlite3_bind_int64(_:_:_:);;;Argument[2];database-store",
125+
";;false;sqlite3_bind_text(_:_:_:_:_:);;;Argument[2];database-store",
126+
";;false;sqlite3_bind_text16(_:_:_:_:_:);;;Argument[2];database-store",
127+
";;false;sqlite3_bind_text64(_:_:_:_:_:_:);;;Argument[2];database-store",
128+
";;false;sqlite3_bind_value(_:_:_:);;;Argument[2];database-store",
129+
";;false;sqlite3_bind_pointer(_:_:_:_:);;;Argument[2];database-store",
130+
// SQLite.swift
131+
";Connection;true;execute(_:);;;Argument[0];database-store",
132+
";Connection;true;prepare(_:_:);;;Argument[0];database-store",
133+
";Connection;true;prepare(_:_:);;;Argument[1];database-store",
134+
";Connection;true;run(_:_:);;;Argument[0];database-store",
135+
";Connection;true;run(_:_:);;;Argument[1];database-store",
136+
";Connection;true;scalar(_:_:);;;Argument[0];database-store",
137+
";Connection;true;scalar(_:_:);;;Argument[1];database-store",
138+
";Statement;true;init(_:_:);;;Argument[1];database-store",
139+
";Statement;true;bind(_:);;;Argument[0];database-store",
140+
";Statement;true;run(_:);;;Argument[0];database-store",
141+
";Statement;true;scalar(_:);;;Argument[0];database-store",
142+
";QueryType;true;insert(_:);;;Argument[0];database-store",
143+
";QueryType;true;insert(_:_:);;;Argument[0..1];database-store",
144+
";QueryType;true;insert(or:_:);;;Argument[1];database-store",
145+
";QueryType;true;insertMany(_:);;;Argument[0];database-store",
146+
";QueryType;true;insertMany(or:_:);;;Argument[1];database-store",
147+
";QueryType;true;upsert(_:onConflictOf:);;;Argument[0];database-store",
148+
";QueryType;true;upsert(_:onConflictOf:setValues:);;;Argument[0];database-store",
149+
";QueryType;true;upsert(_:onConflictOf:setValues:);;;Argument[2];database-store",
150+
";QueryType;true;update(_:);;;Argument[0];database-store",
151+
";QueryType;true;update(_:_:);;;Argument[0..1];database-store",
152+
";QueryType;true;update(or:_:);;;Argument[1];database-store",
112153
]
113154
}
114155
}

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,13 @@ module CleartextStorageDatabaseConfig implements DataFlow::ConfigSig {
4040
c.getAReadContent().(DataFlow::Content::FieldContent).getField() = cx.getAMember()
4141
)
4242
or
43-
// flow out from array elements of at the sink,
43+
// flow out from dictionary tuple values at the sink (this is essential
44+
// for some of the SQLite.swift models).
45+
isSink(node) and
46+
node.asExpr().getType().getUnderlyingType() instanceof DictionaryType and
47+
c.getAReadContent().(DataFlow::Content::TupleContent).getIndex() = 1
48+
or
49+
// flow out from array elements (and other collection content) at the sink,
4450
// for example in `database.allStatements(sql: "", arguments: [sensitive])`.
4551
isSink(node) and
4652
c.getAReadContent() instanceof DataFlow::Content::CollectionContent
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
category: minorAnalysis
3+
---
4+
* Added sqlite3 and SQLite.swift sinks and flow summaries for the `swift/cleartext-storage-database` query.

0 commit comments

Comments
 (0)