Skip to content

Commit 6081f18

Browse files
Add unit tests + make some fixes
1 parent 8582093 commit 6081f18

File tree

10 files changed

+169
-3
lines changed

10 files changed

+169
-3
lines changed

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,9 @@ private class SetTextCall extends MethodCall {
4646
/** A call to a method indicating that the contents of a UI element are safely masked. */
4747
private class MaskCall extends MethodCall {
4848
MaskCall() {
49-
this.getMethod().hasQualifiedName("android.widget", "TextView", "setInputType")
49+
this.getMethod().getAnOverride*().hasQualifiedName("android.widget", "TextView", "setInputType")
5050
or
51-
this.getMethod().hasQualifiedName("android.widget", "view", "setVisibility")
51+
this.getMethod().getAnOverride*().hasQualifiedName("android.view", "View", "setVisibility")
5252
}
5353
}
5454

@@ -66,6 +66,8 @@ private module TextFieldTrackingConfig implements DataFlow::ConfigSig {
6666
predicate isBarrier(DataFlow::Node node) {
6767
node.getType() instanceof PrimitiveType or node.getType() instanceof BoxedType
6868
}
69+
70+
predicate isBarrierIn(DataFlow::Node node) { isSource(node) }
6971
}
7072

7173
/** Holds if the given may be masked. */

java/ql/src/Security/CWE/CWE-200/AndroidSensitiveTextField.ql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,5 @@ import semmle.code.java.security.SensitiveUiQuery
1616
import TextFieldTracking::PathGraph
1717

1818
from TextFieldTracking::PathNode source, TextFieldTracking::PathNode sink
19-
where NotificationTracking::flowPath(source, sink)
19+
where TextFieldTracking::flowPath(source, sink)
2020
select sink, source, sink, "This $@ is exposed in a text view.", source, "sensitive information"
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
3+
xmlns:tools="http://schemas.android.com/tools"
4+
package="com.example.test">
5+
</manifest>
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.example.test;
2+
3+
public final class R {
4+
public static final class id {
5+
public static final int test1 = 1;
6+
public static final int test2 = 2;
7+
public static final int test3 = 3;
8+
public static final int test4 = 4;
9+
public static final int test5 = 5;
10+
}
11+
12+
public static final class string {
13+
public static final int password_prompt = 0;
14+
}
15+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.example.test;
2+
3+
import android.app.Activity;
4+
import android.widget.EditText;
5+
import android.widget.TextView;
6+
import android.widget.LinearLayout;
7+
import android.view.View;
8+
import android.text.InputType;
9+
10+
class Test extends Activity {
11+
void test(String password) {
12+
EditText test1 = findViewById(R.id.test1);
13+
test1.setText(password); // $sensitive-text
14+
test1.setHint(password); // $sensitive-text
15+
test1.append(password); // $sensitive-text
16+
test1.setText(R.string.password_prompt);
17+
18+
TextView test2 = findViewById(R.id.test2);
19+
test2.setVisibility(View.INVISIBLE);
20+
test2.setText(password);
21+
22+
EditText test3 = findViewById(R.id.test3);
23+
test3.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
24+
test3.setText(password);
25+
26+
LinearLayout test4 = findViewById(R.id.test4);
27+
TextView test5 = findViewById(R.id.test5);
28+
test4.setVisibility(View.INVISIBLE);
29+
test5.setText(password);
30+
}
31+
}
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
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<LinearLayout
3+
xmlns:android="http://schemas.android.com/apk/res/android"
4+
xmlns:app="http://schemas.android.com/apk/res-auto">
5+
6+
7+
<EditText
8+
android:id="@+id/test1"
9+
android:inputType="text"/>
10+
11+
<TextView
12+
android:id="@+id/test2"/>
13+
14+
<EditText
15+
android:id="@+id/test3"/>
16+
17+
<LinearLayout
18+
android:id="@+id/test4">
19+
<TextView
20+
android:id="@+id/test5"/>
21+
</LinearLayout>
22+
23+
</LinearLayout>
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
testFailures
2+
failures
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import java
2+
import TestUtilities.InlineExpectationsTest
3+
import semmle.code.java.dataflow.DataFlow
4+
import semmle.code.java.security.SensitiveUiQuery
5+
6+
module SensitiveTextTest implements TestSig {
7+
string getARelevantTag() { result = "sensitive-text" }
8+
9+
predicate hasActualResult(Location location, string element, string tag, string value) {
10+
tag = "sensitive-text" and
11+
exists(DataFlow::Node sink | TextFieldTracking::flowTo(sink) |
12+
sink.getLocation() = location and
13+
element = sink.toString() and
14+
value = ""
15+
)
16+
}
17+
}
18+
19+
import MakeTest<SensitiveTextTest>

java/ql/test/stubs/google-android-9.0.0/android/widget/LinearLayout.java

Lines changed: 68 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)