Skip to content

Commit 2ee83e2

Browse files
committed
Add Editable.toString flow step
1 parent 6738270 commit 2ee83e2

35 files changed

+905
-29
lines changed
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 a flow step for `toString` calls on tainted `android.text.Editable` objects.

java/ql/lib/semmle/code/java/frameworks/android/Widget.qll

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,18 @@ private class DefaultAndroidWidgetSources extends RemoteFlowSource {
1616
override string getSourceType() { result = "Android widget source" }
1717
}
1818

19+
private class EditableToStringStep extends AdditionalTaintStep {
20+
override predicate step(DataFlow::Node n1, DataFlow::Node n2) {
21+
exists(MethodAccess toString |
22+
toString.getMethod().hasName("toString") and
23+
toString.getReceiverType().hasQualifiedName("android.text", "Editable")
24+
|
25+
n1.asExpr() = toString.getQualifier() and
26+
n2.asExpr() = toString
27+
)
28+
}
29+
}
30+
1931
private class AndroidWidgetSummaryModels extends SummaryModelCsv {
2032
override predicate row(string row) {
2133
row = "android.widget;EditText;true;getText;;;Argument[-1];ReturnValue;taint"

java/ql/lib/semmle/code/java/security/CleartextStorageAndroidDatabaseQuery.qll

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,6 @@ private class LocalDatabaseCleartextStorageSink extends CleartextStorageSink {
1111
LocalDatabaseCleartextStorageSink() { localDatabaseInput(_, this.asExpr()) }
1212
}
1313

14-
private class LocalDatabaseCleartextStorageStep extends CleartextStorageAdditionalTaintStep {
15-
override predicate step(DataFlow::Node n1, DataFlow::Node n2) {
16-
// EditText.getText() return type is parsed as `Object`, so we need to
17-
// add a taint step for `Object.toString` to model `editText.getText().toString()`
18-
exists(MethodAccess ma, Method m |
19-
ma.getMethod() = m and
20-
m.getDeclaringType() instanceof TypeObject and
21-
m.hasName("toString")
22-
|
23-
n1.asExpr() = ma.getQualifier() and n2.asExpr() = ma
24-
)
25-
}
26-
}
27-
2814
/** The creation of an object that can be used to store data in a local database. */
2915
class LocalDatabaseOpenMethodAccess extends Storable, Call {
3016
LocalDatabaseOpenMethodAccess() {

java/ql/lib/semmle/code/java/security/CleartextStorageQuery.qll

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -85,18 +85,3 @@ private class EncryptedValueFlowConfig extends DataFlow4::Configuration {
8585

8686
override predicate isSink(DataFlow::Node sink) { sink.asExpr() instanceof SensitiveExpr }
8787
}
88-
89-
/** A taint step for `EditText.toString` in Android. */
90-
private class AndroidEditTextCleartextStorageStep extends CleartextStorageAdditionalTaintStep {
91-
override predicate step(DataFlow::Node n1, DataFlow::Node n2) {
92-
// EditText.getText() return type is parsed as `Object`, so we need to
93-
// add a taint step for `Object.toString` to model `editText.getText().toString()`
94-
exists(MethodAccess ma, Method m |
95-
ma.getMethod() = m and
96-
m.getDeclaringType() instanceof TypeObject and
97-
m.hasName("toString")
98-
|
99-
n1.asExpr() = ma.getQualifier() and n2.asExpr() = ma
100-
)
101-
}
102-
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import android.widget.EditText;
2+
3+
public class TestWidget {
4+
5+
private void sink(Object sink) {}
6+
7+
public void test(EditText t) {
8+
sink(t.getText().toString()); // $ hasTaintFlow
9+
}
10+
}
11+
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
//semmle-extractor-options: --javac-args -cp ${testdir}/../../../../stubs/google-android-9.0.0

java/ql/test/library-tests/frameworks/android/widget/test.expected

Whitespace-only changes.
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import java
2+
import semmle.code.java.dataflow.FlowSources
3+
import TestUtilities.InlineFlowTest
4+
5+
class SourceTaintFlowConf extends DefaultTaintFlowConf {
6+
override predicate isSource(DataFlow::Node src) { src instanceof RemoteFlowSource }
7+
}

java/ql/test/stubs/google-android-9.0.0/android/app/RemoteAction.java

Lines changed: 30 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

java/ql/test/stubs/google-android-9.0.0/android/text/Editable.java

Lines changed: 29 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)