Enforcing CarService privileged permission allow listing
Bug: 177455922 Test: Android successful start Change-Id: Ia2c73b33b37991af481d43834cb7a1a11bb10cd1
This commit is contained in:
@@ -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),
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user