From 0273969a6940b39313b4fa6d4c0148777384d6ea Mon Sep 17 00:00:00 2001 From: arangelov Date: Thu, 27 Jan 2022 12:22:04 +0000 Subject: [PATCH] Protect getPersistentDataPackageName with ACCESS_PDB_STATE Fixes: 216528992 Test: none Change-Id: I4f326c25b56e0c31746267a269f0b99c87798951 --- core/api/system-current.txt | 2 +- core/java/android/app/SystemServiceRegistry.java | 7 +++---- .../IPersistentDataBlockService.aidl | 1 + .../PersistentDataBlockManager.java | 15 +++++++-------- .../server/PersistentDataBlockService.java | 6 ++++++ 5 files changed, 18 insertions(+), 13 deletions(-) diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 55a6df28df728..5ee103ef769f6 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -10880,7 +10880,7 @@ package android.service.persistentdata { method @android.service.persistentdata.PersistentDataBlockManager.FlashLockState @RequiresPermission(anyOf={android.Manifest.permission.READ_OEM_UNLOCK_STATE, "android.permission.OEM_UNLOCK_STATE"}) public int getFlashLockState(); method public long getMaximumDataBlockSize(); method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.READ_OEM_UNLOCK_STATE, "android.permission.OEM_UNLOCK_STATE"}) public boolean getOemUnlockEnabled(); - method @NonNull public String getPersistentDataPackageName(); + method @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_PDB_STATE) public String getPersistentDataPackageName(); method public byte[] read(); method @Deprecated @RequiresPermission("android.permission.OEM_UNLOCK_STATE") public void setOemUnlockEnabled(boolean); method @RequiresPermission("android.permission.OEM_UNLOCK_STATE") public void wipe(); diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java index 7f8e46edf5941..1e9c11b8ec0a1 100644 --- a/core/java/android/app/SystemServiceRegistry.java +++ b/core/java/android/app/SystemServiceRegistry.java @@ -1019,15 +1019,14 @@ public final class SystemServiceRegistry { }}); registerService(Context.PERSISTENT_DATA_BLOCK_SERVICE, PersistentDataBlockManager.class, - new CachedServiceFetcher() { + new StaticServiceFetcher() { @Override - public PersistentDataBlockManager createService(ContextImpl ctx) - throws ServiceNotFoundException { + public PersistentDataBlockManager createService() throws ServiceNotFoundException { IBinder b = ServiceManager.getServiceOrThrow(Context.PERSISTENT_DATA_BLOCK_SERVICE); IPersistentDataBlockService persistentDataBlockService = IPersistentDataBlockService.Stub.asInterface(b); if (persistentDataBlockService != null) { - return new PersistentDataBlockManager(ctx, persistentDataBlockService); + return new PersistentDataBlockManager(persistentDataBlockService); } else { // not supported return null; diff --git a/core/java/android/service/persistentdata/IPersistentDataBlockService.aidl b/core/java/android/service/persistentdata/IPersistentDataBlockService.aidl index 31352f14fe089..11e5ad8789f22 100644 --- a/core/java/android/service/persistentdata/IPersistentDataBlockService.aidl +++ b/core/java/android/service/persistentdata/IPersistentDataBlockService.aidl @@ -37,5 +37,6 @@ interface IPersistentDataBlockService { boolean getOemUnlockEnabled(); int getFlashLockState(); boolean hasFrpCredentialHandle(); + String getPersistentDataPackageName(); } diff --git a/core/java/android/service/persistentdata/PersistentDataBlockManager.java b/core/java/android/service/persistentdata/PersistentDataBlockManager.java index 44a886257d5aa..9167153a0ef5a 100644 --- a/core/java/android/service/persistentdata/PersistentDataBlockManager.java +++ b/core/java/android/service/persistentdata/PersistentDataBlockManager.java @@ -26,8 +26,6 @@ import android.content.Context; import android.os.RemoteException; import android.service.oemlock.OemLockManager; -import com.android.internal.R; - import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -53,7 +51,6 @@ import java.lang.annotation.RetentionPolicy; @SystemService(Context.PERSISTENT_DATA_BLOCK_SERVICE) public class PersistentDataBlockManager { private static final String TAG = PersistentDataBlockManager.class.getSimpleName(); - private final Context mContext; private IPersistentDataBlockService sService; /** @@ -78,10 +75,7 @@ public class PersistentDataBlockManager { public @interface FlashLockState {} /** @hide */ - public PersistentDataBlockManager( - Context context, - IPersistentDataBlockService service) { - mContext = context; + public PersistentDataBlockManager(IPersistentDataBlockService service) { sService = service; } @@ -219,7 +213,12 @@ public class PersistentDataBlockManager { */ @SystemApi @NonNull + @RequiresPermission(android.Manifest.permission.ACCESS_PDB_STATE) public String getPersistentDataPackageName() { - return mContext.getString(R.string.config_persistentDataPackageName); + try { + return sService.getPersistentDataPackageName(); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } } } diff --git a/services/core/java/com/android/server/PersistentDataBlockService.java b/services/core/java/com/android/server/PersistentDataBlockService.java index 16645dfd386d8..06c11fa4a20cb 100644 --- a/services/core/java/com/android/server/PersistentDataBlockService.java +++ b/services/core/java/com/android/server/PersistentDataBlockService.java @@ -673,6 +673,12 @@ public class PersistentDataBlockService extends SystemService { throw new UnsupportedOperationException("cannot read frp credential"); } } + + @Override + public String getPersistentDataPackageName() { + enforcePersistentDataBlockAccess(); + return mContext.getString(R.string.config_persistentDataPackageName); + } }; private PersistentDataBlockManagerInternal mInternalService =