Skip to content

Commit ac39aeb

Browse files
committed
Add SQLi sinks
1 parent 393a8c2 commit ac39aeb

File tree

3 files changed

+655
-0
lines changed

3 files changed

+655
-0
lines changed

swift/ql/src/queries/Security/CWE-089/SqlInjection.ql

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,80 @@ class SQLiteSwiftSqlSink extends SqlSink {
6363
}
6464
}
6565

66+
/** A sink for the GRDB library. */
67+
class GrdbSqlSink extends SqlSink {
68+
GrdbSqlSink() {
69+
exists(CallExpr call, MethodDecl method |
70+
call.getStaticTarget() = method and
71+
call.getArgument(0).getExpr() = this.asExpr()
72+
|
73+
method
74+
.hasQualifiedName("Database",
75+
[
76+
"allStatements(sql:arguments:)", "cachedStatement(sql:)",
77+
"internalCachedStatement(sql:)", "execute(sql:arguments:)", "makeStatement(sql:)",
78+
"makeStatement(sql:prepFlags:)"
79+
])
80+
or
81+
method
82+
.hasQualifiedName("SQLRequest",
83+
[
84+
"init(stringLiteral:)", "init(unicodeScalarLiteral:)",
85+
"init(extendedGraphemeClusterLiteral:)", "init(stringInterpolation:)",
86+
"init(sql:arguments:adapter:cached:)"
87+
])
88+
or
89+
method
90+
.hasQualifiedName("SQL",
91+
[
92+
"init(stringLiteral:)", "init(unicodeScalarLiteral:)",
93+
"init(extendedGraphemeClusterLiteral:)", "init(stringInterpolation:)",
94+
"init(sql:arguments:)", "append(sql:arguments:)"
95+
])
96+
or
97+
method
98+
.hasQualifiedName("TableDefinition", ["column(sql:)", "check(sql:)", "constraint(sql:)"])
99+
or
100+
method.hasQualifiedName("TableAlteration", "addColumn(sql:)")
101+
or
102+
method
103+
.hasQualifiedName("ColumnDefinition",
104+
["check(sql:)", "defaults(sql:)", "generatedAs(sql:_:)"])
105+
or
106+
method
107+
.hasQualifiedName("TableRecord",
108+
[
109+
"select(sql:arguments:)", "select(sql:arguments:as:)", "filter(sql:arguments:)",
110+
"order(sql:arguments:)"
111+
])
112+
or
113+
method.hasQualifiedName("StatementCache", "statement(_:)")
114+
)
115+
or
116+
exists(CallExpr call, MethodDecl method |
117+
call.getStaticTarget() = method and
118+
call.getArgument(1).getExpr() = this.asExpr()
119+
|
120+
method
121+
.hasQualifiedName(["Row", "DatabaseValueConvertible"],
122+
[
123+
"fetchCursor(_:sql:arguments:adapter:)", "fetchAll(_:sql:arguments:adapter:)",
124+
"fetchSet(_:sql:arguments:adapter:)", "fetchOne(_:sql:arguments:adapter:)"
125+
])
126+
or
127+
method.hasQualifiedName("SQLStatementCursor", "init(database:sql:arguments:prepFlags:)")
128+
)
129+
or
130+
exists(CallExpr call, MethodDecl method |
131+
call.getStaticTarget() = method and
132+
call.getArgument(3).getExpr() = this.asExpr()
133+
|
134+
method
135+
.hasQualifiedName("CommonTableExpression", "init(recursive:named:columns:sql:arguments:)")
136+
)
137+
}
138+
}
139+
66140
/**
67141
* A taint configuration for tainted data that reaches a SQL sink.
68142
*/

0 commit comments

Comments
 (0)