Skip to content

Commit 60a7666

Browse files
Java: Refactor Android SQLite flow steps
1 parent ca60f2c commit 60a7666

File tree

3 files changed

+59
-59
lines changed

3 files changed

+59
-59
lines changed

java/ql/src/semmle/code/java/dataflow/internal/TaintTrackingUtil.qll

Lines changed: 1 addition & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ abstract class TaintTransferringMethod extends Method {
9797
* Holds if this method writes tainted data to `sink` when `src` is tainted.
9898
* `src` and `sink` are parameter indices, or -1 to indicate the qualifier.
9999
*/
100-
predicate transfersTaint(int src, int sink) { none() }
100+
abstract predicate transfersTaint(int src, int sink);
101101
}
102102

103103
private class StringTaintPreservingMethod extends TaintPreservingMethod {
@@ -429,14 +429,6 @@ private predicate taintPreservingQualifierToMethod(Method m) {
429429
)
430430
)
431431
or
432-
m.getDeclaringType().getASourceSupertype*() instanceof TypeSQLiteQueryBuilder and
433-
// buildQuery(String[] projectionIn, String selection, String groupBy, String having, String sortOrder, String limit)
434-
// buildQuery(String[] projectionIn, String selection, String[] selectionArgs, String groupBy, String having, String sortOrder, String limit)
435-
// buildUnionQuery(String[] subQueries, String sortOrder, String limit)
436-
// buildUnionSubQuery(String typeDiscriminatorColumn, String[] unionColumns, Set<String> columnsPresentInTable, int computedColumnsOffset, String typeDiscriminatorValue, String selection, String[] selectionArgs, String groupBy, String having)
437-
// buildUnionSubQuery(String typeDiscriminatorColumn, String[] unionColumns, Set<String> columnsPresentInTable, int computedColumnsOffset, String typeDiscriminatorValue, String selection, String groupBy, String having)
438-
m.hasName(["buildQuery", "buildUnionQuery", "buildUnionSubQuery"])
439-
or
440432
m.(TaintPreservingMethod).returnsTaint(-1)
441433
}
442434

@@ -470,12 +462,6 @@ private predicate argToMethodStep(Expr tracked, MethodAccess sink) {
470462
tracked = sink.getArgument(i)
471463
)
472464
or
473-
exists(MethodAccess ma |
474-
taintPreservingArgumentToMethod(ma.getMethod()) and
475-
tracked = ma.getAnArgument() and
476-
sink = ma
477-
)
478-
or
479465
exists(Method springResponseEntityOfOk |
480466
sink.getMethod() = springResponseEntityOfOk and
481467
springResponseEntityOfOk.getDeclaringType() instanceof SpringResponseEntity and
@@ -493,23 +479,6 @@ private predicate argToMethodStep(Expr tracked, MethodAccess sink) {
493479
)
494480
}
495481

