diff options
| author | 2023-02-28 18:30:11 +0000 | |
|---|---|---|
| committer | 2023-02-28 18:30:11 +0000 | |
| commit | 77ec4fab67f275ebae41abc063c01fef06846776 (patch) | |
| tree | 4702efd35d1d5038f8f000cea4ba072df900537e | |
| parent | d2b02597be1d2de70fc1c8d1a3480d8032f5d547 (diff) | |
| parent | c89db6f3727f8ca8b2a756eab1e19bb28d04f591 (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.java | 50 | ||||
| -rw-r--r-- | services/core/java/com/android/server/locksettings/LockSettingsService.java | 14 |
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); } |