Update READ_PHONE_NUMBER security checks
For SDK R+, READ_PRIVILEGE_PHONE_STATE and carrier privilege should allow access. Test: atest TelephonyPermissionsTest Bug: 151952050 Change-Id: Ie97d0b195937d4729875afd1e74357c1284e101f
This commit is contained in:
@@ -442,16 +442,40 @@ public final class TelephonyPermissions {
|
|||||||
// NOTE(b/73308711): If an app has one of the following AppOps bits explicitly revoked, they
|
// NOTE(b/73308711): If an app has one of the following AppOps bits explicitly revoked, they
|
||||||
// will be denied access, even if they have another permission and AppOps bit if needed.
|
// will be denied access, even if they have another permission and AppOps bit if needed.
|
||||||
|
|
||||||
// First, check if we can read the phone state and the SDK version is below R.
|
// First, check if the SDK version is below R
|
||||||
|
boolean preR = false;
|
||||||
try {
|
try {
|
||||||
ApplicationInfo info = context.getPackageManager().getApplicationInfoAsUser(
|
ApplicationInfo info = context.getPackageManager().getApplicationInfoAsUser(
|
||||||
callingPackage, 0, UserHandle.getUserHandleForUid(Binder.getCallingUid()));
|
callingPackage, 0, UserHandle.getUserHandleForUid(Binder.getCallingUid()));
|
||||||
if (info.targetSdkVersion <= Build.VERSION_CODES.Q) {
|
preR = info.targetSdkVersion <= Build.VERSION_CODES.Q;
|
||||||
|
} catch (PackageManager.NameNotFoundException nameNotFoundException) {
|
||||||
|
}
|
||||||
|
if (preR) {
|
||||||
|
// SDK < R allows READ_PHONE_STATE, READ_PRIVILEGED_PHONE_STATE, or carrier privilege
|
||||||
|
try {
|
||||||
return checkReadPhoneState(
|
return checkReadPhoneState(
|
||||||
context, subId, pid, uid, callingPackage, callingFeatureId, message);
|
context, subId, pid, uid, callingPackage, callingFeatureId, message);
|
||||||
|
} catch (SecurityException readPhoneStateException) {
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// SDK >= R allows READ_PRIVILEGED_PHONE_STATE or carrier privilege
|
||||||
|
try {
|
||||||
|
context.enforcePermission(
|
||||||
|
android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, pid, uid, message);
|
||||||
|
// Skip checking for runtime permission since caller has privileged permission
|
||||||
|
return true;
|
||||||
|
} catch (SecurityException readPrivilegedPhoneStateException) {
|
||||||
|
if (SubscriptionManager.isValidSubscriptionId(subId)) {
|
||||||
|
try {
|
||||||
|
enforceCarrierPrivilege(context, subId, uid, message);
|
||||||
|
// Skip checking for runtime permission since caller has carrier privilege
|
||||||
|
return true;
|
||||||
|
} catch (SecurityException carrierPrivilegeException) {
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} catch (SecurityException | PackageManager.NameNotFoundException e) {
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Can be read with READ_SMS too.
|
// Can be read with READ_SMS too.
|
||||||
try {
|
try {
|
||||||
context.enforcePermission(android.Manifest.permission.READ_SMS, pid, uid, message);
|
context.enforcePermission(android.Manifest.permission.READ_SMS, pid, uid, message);
|
||||||
|
|||||||
Reference in New Issue
Block a user