Skip to content

Commit 5110cf1

Browse files
committed
Swift: Convert some fiddly GRDB database sinks to CSV.
1 parent f289811 commit 5110cf1

File tree

2 files changed

+36
-52
lines changed

2 files changed

+36
-52
lines changed

swift/ql/lib/codeql/swift/dataflow/ExternalFlow.qll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ private module Frameworks {
9393
private import codeql.swift.frameworks.StandardLibrary.WebView
9494
private import codeql.swift.frameworks.Alamofire.Alamofire
9595
private import codeql.swift.security.CleartextLoggingExtensions
96+
private import codeql.swift.security.CleartextStorageDatabaseExtensions
9697
private import codeql.swift.security.PathInjectionExtensions
9798
private import codeql.swift.security.PredicateInjectionExtensions
9899
}

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

Lines changed: 35 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -75,58 +75,41 @@ private class RealmStore extends CleartextStorageDatabaseSink instanceof DataFlo
7575
}
7676
}
7777

78-
/**
79-
* A `DataFlow::Node` that is an expression stored with the GRDB library.
80-
*/
81-
private class GrdbStore extends CleartextStorageDatabaseSink {
82-
GrdbStore() {
83-
exists(CallExpr call, MethodDecl method |
84-
call.getStaticTarget() = method and
85-
call.getArgumentWithLabel("arguments").getExpr() = this.asExpr()
86-
|
87-
method
88-
.hasQualifiedName("Database",
89-
["allStatements(sql:arguments:)", "execute(sql:arguments:)",])
90-
or
91-
method.hasQualifiedName("SQLRequest", "init(sql:arguments:adapter:cached:)")
92-
or
93-
method.hasQualifiedName("SQL", ["init(sql:arguments:)", "append(sql:arguments:)"])
94-
or
95-
method.hasQualifiedName("SQLStatementCursor", "init(database:sql:arguments:prepFlags:)")
96-
or
97-
method
98-
.hasQualifiedName("TableRecord",
99-
[
100-
"select(sql:arguments:)", "select(sql:arguments:as:)", "filter(sql:arguments:)",
101-
"order(sql:arguments:)"
102-
])
103-
or
104-
method
105-
.hasQualifiedName(["Row", "DatabaseValueConvertible", "FetchableRecord"],
106-
[
107-
"fetchCursor(_:sql:arguments:adapter:)", "fetchAll(_:sql:arguments:adapter:)",
108-
"fetchSet(_:sql:arguments:adapter:)", "fetchOne(_:sql:arguments:adapter:)"
109-
])
110-
or
111-
method
112-
.hasQualifiedName("FetchableRecord",
113-
[
114-
"fetchCursor(_:arguments:adapter:)", "fetchAll(_:arguments:adapter:)",
115-
"fetchSet(_:arguments:adapter:)", "fetchOne(_:arguments:adapter:)",
116-
])
117-
or
118-
method.hasQualifiedName("Statement", ["execute(arguments:)"])
119-
or
120-
method
121-
.hasQualifiedName("CommonTableExpression", "init(recursive:named:columns:sql:arguments:)")
122-
)
123-
or
124-
exists(CallExpr call, MethodDecl method |
125-
call.getStaticTarget() = method and
126-
call.getArgument(0).getExpr() = this.asExpr()
127-
|
128-
method.hasQualifiedName("Statement", "setArguments(_:)")
129-
)
78+
private class CleartextStorageDatabaseSinks extends SinkModelCsv {
79+
override predicate row(string row) {
80+
row =
81+
[
82+
// GRDB sinks
83+
";Database;true;allStatements(sql:arguments:);;;Argument[1];database-store",
84+
";Database;true;execute(sql:arguments:);;;Argument[1];database-store",
85+
";SQLRequest;true;init(sql:arguments:adapter:cached:);;;Argument[1];database-store",
86+
";SQL;true;init(sql:arguments:);;;Argument[1];database-store",
87+
";SQL;true;append(sql:arguments:);;;Argument[1];database-store",
88+
";SQLStatementCursor;true;init(database:sql:arguments:prepFlags:);;;Argument[2];database-store",
89+
";TableRecord;true;select(sql:arguments:);;;Argument[1];database-store",
90+
";TableRecord;true;select(sql:arguments:as:);;;Argument[1];database-store",
91+
";TableRecord;true;filter(sql:arguments:);;;Argument[1];database-store",
92+
";TableRecord;true;order(sql:arguments:);;;Argument[1];database-store",
93+
";Row;true;fetchCursor(_:sql:arguments:adapter:);;;Argument[2];database-store",
94+
";Row;true;fetchAll(_:sql:arguments:adapter:);;;Argument[2];database-store",
95+
";Row;true;fetchSet(_:sql:arguments:adapter:);;;Argument[2];database-store",
96+
";Row;true;fetchOne(_:sql:arguments:adapter:);;;Argument[2];database-store",
97+
";DatabaseValueConvertible;true;fetchCursor(_:sql:arguments:adapter:);;;Argument[2];database-store",
98+
";DatabaseValueConvertible;true;fetchAll(_:sql:arguments:adapter:);;;Argument[2];database-store",
99+
";DatabaseValueConvertible;true;fetchSet(_:sql:arguments:adapter:);;;Argument[2];database-store",
100+
";DatabaseValueConvertible;true;fetchOne(_:sql:arguments:adapter:);;;Argument[2];database-store",
101+
";FetchableRecord;true;fetchCursor(_:sql:arguments:adapter:);;;Argument[2];database-store",
102+
";FetchableRecord;true;fetchAll(_:sql:arguments:adapter:);;;Argument[2];database-store",
103+
";FetchableRecord;true;fetchSet(_:sql:arguments:adapter:);;;Argument[2];database-store",
104+
";FetchableRecord;true;fetchOne(_:sql:arguments:adapter:);;;Argument[2];database-store",
105+
";FetchableRecord;true;fetchCursor(_:arguments:adapter:);;;Argument[1];database-store",
106+
";FetchableRecord;true;fetchAll(_:arguments:adapter:);;;Argument[1];database-store",
107+
";FetchableRecord;true;fetchSet(_:arguments:adapter:);;;Argument[1];database-store",
108+
";FetchableRecord;true;fetchOne(_:arguments:adapter:);;;Argument[1];database-store",
109+
";Statement;true;execute(arguments:);;;Argument[0];database-store",
110+
";CommonTableExpression;true;init(recursive:named:columns:sql:arguments:);;;Argument[4];database-store",
111+
";Statement;true;setArguments(_:);;;Argument[0];database-store"
112+
]
130113
}
131114
}
132115

0 commit comments

Comments
 (0)