496-
/**
497-
* Holds if `method` is a library method that returns tainted data if any
498-
* of its arguments are tainted.
499-
*/
500-
private predicate taintPreservingArgumentToMethod(Method method) {
501-
method.getDeclaringType() instanceof TypeDatabaseUtils and
502-
// String[] appendSelectionArgs(String[] originalValues, String[] newValues)
503-
// String concatenateWhere(String a, String b)
504-
method.hasName(["appendSelectionArgs", "concatenateWhere"])
505-
or
506-
method.getDeclaringType().getASourceSupertype*() instanceof TypeSQLiteQueryBuilder and
507-
// buildQuery(String[] projectionIn, String selection, String groupBy, String having, String sortOrder, String limit)
508-
// buildQuery(String[] projectionIn, String selection, String[] selectionArgs, String groupBy, String having, String sortOrder, String limit)
509-
// buildUnionQuery(String[] subQueries, String sortOrder, String limit)
510-
method.hasName(["buildQuery", "buildUnionQuery"])
511-
}
512-
513482
/**
514483
* Holds if `method` is a library method that returns tainted data if its
515484
* `arg`th argument is tainted.
@@ -611,18 +580,6 @@ private predicate taintPreservingArgumentToMethod(Method method, int arg) {
611580
method.hasName("append") and
612581
arg = 0
613582
or
614-
method.getDeclaringType().getASourceSupertype*() instanceof TypeSQLiteQueryBuilder and
615-
(
616-
// static buildQueryString(boolean distinct, String tables, String[] columns, String where, String groupBy, String having, String orderBy, String limit)
617-
method.hasName("buildQueryString") and arg = [1 .. method.getNumberOfParameters()]
618-
or
619-
// buildUnionSubQuery(String typeDiscriminatorColumn, String[] unionColumns, Set<String> columnsPresentInTable, int computedColumnsOffset, String typeDiscriminatorValue, String selection, String[] selectionArgs, String groupBy, String having)
620-
// buildUnionSubQuery(String typeDiscriminatorColumn, String[] unionColumns, Set<String> columnsPresentInTable, int computedColumnsOffset, String typeDiscriminatorValue, String selection, String groupBy, String having)
621-
method.hasName("buildUnionSubQuery") and
622-
arg = [0 .. method.getNumberOfParameters()] and
623-
arg != 3
624-
)
625-
or
626583
(
627584
method.getDeclaringType() instanceof AndroidContentProvider or
628585
method.getDeclaringType() instanceof AndroidContentResolver
@@ -680,12 +637,6 @@ private predicate taintPreservingArgToArg(Method method, int input, int output)
680637
input = 0 and
681638
output = 2
682639
or
683-
method.getDeclaringType() instanceof TypeSQLiteQueryBuilder and
684-
// static appendColumns(StringBuilder s, String[] columns)
685-
method.hasName("appendColumns") and
686-
input = 1 and
687-
output = 0
688-
or
689640
method.(TaintTransferringMethod).transfersTaint(input, output)
690641
}
691642

@@ -725,14 +676,6 @@ private predicate taintPreservingArgumentToQualifier(Method method, int arg) {
725676
append.getDeclaringType().hasQualifiedName("java.io", "StringWriter")
726677
)
727678
or
728-
method.getDeclaringType().getASourceSupertype*() instanceof TypeSQLiteQueryBuilder and
729-
// setProjectionMap(Map<String, String> columnMap)
730-
// setTables(String inTables)
731-
// appendWhere(CharSequence inWhere)
732-
// appendWhereStandalone(CharSequence inWhere)
733-
method.hasName(["setProjectionMap", "setTables", "appendWhere", "appendWhereStandalone"]) and
734-
arg = 0
735-
or
736679
method.(TaintTransferringMethod).transfersTaint(arg, -1)
737680
}
738681

java/ql/src/semmle/code/java/frameworks/android/SQLite.qll

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import java
22
import Android
3+
private import semmle.code.java.dataflow.TaintTracking::TaintTracking as TT
34

45
/**
56
* The class `android.database.sqlite.SQLiteDatabase`.
@@ -226,3 +227,59 @@ private class ContentProviderUpdateMethod extends SQLiteRunner {
226227

227228
override int sqlIndex() { result = 2 }
228229
}
230+
231+
private class QueryBuilderBuildMethod extends TT::TaintPreservingMethod {
232+
QueryBuilderBuildMethod() {
233+
this.getDeclaringType().getASourceSupertype*() instanceof TypeSQLiteQueryBuilder and
234+
// buildQuery(String[] projectionIn, String selection, String groupBy, String having, String sortOrder, String limit)
235+
// buildQuery(String[] projectionIn, String selection, String[] selectionArgs, String groupBy, String having, String sortOrder, String limit)
236+
// buildUnionQuery(String[] subQueries, String sortOrder, String limit)
237+
// buildUnionSubQuery(String typeDiscriminatorColumn, String[] unionColumns, Set<String> columnsPresentInTable, int computedColumnsOffset, String typeDiscriminatorValue, String selection, String[] selectionArgs, String groupBy, String having)
238+
// buildUnionSubQuery(String typeDiscriminatorColumn, String[] unionColumns, Set<String> columnsPresentInTable, int computedColumnsOffset, String typeDiscriminatorValue, String selection, String groupBy, String having)
239+
// static buildQueryString(boolean distinct, String tables, String[] columns, String where, String groupBy, String having, String orderBy, String limit)
240+
this.hasName(["buildQuery", "buildUnionQuery", "buildUnionSubQuery", "buildQueryString"])
241+
}
242+
243+
override predicate returnsTaint(int arg) {
244+
arg = -1
245+
or
246+
hasName(["buildQuery", "buildUnionQuery"]) and
247+
arg = [0 .. getNumberOfParameters()]
248+
or
249+
hasName("buildQueryString") and
250+
arg = [1 .. getNumberOfParameters()]
251+
or
252+
hasName("buildUnionSubQuery") and
253+
arg = [0 .. getNumberOfParameters()] and
254+
arg != 3
255+
}
256+
}
257+
258+
private class QueryBuilderAppendMethod extends TT::TaintTransferringMethod {
259+
QueryBuilderAppendMethod() {
260+
this.getDeclaringType().getASourceSupertype*() instanceof TypeSQLiteQueryBuilder and
261+
// setProjectionMap(Map<String, String> columnMap)
262+
// setTables(String inTables)
263+
// appendWhere(CharSequence inWhere)
264+
// appendWhereStandalone(CharSequence inWhere)
265+
// static appendColumns(StringBuilder s, String[] columns)
266+
this
267+
.hasName(["setProjectionMap", "setTables", "appendWhere", "appendWhereStandalone",
268+
"appendColumns"])
269+
}
270+
271+
override predicate transfersTaint(int src, int sink) {
272+
if hasName("appendColumns") then (src = 1 and sink = 0) else (src = 0 and sink = -1)
273+
}
274+
}
275+
276+
private class UnsafeAppendUtilMethod extends TT::TaintPreservingMethod {
277+
UnsafeAppendUtilMethod() {
278+
this.getDeclaringType() instanceof TypeDatabaseUtils and
279+
// String[] appendSelectionArgs(String[] originalValues, String[] newValues)
280+
// String concatenateWhere(String a, String b)
281+
this.hasName(["appendSelectionArgs", "concatenateWhere"])
282+
}
283+
284+
override predicate returnsTaint(int arg) { arg = [0 .. getNumberOfParameters()] }
285+
}

java/ql/src/semmle/code/java/frameworks/jackson/JacksonSerializability.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@
44
*/
55

66
import java
7-
import semmle.code.java.dataflow.TaintTracking::TaintTracking as TT
87
import semmle.code.java.Serializability
98
import semmle.code.java.Reflection
109
import semmle.code.java.dataflow.DataFlow
1110
import semmle.code.java.dataflow.DataFlow5
11+
private import semmle.code.java.dataflow.TaintTracking::TaintTracking as TT
1212

1313
/**
1414
* A `@com.fasterxml.jackson.annotation.JsonIgnore` annoation.

0 commit comments

Comments
 (0)