Fixing Storage Volume(s) Retrieval.

With ag/19901205 shared_profile's volumes were also listed in
StorageManager#updateExternalStorageFileQuotaType.

However, the above API can be called from MediaProvider process,
without MANAGE_EXTERNAL_STORAGE permissions, resulting in
SecurityException("Only File Manager Apps permitted") to be thrown
from StorageManagerService#getVolumeList

This fix allows the exception to be bypassed in case the caller is
Media Store process.

Bug: 235321217
Test: atest android.appsecurity.cts.StorageHostTest
Change-Id: I6835cc4d29f3e9c85731979aaf9ab12a30f6419b
This commit is contained in:
Himanshu Gupta
2022-10-19 14:30:04 +00:00
parent 298b073242
commit 65a5b2db39

View File

@@ -3584,6 +3584,13 @@ class StorageManagerService extends IStorageManager.Stub
final boolean includeSharedProfile = final boolean includeSharedProfile =
(flags & StorageManager.FLAG_INCLUDE_SHARED_PROFILE) != 0; (flags & StorageManager.FLAG_INCLUDE_SHARED_PROFILE) != 0;
// When the caller is the app actually hosting external storage, we
// should never attempt to augment the actual storage volume state,
// otherwise we risk confusing it with race conditions as users go
// through various unlocked states
final boolean callerIsMediaStore = UserHandle.isSameApp(callingUid,
mMediaStoreAuthorityAppId);
// Only Apps with MANAGE_EXTERNAL_STORAGE should call the API with includeSharedProfile // Only Apps with MANAGE_EXTERNAL_STORAGE should call the API with includeSharedProfile
if (includeSharedProfile) { if (includeSharedProfile) {
try { try {
@@ -3596,7 +3603,12 @@ class StorageManagerService extends IStorageManager.Stub
// Checking first entry in packagesFromUid is enough as using "sharedUserId" // Checking first entry in packagesFromUid is enough as using "sharedUserId"
// mechanism is rare and discouraged. Also, Apps that share same UID share the same // mechanism is rare and discouraged. Also, Apps that share same UID share the same
// permissions. // permissions.
if (!mStorageManagerInternal.hasExternalStorageAccess(callingUid, // Allowing Media Provider is an exception, Media Provider process should be allowed
// to query users across profiles, even without MANAGE_EXTERNAL_STORAGE access.
// Note that ordinarily Media provider process has the above permission, but if they
// are revoked, Storage Volume(s) should still be returned.
if (!callerIsMediaStore
&& !mStorageManagerInternal.hasExternalStorageAccess(callingUid,
packagesFromUid[0])) { packagesFromUid[0])) {
throw new SecurityException("Only File Manager Apps permitted"); throw new SecurityException("Only File Manager Apps permitted");
} }
@@ -3610,13 +3622,6 @@ class StorageManagerService extends IStorageManager.Stub
// point // point
final boolean systemUserUnlocked = isSystemUnlocked(UserHandle.USER_SYSTEM); final boolean systemUserUnlocked = isSystemUnlocked(UserHandle.USER_SYSTEM);
// When the caller is the app actually hosting external storage, we
// should never attempt to augment the actual storage volume state,
// otherwise we risk confusing it with race conditions as users go
// through various unlocked states
final boolean callerIsMediaStore = UserHandle.isSameApp(callingUid,
mMediaStoreAuthorityAppId);
final boolean userIsDemo; final boolean userIsDemo;
final boolean userKeyUnlocked; final boolean userKeyUnlocked;
final boolean storagePermission; final boolean storagePermission;