Enforce MEDIA_CONTENT_CONTROL in verifyPackageName

Also rename verifyPackageName to verifyPackageExists,
which probably reflects behavior a bit better.

Before this change, an app can use a direct binder
call to ask the system whether a package is installed
without having any permissions. Since the method now
requires MEDIA_CONTENT_CONTROL, we don't need
enforceMediaContentControlPermission anymore.

Bug: 205124386
Test: atest MediaRouter2HostSideTest CtsMediaBetterTogetherTestCases
Change-Id: I66723a00cf8b22b40aa0cd680a7dbe4bb71fddb6
This commit is contained in:
Santiago Seifert
2023-01-04 17:30:07 +00:00
parent b7a1333b89
commit c5944b179e
4 changed files with 16 additions and 30 deletions

View File

@@ -50,8 +50,7 @@ interface IMediaRouterService {
// MediaRouterService.java for readability.
// Methods for MediaRouter2
boolean verifyPackageName(String clientPackageName);
void enforceMediaContentControlPermission();
boolean verifyPackageExists(String clientPackageName);
List<MediaRoute2Info> getSystemRoutes();
RoutingSessionInfo getSystemSessionInfo();

View File

@@ -208,9 +208,9 @@ public final class MediaRouter2 {
IMediaRouterService.Stub.asInterface(
ServiceManager.getService(Context.MEDIA_ROUTER_SERVICE));
try {
// SecurityException will be thrown if there's no permission.
serviceBinder.enforceMediaContentControlPermission();
if (!serviceBinder.verifyPackageName(clientPackageName)) {
// verifyPackageExists throws SecurityException if the caller doesn't hold
// MEDIA_CONTENT_CONTROL permission.
if (!serviceBinder.verifyPackageExists(clientPackageName)) {
Log.e(TAG, "Package " + clientPackageName + " not found. Ignoring.");
return null;
}

View File

@@ -154,29 +154,22 @@ class MediaRouter2ServiceImpl {
// Start of methods that implement MediaRouter2 operations.
@NonNull
public boolean verifyPackageName(@NonNull String clientPackageName) {
final long token = Binder.clearCallingIdentity();
try {
PackageManager pm = mContext.getPackageManager();
pm.getPackageInfo(clientPackageName, PackageManager.PackageInfoFlags.of(0));
return true;
} catch (PackageManager.NameNotFoundException ex) {
return false;
} finally {
Binder.restoreCallingIdentity(token);
}
}
@NonNull
public void enforceMediaContentControlPermission() {
public boolean verifyPackageExists(@NonNull String clientPackageName) {
final int pid = Binder.getCallingPid();
final int uid = Binder.getCallingUid();
final long token = Binder.clearCallingIdentity();
try {
mContext.enforcePermission(Manifest.permission.MEDIA_CONTENT_CONTROL, pid, uid,
mContext.enforcePermission(
Manifest.permission.MEDIA_CONTENT_CONTROL,
pid,
uid,
"Must hold MEDIA_CONTENT_CONTROL permission.");
PackageManager pm = mContext.getPackageManager();
pm.getPackageInfo(clientPackageName, PackageManager.PackageInfoFlags.of(0));
return true;
} catch (PackageManager.NameNotFoundException ex) {
return false;
} finally {
Binder.restoreCallingIdentity(token);
}

View File

@@ -380,14 +380,8 @@ public final class MediaRouterService extends IMediaRouterService.Stub
// Binder call
@Override
public boolean verifyPackageName(String clientPackageName) {
return mService2.verifyPackageName(clientPackageName);
}
// Binder call
@Override
public void enforceMediaContentControlPermission() {
mService2.enforceMediaContentControlPermission();
public boolean verifyPackageExists(String clientPackageName) {
return mService2.verifyPackageExists(clientPackageName);
}
// Binder call