Skip to content

Commit 2eb93b7

Browse files
Add unit tests
1 parent d8985f9 commit 2eb93b7

File tree

12 files changed

+214
-6
lines changed

12 files changed

+214
-6
lines changed

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ class AuthenticationSuccessCallback extends Method {
4343
}
4444

4545
/** A call that sets a parameter for key generation that is insecure for use with biometric authentication. */
46-
class InsecureBiometricKeyParam extends MethodCall {
47-
InsecureBiometricKeyParam() {
46+
class InsecureBiometricKeyParamCall extends MethodCall {
47+
InsecureBiometricKeyParamCall() {
4848
exists(string name, CompileTimeConstantExpr val |
4949
this.getMethod()
5050
.hasQualifiedName("android.security.keystore", "KeyGenParameterSpec$Builder", name) and
@@ -59,3 +59,6 @@ class InsecureBiometricKeyParam extends MethodCall {
5959
)
6060
}
6161
}
62+
63+
/** Holds if the application contains an instance of a key being used for local biometric authentication. */
64+
predicate usesLocalAuth() { exists(AuthenticationSuccessCallback cb | exists(cb.getAResultUse())) }

java/ql/src/Security/CWE/CWE-287/AndroidInsecureKeys.ql

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,6 @@
1313
import java
1414
import semmle.code.java.security.AndroidLocalAuthQuery
1515

16-
/** Holds if the application contains an instance of a key being used for local biometric authentication. */
17-
predicate usesLocalAuth() { exists(AuthenticationSuccessCallback cb | exists(cb.getAResultUse())) }
18-
19-
from InsecureBiometricKeyParam call
16+
from InsecureBiometricKeyParamCall call
2017
where usesLocalAuth()
2118
select call, "This key is not secure for biometric authentication."
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.AndroidLocalAuthQuery
5+
6+
module InsecureKeysTest implements TestSig {
7+
string getARelevantTag() { result = "insecure-key" }
8+
9+
predicate hasActualResult(Location location, string element, string tag, string value) {
10+
tag = "insecure-key" and
11+
exists(InsecureBiometricKeyParamCall call | usesLocalAuth() |
12+
call.getLocation() = location and
13+
element = call.toString() and
14+
value = ""
15+
)
16+
}
17+
}
18+
19+
import MakeTest<InsecureKeysTest>
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import android.security.keystore.KeyGenParameterSpec;
2+
import android.hardware.biometrics.BiometricPrompt;
3+
import android.security.keystore.KeyProperties;
4+
5+
class Test {
6+
void test() {
7+
KeyGenParameterSpec.Builder builder = new KeyGenParameterSpec.Builder("MySecretKey", KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT);
8+
builder.setUserAuthenticationRequired(false); // $insecure-key
9+
builder.setInvalidatedByBiometricEnrollment(false); // $insecure-key
10+
builder.setUserAuthenticationValidityDurationSeconds(30); // $insecure-key
11+
}
12+
}
13+
14+
class Callback extends BiometricPrompt.AuthenticationCallback {
15+
public static void useKey(BiometricPrompt.CryptoObject key) {}
16+
17+
@Override
18+
public void onAuthenticationSucceeded(BiometricPrompt.AuthenticationResult result) {
19+
useKey(result.getCryptoObject());
20+
}
21+
}
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: 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.AndroidLocalAuthQuery
5+
6+
module InsecureKeysTest implements TestSig {
7+
string getARelevantTag() { result = "insecure-key" }
8+
9+
predicate hasActualResult(Location location, string element, string tag, string value) {
10+
tag = "insecure-key" and
11+
exists(InsecureBiometricKeyParamCall call | usesLocalAuth() |
12+
call.getLocation() = location and
13+
element = call.toString() and
14+
value = ""
15+
)
16+
}
17+
}
18+
19+
import MakeTest<InsecureKeysTest>
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import android.security.keystore.KeyGenParameterSpec;
2+
import android.hardware.biometrics.BiometricPrompt;
3+
import android.security.keystore.KeyProperties;
4+
5+
class Test {
6+
void test() {
7+
KeyGenParameterSpec.Builder builder = new KeyGenParameterSpec.Builder("MySecretKey", KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT);
8+
// No alert as there is no use of biometric authentication in this application.
9+
builder.setUserAuthenticationRequired(false);
10+
builder.setInvalidatedByBiometricEnrollment(false);
11+
builder.setUserAuthenticationValidityDurationSeconds(30);
12+
}
13+
}
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

0 commit comments

Comments
 (0)