Restricted permission whitelisted by default
To ensure existing installers would work without a change the default state of installing a package is now that all restricted permissions are whitelisted. If the installer specifies another whitelist at install time, it determines the install state. In addition to this we now enable the restricted permission checks as a prebuilt installer is no longer required. Test: atest CtsPermission2TestCases Test: atest CtsPermissionTestCases Test: atest CtsAppSecurityTestCases:android.appsecurity.cts.PermissionsHostTest bug:132160728 Change-Id: I705e341faebe62fc2d88fd37ad8870b98e1b71b1
This commit is contained in:
@@ -725,7 +725,6 @@ package android.content.pm {
|
|||||||
field public static final int FLAG_PERMISSION_USER_SET = 1; // 0x1
|
field public static final int FLAG_PERMISSION_USER_SET = 1; // 0x1
|
||||||
field public static final int MATCH_FACTORY_ONLY = 2097152; // 0x200000
|
field public static final int MATCH_FACTORY_ONLY = 2097152; // 0x200000
|
||||||
field public static final int MATCH_KNOWN_PACKAGES = 4202496; // 0x402000
|
field public static final int MATCH_KNOWN_PACKAGES = 4202496; // 0x402000
|
||||||
field public static boolean RESTRICTED_PERMISSIONS_ENABLED;
|
|
||||||
field public static final String SYSTEM_SHARED_LIBRARY_SERVICES = "android.ext.services";
|
field public static final String SYSTEM_SHARED_LIBRARY_SERVICES = "android.ext.services";
|
||||||
field public static final String SYSTEM_SHARED_LIBRARY_SHARED = "android.ext.shared";
|
field public static final String SYSTEM_SHARED_LIBRARY_SHARED = "android.ext.shared";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1278,7 +1278,7 @@ public class PackageInstaller {
|
|||||||
public int mode = MODE_INVALID;
|
public int mode = MODE_INVALID;
|
||||||
/** {@hide} */
|
/** {@hide} */
|
||||||
@UnsupportedAppUsage
|
@UnsupportedAppUsage
|
||||||
public int installFlags;
|
public int installFlags = PackageManager.INSTALL_ALL_WHITELIST_RESTRICTED_PERMISSIONS;
|
||||||
/** {@hide} */
|
/** {@hide} */
|
||||||
public int installLocation = PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY;
|
public int installLocation = PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY;
|
||||||
/** {@hide} */
|
/** {@hide} */
|
||||||
@@ -1513,18 +1513,21 @@ public class PackageInstaller {
|
|||||||
* state of the permission can be determined only at install time and cannot be
|
* state of the permission can be determined only at install time and cannot be
|
||||||
* changed on updated or at a later point via the package manager APIs.
|
* changed on updated or at a later point via the package manager APIs.
|
||||||
*
|
*
|
||||||
|
* <p>Initially, all restricted permissions are whitelisted but you can change
|
||||||
|
* which ones are whitelisted by calling this method or the corresponding ones
|
||||||
|
* on the {@link PackageManager}.
|
||||||
|
*
|
||||||
* @see PackageManager#addWhitelistedRestrictedPermission(String, String, int)
|
* @see PackageManager#addWhitelistedRestrictedPermission(String, String, int)
|
||||||
* @see PackageManager#removeWhitelistedRestrictedPermission(String, String, int)
|
* @see PackageManager#removeWhitelistedRestrictedPermission(String, String, int)
|
||||||
*/
|
*/
|
||||||
public void setWhitelistedRestrictedPermissions(@Nullable Set<String> permissions) {
|
public void setWhitelistedRestrictedPermissions(@Nullable Set<String> permissions) {
|
||||||
if (permissions == RESTRICTED_PERMISSIONS_ALL) {
|
if (permissions == RESTRICTED_PERMISSIONS_ALL) {
|
||||||
installFlags |= PackageManager.INSTALL_ALL_WHITELIST_RESTRICTED_PERMISSIONS;
|
installFlags |= PackageManager.INSTALL_ALL_WHITELIST_RESTRICTED_PERMISSIONS;
|
||||||
}
|
whitelistedRestrictedPermissions = null;
|
||||||
if (permissions != null) {
|
|
||||||
this.whitelistedRestrictedPermissions = new ArrayList<>(permissions);
|
|
||||||
} else {
|
} else {
|
||||||
installFlags &= ~PackageManager.INSTALL_ALL_WHITELIST_RESTRICTED_PERMISSIONS;
|
installFlags &= ~PackageManager.INSTALL_ALL_WHITELIST_RESTRICTED_PERMISSIONS;
|
||||||
this.whitelistedRestrictedPermissions = null;
|
whitelistedRestrictedPermissions = (permissions != null)
|
||||||
|
? new ArrayList<>(permissions) : null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -86,11 +86,6 @@ public abstract class PackageManager {
|
|||||||
/** {@hide} */
|
/** {@hide} */
|
||||||
public static final boolean APPLY_DEFAULT_TO_DEVICE_PROTECTED_STORAGE = true;
|
public static final boolean APPLY_DEFAULT_TO_DEVICE_PROTECTED_STORAGE = true;
|
||||||
|
|
||||||
/** {@hide} */
|
|
||||||
@TestApi
|
|
||||||
// STOPSHIP: Remove this once we get a Play prebuilt.
|
|
||||||
public static boolean RESTRICTED_PERMISSIONS_ENABLED = false;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This exception is thrown when a given package, application, or component
|
* This exception is thrown when a given package, application, or component
|
||||||
* name cannot be found.
|
* name cannot be found.
|
||||||
|
|||||||
@@ -531,16 +531,6 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
|
|||||||
+ "to use the PackageManager.INSTALL_GRANT_RUNTIME_PERMISSIONS flag");
|
+ "to use the PackageManager.INSTALL_GRANT_RUNTIME_PERMISSIONS flag");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Only system components can circumvent restricted whitelisting when installing.
|
|
||||||
if ((params.installFlags
|
|
||||||
& PackageManager.INSTALL_ALL_WHITELIST_RESTRICTED_PERMISSIONS) != 0
|
|
||||||
&& mContext.checkCallingOrSelfPermission(Manifest.permission
|
|
||||||
.WHITELIST_RESTRICTED_PERMISSIONS) == PackageManager.PERMISSION_DENIED) {
|
|
||||||
throw new SecurityException("You need the "
|
|
||||||
+ "android.permission.WHITELIST_RESTRICTED_PERMISSIONS permission to"
|
|
||||||
+ " use the PackageManager.INSTALL_WHITELIST_RESTRICTED_PERMISSIONS flag");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Defensively resize giant app icons
|
// Defensively resize giant app icons
|
||||||
if (params.appIcon != null) {
|
if (params.appIcon != null) {
|
||||||
final ActivityManager am = (ActivityManager) mContext.getSystemService(
|
final ActivityManager am = (ActivityManager) mContext.getSystemService(
|
||||||
|
|||||||
@@ -2351,9 +2351,10 @@ class PackageManagerShellCommand extends ShellCommand {
|
|||||||
break;
|
break;
|
||||||
case "-g":
|
case "-g":
|
||||||
sessionParams.installFlags |= PackageManager.INSTALL_GRANT_RUNTIME_PERMISSIONS;
|
sessionParams.installFlags |= PackageManager.INSTALL_GRANT_RUNTIME_PERMISSIONS;
|
||||||
case "-w":
|
break;
|
||||||
sessionParams.installFlags |=
|
case "--restrict-permissions":
|
||||||
PackageManager.INSTALL_ALL_WHITELIST_RESTRICTED_PERMISSIONS;
|
sessionParams.installFlags &=
|
||||||
|
~PackageManager.INSTALL_ALL_WHITELIST_RESTRICTED_PERMISSIONS;
|
||||||
break;
|
break;
|
||||||
case "--dont-kill":
|
case "--dont-kill":
|
||||||
sessionParams.installFlags |= PackageManager.INSTALL_DONT_KILL_APP;
|
sessionParams.installFlags |= PackageManager.INSTALL_DONT_KILL_APP;
|
||||||
@@ -3004,10 +3005,10 @@ class PackageManagerShellCommand extends ShellCommand {
|
|||||||
pw.println(" -d: allow version code downgrade (debuggable packages only)");
|
pw.println(" -d: allow version code downgrade (debuggable packages only)");
|
||||||
pw.println(" -p: partial application install (new split on top of existing pkg)");
|
pw.println(" -p: partial application install (new split on top of existing pkg)");
|
||||||
pw.println(" -g: grant all runtime permissions");
|
pw.println(" -g: grant all runtime permissions");
|
||||||
pw.println(" -w: whitelist all restricted permissions");
|
|
||||||
pw.println(" -S: size in bytes of package, required for stdin");
|
pw.println(" -S: size in bytes of package, required for stdin");
|
||||||
pw.println(" --user: install under the given user.");
|
pw.println(" --user: install under the given user.");
|
||||||
pw.println(" --dont-kill: installing a new feature split, don't kill running app");
|
pw.println(" --dont-kill: installing a new feature split, don't kill running app");
|
||||||
|
pw.println(" --restrict-permissions: don't whitelist restricted permissions at install");
|
||||||
pw.println(" --originating-uri: set URI where app was downloaded from");
|
pw.println(" --originating-uri: set URI where app was downloaded from");
|
||||||
pw.println(" --referrer: set URI that instigated the install of the app");
|
pw.println(" --referrer: set URI that instigated the install of the app");
|
||||||
pw.println(" --pkg: specify expected package name of app being installed");
|
pw.println(" --pkg: specify expected package name of app being installed");
|
||||||
|
|||||||
@@ -1134,7 +1134,7 @@ public final class DefaultPermissionGrantPolicy {
|
|||||||
private void grantRuntimePermissions(PackageInfo pkg, Set<String> permissionsWithoutSplits,
|
private void grantRuntimePermissions(PackageInfo pkg, Set<String> permissionsWithoutSplits,
|
||||||
boolean systemFixed, boolean ignoreSystemPackage,
|
boolean systemFixed, boolean ignoreSystemPackage,
|
||||||
boolean whitelistRestrictedPermissions, int userId) {
|
boolean whitelistRestrictedPermissions, int userId) {
|
||||||
UserHandle user = UserHandle.of(userId);
|
UserHandle user = UserHandle.of(userId);
|
||||||
if (pkg == null) {
|
if (pkg == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1203,7 +1203,7 @@ public final class DefaultPermissionGrantPolicy {
|
|||||||
if (ArrayUtils.isEmpty(disabledPkg.requestedPermissions)) {
|
if (ArrayUtils.isEmpty(disabledPkg.requestedPermissions)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!requestedPermissions.equals(disabledPkg.requestedPermissions)) {
|
if (!Arrays.equals(requestedPermissions, disabledPkg.requestedPermissions)) {
|
||||||
grantablePermissions = new ArraySet<>(Arrays.asList(requestedPermissions));
|
grantablePermissions = new ArraySet<>(Arrays.asList(requestedPermissions));
|
||||||
requestedPermissions = disabledPkg.requestedPermissions;
|
requestedPermissions = disabledPkg.requestedPermissions;
|
||||||
}
|
}
|
||||||
@@ -1213,7 +1213,7 @@ public final class DefaultPermissionGrantPolicy {
|
|||||||
final int numRequestedPermissions = requestedPermissions.length;
|
final int numRequestedPermissions = requestedPermissions.length;
|
||||||
|
|
||||||
// Sort requested permissions so that all permissions that are a foreground permission (i.e.
|
// Sort requested permissions so that all permissions that are a foreground permission (i.e.
|
||||||
// permisions that have background permission) are before their background permissions.
|
// permissions that have a background permission) are before their background permissions.
|
||||||
final String[] sortedRequestedPermissions = new String[numRequestedPermissions];
|
final String[] sortedRequestedPermissions = new String[numRequestedPermissions];
|
||||||
int numForeground = 0;
|
int numForeground = 0;
|
||||||
int numOther = 0;
|
int numOther = 0;
|
||||||
@@ -1258,9 +1258,16 @@ public final class DefaultPermissionGrantPolicy {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
int uid = UserHandle.getUid(userId,
|
// Preserve whitelisting flags.
|
||||||
UserHandle.getAppId(pkg.applicationInfo.uid));
|
newFlags |= (flags & PackageManager.FLAGS_PERMISSION_RESTRICTION_ANY_EXEMPT);
|
||||||
String op = AppOpsManager.permissionToOp(permission);
|
|
||||||
|
// If we are whitelisting the permission, update the exempt flag before grant.
|
||||||
|
if (whitelistRestrictedPermissions && isPermissionRestricted(permission)) {
|
||||||
|
mContext.getPackageManager().updatePermissionFlags(permission,
|
||||||
|
pkg.packageName,
|
||||||
|
PackageManager.FLAG_PERMISSION_RESTRICTION_SYSTEM_EXEMPT,
|
||||||
|
PackageManager.FLAG_PERMISSION_RESTRICTION_SYSTEM_EXEMPT, user);
|
||||||
|
}
|
||||||
|
|
||||||
if (pm.checkPermission(permission, pkg.packageName)
|
if (pm.checkPermission(permission, pkg.packageName)
|
||||||
!= PackageManager.PERMISSION_GRANTED) {
|
!= PackageManager.PERMISSION_GRANTED) {
|
||||||
@@ -1268,13 +1275,12 @@ public final class DefaultPermissionGrantPolicy {
|
|||||||
.grantRuntimePermission(pkg.packageName, permission, user);
|
.grantRuntimePermission(pkg.packageName, permission, user);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (whitelistRestrictedPermissions && isPermissionRestricted(permission)) {
|
|
||||||
newFlags |= PackageManager.FLAG_PERMISSION_RESTRICTION_SYSTEM_EXEMPT;
|
|
||||||
}
|
|
||||||
|
|
||||||
mContext.getPackageManager().updatePermissionFlags(permission, pkg.packageName,
|
mContext.getPackageManager().updatePermissionFlags(permission, pkg.packageName,
|
||||||
newFlags, newFlags, user);
|
newFlags, newFlags, user);
|
||||||
|
|
||||||
|
int uid = UserHandle.getUid(userId,
|
||||||
|
UserHandle.getAppId(pkg.applicationInfo.uid));
|
||||||
|
|
||||||
List<String> fgPerms = mPermissionManager.getBackgroundPermissions()
|
List<String> fgPerms = mPermissionManager.getBackgroundPermissions()
|
||||||
.get(permission);
|
.get(permission);
|
||||||
if (fgPerms != null) {
|
if (fgPerms != null) {
|
||||||
@@ -1285,6 +1291,7 @@ public final class DefaultPermissionGrantPolicy {
|
|||||||
if (pm.checkPermission(fgPerm, pkg.packageName)
|
if (pm.checkPermission(fgPerm, pkg.packageName)
|
||||||
== PackageManager.PERMISSION_GRANTED) {
|
== PackageManager.PERMISSION_GRANTED) {
|
||||||
// Upgrade the app-op state of the fg permission to allow bg access
|
// Upgrade the app-op state of the fg permission to allow bg access
|
||||||
|
// TODO: Dont' call app ops from package manager code.
|
||||||
mContext.getSystemService(AppOpsManager.class).setUidMode(
|
mContext.getSystemService(AppOpsManager.class).setUidMode(
|
||||||
AppOpsManager.permissionToOp(fgPerm), uid,
|
AppOpsManager.permissionToOp(fgPerm), uid,
|
||||||
AppOpsManager.MODE_ALLOWED);
|
AppOpsManager.MODE_ALLOWED);
|
||||||
@@ -1295,8 +1302,10 @@ public final class DefaultPermissionGrantPolicy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
String bgPerm = getBackgroundPermission(permission);
|
String bgPerm = getBackgroundPermission(permission);
|
||||||
|
String op = AppOpsManager.permissionToOp(permission);
|
||||||
if (bgPerm == null) {
|
if (bgPerm == null) {
|
||||||
if (op != null) {
|
if (op != null) {
|
||||||
|
// TODO: Dont' call app ops from package manager code.
|
||||||
mContext.getSystemService(AppOpsManager.class).setUidMode(op, uid,
|
mContext.getSystemService(AppOpsManager.class).setUidMode(op, uid,
|
||||||
AppOpsManager.MODE_ALLOWED);
|
AppOpsManager.MODE_ALLOWED);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,7 +32,6 @@ import static android.content.pm.PackageManager.FLAG_PERMISSION_WHITELIST_INSTAL
|
|||||||
import static android.content.pm.PackageManager.FLAG_PERMISSION_WHITELIST_SYSTEM;
|
import static android.content.pm.PackageManager.FLAG_PERMISSION_WHITELIST_SYSTEM;
|
||||||
import static android.content.pm.PackageManager.FLAG_PERMISSION_WHITELIST_UPGRADE;
|
import static android.content.pm.PackageManager.FLAG_PERMISSION_WHITELIST_UPGRADE;
|
||||||
import static android.content.pm.PackageManager.MASK_PERMISSION_FLAGS_ALL;
|
import static android.content.pm.PackageManager.MASK_PERMISSION_FLAGS_ALL;
|
||||||
import static android.content.pm.PackageManager.RESTRICTED_PERMISSIONS_ENABLED;
|
|
||||||
import static android.os.Trace.TRACE_TAG_PACKAGE_MANAGER;
|
import static android.os.Trace.TRACE_TAG_PACKAGE_MANAGER;
|
||||||
|
|
||||||
import static com.android.server.pm.PackageManagerService.DEBUG_INSTALL;
|
import static com.android.server.pm.PackageManagerService.DEBUG_INSTALL;
|
||||||
@@ -1070,8 +1069,8 @@ public class PermissionManagerService {
|
|||||||
|
|
||||||
boolean wasChanged = false;
|
boolean wasChanged = false;
|
||||||
|
|
||||||
boolean restrictionExempt = !RESTRICTED_PERMISSIONS_ENABLED
|
boolean restrictionExempt =
|
||||||
|| (origPermissions.getPermissionFlags(bp.name, userId)
|
(origPermissions.getPermissionFlags(bp.name, userId)
|
||||||
& FLAGS_PERMISSION_RESTRICTION_ANY_EXEMPT) != 0;
|
& FLAGS_PERMISSION_RESTRICTION_ANY_EXEMPT) != 0;
|
||||||
boolean restrictionApplied = (origPermissions.getPermissionFlags(
|
boolean restrictionApplied = (origPermissions.getPermissionFlags(
|
||||||
bp.name, userId) & FLAG_PERMISSION_APPLY_RESTRICTION) != 0;
|
bp.name, userId) & FLAG_PERMISSION_APPLY_RESTRICTION) != 0;
|
||||||
@@ -1189,8 +1188,8 @@ public class PermissionManagerService {
|
|||||||
for (int userId : currentUserIds) {
|
for (int userId : currentUserIds) {
|
||||||
boolean wasChanged = false;
|
boolean wasChanged = false;
|
||||||
|
|
||||||
boolean restrictionExempt = !RESTRICTED_PERMISSIONS_ENABLED
|
boolean restrictionExempt =
|
||||||
|| (origPermissions.getPermissionFlags(bp.name, userId)
|
(origPermissions.getPermissionFlags(bp.name, userId)
|
||||||
& FLAGS_PERMISSION_RESTRICTION_ANY_EXEMPT) != 0;
|
& FLAGS_PERMISSION_RESTRICTION_ANY_EXEMPT) != 0;
|
||||||
boolean restrictionApplied = (origPermissions.getPermissionFlags(
|
boolean restrictionApplied = (origPermissions.getPermissionFlags(
|
||||||
bp.name, userId) & FLAG_PERMISSION_APPLY_RESTRICTION) != 0;
|
bp.name, userId) & FLAG_PERMISSION_APPLY_RESTRICTION) != 0;
|
||||||
@@ -2066,7 +2065,7 @@ public class PermissionManagerService {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (RESTRICTED_PERMISSIONS_ENABLED && bp.isHardOrSoftRestricted()
|
if (bp.isHardOrSoftRestricted()
|
||||||
&& (flags & PackageManager.FLAGS_PERMISSION_RESTRICTION_ANY_EXEMPT) == 0) {
|
&& (flags & PackageManager.FLAGS_PERMISSION_RESTRICTION_ANY_EXEMPT) == 0) {
|
||||||
Log.e(TAG, "Cannot grant restricted non-exempt permission "
|
Log.e(TAG, "Cannot grant restricted non-exempt permission "
|
||||||
+ permName + " for package " + packageName);
|
+ permName + " for package " + packageName);
|
||||||
|
|||||||
@@ -326,8 +326,8 @@ public final class PermissionPolicyService extends SystemService {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final boolean applyRestriction = PackageManager.RESTRICTED_PERMISSIONS_ENABLED
|
final boolean applyRestriction =
|
||||||
&& (mPackageManager.getPermissionFlags(permission, pkg.packageName,
|
(mPackageManager.getPermissionFlags(permission, pkg.packageName,
|
||||||
mContext.getUser()) & FLAG_PERMISSION_APPLY_RESTRICTION) != 0;
|
mContext.getUser()) & FLAG_PERMISSION_APPLY_RESTRICTION) != 0;
|
||||||
|
|
||||||
if (permissionInfo.isHardRestricted()) {
|
if (permissionInfo.isHardRestricted()) {
|
||||||
|
|||||||
Reference in New Issue
Block a user