summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Eric Biggers <ebiggers@google.com> 2023-02-28 18:30:11 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2023-02-28 18:30:11 +0000
commit77ec4fab67f275ebae41abc063c01fef06846776 (patch)
tree4702efd35d1d5038f8f000cea4ba072df900537e
parentd2b02597be1d2de70fc1c8d1a3480d8032f5d547 (diff)
parentc89db6f3727f8ca8b2a756eab1e19bb28d04f591 (diff)
Merge "Don't allow LOCK_PATTERN_* settings to be read with no permission" into udc-dev
-rw-r--r--core/java/android/provider/Settings.java50
-rw-r--r--services/core/java/com/android/server/locksettings/LockSettingsService.java14
2 files changed, 18 insertions, 46 deletions
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 54e4909c12af..b389caf6ce55 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -99,7 +99,6 @@ import android.widget.Editor;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.Preconditions;
-import com.android.internal.widget.ILockSettings;
import java.io.IOException;
import java.lang.annotation.ElementType;
@@ -6184,9 +6183,6 @@ public final class Settings {
sProviderHolder,
Secure.class);
- private static ILockSettings sLockSettings = null;
-
- private static boolean sIsSystemProcess;
@UnsupportedAppUsage
private static final HashSet<String> MOVED_TO_LOCK_SETTINGS;
@UnsupportedAppUsage
@@ -6350,35 +6346,25 @@ public final class Settings {
return Global.getStringForUser(resolver, name, userHandle);
}
- if (MOVED_TO_LOCK_SETTINGS.contains(name)) {
- synchronized (Secure.class) {
- if (sLockSettings == null) {
- sLockSettings = ILockSettings.Stub.asInterface(
- (IBinder) ServiceManager.getService("lock_settings"));
- sIsSystemProcess = Process.myUid() == Process.SYSTEM_UID;
- }
- }
- if (sLockSettings != null && !sIsSystemProcess) {
- // No context; use the ActivityThread's context as an approximation for
- // determining the target API level.
- Application application = ActivityThread.currentApplication();
-
- boolean isPreMnc = application != null
- && application.getApplicationInfo() != null
- && application.getApplicationInfo().targetSdkVersion
- <= VERSION_CODES.LOLLIPOP_MR1;
- if (isPreMnc) {
- try {
- return sLockSettings.getString(name, "0", userHandle);
- } catch (RemoteException re) {
- // Fall through
- }
- } else {
- throw new SecurityException("Settings.Secure." + name
- + " is deprecated and no longer accessible."
- + " See API documentation for potential replacements.");
- }
+ if (MOVED_TO_LOCK_SETTINGS.contains(name) && Process.myUid() != Process.SYSTEM_UID) {
+ // No context; use the ActivityThread's context as an approximation for
+ // determining the target API level.
+ Application application = ActivityThread.currentApplication();
+
+ boolean isPreMnc = application != null
+ && application.getApplicationInfo() != null
+ && application.getApplicationInfo().targetSdkVersion
+ <= VERSION_CODES.LOLLIPOP_MR1;
+ if (isPreMnc) {
+ // Old apps used to get the three deprecated LOCK_PATTERN_* settings from
+ // ILockSettings.getString(). For security reasons, we now just return a
+ // stubbed-out value. Note: the only one of these three settings actually known
+ // to have been used was LOCK_PATTERN_ENABLED, and ILockSettings.getString()
+ // already always returned "0" for that starting in Android 11.
+ return "0";
}
+ throw new SecurityException("Settings.Secure." + name + " is deprecated and no" +
+ " longer accessible. See API documentation for potential replacements.");
}
return sNameValueCache.getStringForUser(resolver, name, userHandle);
diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java
index 0c6985574693..5a832b78487c 100644
--- a/services/core/java/com/android/server/locksettings/LockSettingsService.java
+++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java
@@ -1065,18 +1065,7 @@ public class LockSettingsService extends ILockSettings.Stub {
mContext.enforceCallingOrSelfPermission(PERMISSION, "LockSettingsHave");
}
- private static final String[] UNPROTECTED_SETTINGS = {
- // These three LOCK_PATTERN_* settings have traditionally been readable via the public API
- // android.provider.Settings.{System,Secure}.getString() without any permission.
- Settings.Secure.LOCK_PATTERN_ENABLED,
- Settings.Secure.LOCK_PATTERN_VISIBLE,
- Settings.Secure.LOCK_PATTERN_TACTILE_FEEDBACK_ENABLED,
- };
-
private final void checkDatabaseReadPermission(String requestedKey, int userId) {
- if (ArrayUtils.contains(UNPROTECTED_SETTINGS, requestedKey)) {
- return;
- }
if (!hasPermission(PERMISSION)) {
throw new SecurityException("uid=" + getCallingUid() + " needs permission "
+ PERMISSION + " to read " + requestedKey + " for user " + userId);
@@ -1190,9 +1179,6 @@ public class LockSettingsService extends ILockSettings.Stub {
@Override
public boolean getBoolean(String key, boolean defaultValue, int userId) {
checkDatabaseReadPermission(key, userId);
- if (Settings.Secure.LOCK_PATTERN_ENABLED.equals(key)) {
- return getCredentialTypeInternal(userId) == CREDENTIAL_TYPE_PATTERN;
- }
return mStorage.getBoolean(key, defaultValue, userId);
}