Enforcing CarService privileged permission allow listing

Bug: 177455922
Test: Android successful start
Change-Id: Ia2c73b33b37991af481d43834cb7a1a11bb10cd1
This commit is contained in:
Mayank Garg
2021-03-22 13:28:18 -07:00
parent ceaff3862f
commit a734919d63
2 changed files with 26 additions and 6 deletions

View File

@@ -5966,7 +5966,8 @@ public class PackageManagerService extends IPackageManager.Stub
backgroundHandler,
SYSTEM_PARTITIONS,
(i, pm) -> new ComponentResolver(i.getUserManagerService(), pm.mPmInternal, lock),
(i, pm) -> PermissionManagerService.create(context),
(i, pm) -> PermissionManagerService.create(context,
i.getSystemConfig().getAvailableFeatures()),
(i, pm) -> new UserManagerService(context, pm,
new UserDataPreparer(installer, installLock, context, onlyCore),
lock),

View File

@@ -69,8 +69,10 @@ import android.app.IActivityManager;
import android.app.admin.DevicePolicyManagerInternal;
import android.compat.annotation.ChangeId;
import android.compat.annotation.EnabledAfter;
import android.content.AttributionSource;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.FeatureInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.PermissionGroupInfoFlags;
import android.content.pm.PackageManager.PermissionInfoFlags;
@@ -85,7 +87,6 @@ import android.content.pm.parsing.component.ParsedPermissionGroup;
import android.content.pm.permission.SplitPermissionInfoParcelable;
import android.metrics.LogMaker;
import android.os.AsyncTask;
import android.content.AttributionSource;
import android.os.Binder;
import android.os.Build;
import android.os.Debug;
@@ -177,6 +178,10 @@ public class PermissionManagerService extends IPermissionManager.Stub {
private static final long BACKUP_TIMEOUT_MILLIS = SECONDS.toMillis(60);
// For automotive products, CarService enforces allow-listing of the privileged permissions
// com.android.car is the package name which declares auto specific permissions
private static final String CAR_PACKAGE_NAME = "com.android.car";
/** Cap the size of permission trees that 3rd party apps can define; in characters of text */
private static final int MAX_PERMISSION_TREE_FOOTPRINT = 32768;
/** Empty array to avoid allocations */
@@ -210,6 +215,10 @@ public class PermissionManagerService extends IPermissionManager.Stub {
STORAGE_PERMISSIONS.add(Manifest.permission.ACCESS_MEDIA_LOCATION);
}
/** Set of source package names for Privileged Permission Allowlist */
private final ArraySet<String> mPrivilegedPermissionAllowlistSourcePackageNames =
new ArraySet<>();
/** Lock to protect internal data access */
private final Object mLock = new Object();
@@ -356,7 +365,8 @@ public class PermissionManagerService extends IPermissionManager.Stub {
}
};
PermissionManagerService(@NonNull Context context) {
PermissionManagerService(@NonNull Context context,
@NonNull ArrayMap<String, FeatureInfo> availableFeatures) {
// The package info cache is the cache for package and permission information.
// Disable the package info and package permission caches locally but leave the
// checkPermission cache active.
@@ -368,6 +378,13 @@ public class PermissionManagerService extends IPermissionManager.Stub {
mUserManagerInt = LocalServices.getService(UserManagerInternal.class);
mAppOpsManager = context.getSystemService(AppOpsManager.class);
mPrivilegedPermissionAllowlistSourcePackageNames.add(PLATFORM_PACKAGE_NAME);
// PackageManager.hasSystemFeature() is not used here because PackageManagerService
// isn't ready yet.
if (availableFeatures.containsKey(PackageManager.FEATURE_AUTOMOTIVE)) {
mPrivilegedPermissionAllowlistSourcePackageNames.add(CAR_PACKAGE_NAME);
}
mHandlerThread = new ServiceThread(TAG,
Process.THREAD_PRIORITY_BACKGROUND, true /*allowIo*/);
mHandlerThread.start();
@@ -422,7 +439,8 @@ public class PermissionManagerService extends IPermissionManager.Stub {
* lock created by the permission manager itself.
*/
@NonNull
public static PermissionManagerServiceInternal create(@NonNull Context context) {
public static PermissionManagerServiceInternal create(@NonNull Context context,
ArrayMap<String, FeatureInfo> availableFeatures) {
final PermissionManagerServiceInternal permMgrInt =
LocalServices.getService(PermissionManagerServiceInternal.class);
if (permMgrInt != null) {
@@ -431,7 +449,7 @@ public class PermissionManagerService extends IPermissionManager.Stub {
PermissionManagerService permissionService =
(PermissionManagerService) ServiceManager.getService("permissionmgr");
if (permissionService == null) {
permissionService = new PermissionManagerService(context);
permissionService = new PermissionManagerService(context, availableFeatures);
ServiceManager.addService("permissionmgr", permissionService);
}
return LocalServices.getService(PermissionManagerServiceInternal.class);
@@ -3308,7 +3326,8 @@ public class PermissionManagerService extends IPermissionManager.Stub {
if (!pkg.isPrivileged()) {
return true;
}
if (!Objects.equals(permission.getPackageName(), PLATFORM_PACKAGE_NAME)) {
if (!mPrivilegedPermissionAllowlistSourcePackageNames
.contains(permission.getPackageName())) {
return true;
}
final String permissionName = permission.getName();