Merge "Revert "Verify the incoming package first.""

This commit is contained in:
Jackal Guo
2022-01-26 15:29:20 +00:00
committed by Android (Google) Code Review
3 changed files with 28 additions and 59 deletions

View File

@@ -2871,51 +2871,13 @@ public class ActivityManagerService extends IActivityManager.Stub
return mode == AppOpsManager.MODE_ALLOWED;
}
/**
* Checks whether the calling package is trusted.
*
* The calling package is trusted if it's from system or the supposed package name matches the
* UID making the call.
*
* @throws SecurityException if the package name and UID don't match.
*/
private void verifyCallingPackage(String callingPackage) {
final int callingUid = Binder.getCallingUid();
// The caller is System or Shell.
if (callingUid == SYSTEM_UID || isCallerShell()) {
return;
}
// Handle the special UIDs that don't have real package (audioserver, cameraserver, etc).
final String resolvedPackage = AppOpsManager.resolvePackageName(callingUid,
null /* packageName */);
if (resolvedPackage != null && resolvedPackage.equals(callingPackage)) {
return;
}
final int claimedUid = getPackageManagerInternal().getPackageUid(callingPackage,
0 /* flags */, UserHandle.getUserId(callingUid));
if (callingUid == claimedUid) {
return;
}
throw new SecurityException(
"Claimed calling package " + callingPackage + " does not match the calling UID "
+ Binder.getCallingUid());
}
private void enforceUsageStatsPermission(String callingPackage, String func) {
verifyCallingPackage(callingPackage);
// Since the protection level of PACKAGE_USAGE_STATS has 'appop', apps may grant this
// permission via that way. We need to check both app-ops and permission.
if (!hasUsageStatsPermission(callingPackage)) {
enforceCallingPermission(android.Manifest.permission.PACKAGE_USAGE_STATS, func);
}
}
@Override
public int getPackageProcessState(String packageName, String callingPackage) {
enforceUsageStatsPermission(callingPackage, "getPackageProcessState");
if (!hasUsageStatsPermission(callingPackage)) {
enforceCallingPermission(android.Manifest.permission.PACKAGE_USAGE_STATS,
"getPackageProcessState");
}
final int[] procState = {PROCESS_STATE_NONEXISTENT};
synchronized (mProcLock) {
mProcessList.forEachLruProcessesLOSP(false, proc -> {
@@ -6976,7 +6938,11 @@ public class ActivityManagerService extends IActivityManager.Stub
@Override
public int getUidProcessState(int uid, String callingPackage) {
enforceUsageStatsPermission(callingPackage, "getUidProcessState");
if (!hasUsageStatsPermission(callingPackage)) {
enforceCallingPermission(android.Manifest.permission.PACKAGE_USAGE_STATS,
"getUidProcessState");
}
synchronized (mProcLock) {
return mProcessList.getUidProcStateLOSP(uid);
}
@@ -6984,7 +6950,11 @@ public class ActivityManagerService extends IActivityManager.Stub
@Override
public @ProcessCapability int getUidProcessCapabilities(int uid, String callingPackage) {
enforceUsageStatsPermission(callingPackage, "getUidProcessCapabilities");
if (!hasUsageStatsPermission(callingPackage)) {
enforceCallingPermission(android.Manifest.permission.PACKAGE_USAGE_STATS,
"getUidProcessState");
}
synchronized (mProcLock) {
return mProcessList.getUidProcessCapabilityLOSP(uid);
}
@@ -6993,7 +6963,10 @@ public class ActivityManagerService extends IActivityManager.Stub
@Override
public void registerUidObserver(IUidObserver observer, int which, int cutpoint,
String callingPackage) {
enforceUsageStatsPermission(callingPackage, "registerUidObserver");
if (!hasUsageStatsPermission(callingPackage)) {
enforceCallingPermission(android.Manifest.permission.PACKAGE_USAGE_STATS,
"registerUidObserver");
}
mUidObserverController.register(observer, which, cutpoint, callingPackage,
Binder.getCallingUid());
}
@@ -7005,7 +6978,10 @@ public class ActivityManagerService extends IActivityManager.Stub
@Override
public boolean isUidActive(int uid, String callingPackage) {
enforceUsageStatsPermission(callingPackage, "isUidActive");
if (!hasUsageStatsPermission(callingPackage)) {
enforceCallingPermission(android.Manifest.permission.PACKAGE_USAGE_STATS,
"isUidActive");
}
synchronized (mProcLock) {
if (isUidActiveLOSP(uid)) {
return true;

View File

@@ -179,7 +179,7 @@ final class VibrationSettings {
try {
ActivityManager.getService().registerUidObserver(mUidObserver,
ActivityManager.UID_OBSERVER_PROCSTATE | ActivityManager.UID_OBSERVER_GONE,
ActivityManager.PROCESS_STATE_UNKNOWN, mContext.getOpPackageName());
ActivityManager.PROCESS_STATE_UNKNOWN, null);
} catch (RemoteException e) {
// ignored; both services live in system_server
}

View File

@@ -541,14 +541,11 @@ public class ActivityManagerServiceTest {
| ActivityManager.UID_OBSERVER_CAPABILITY
};
final IUidObserver[] observers = new IUidObserver.Stub[changesToObserve.length];
doReturn(Process.myUid()).when(sPackageManagerInternal)
.getPackageUid(mContext.getOpPackageName(), 0 /* flags */, mContext.getUserId());
for (int i = 0; i < observers.length; ++i) {
observers[i] = mock(IUidObserver.Stub.class);
when(observers[i].asBinder()).thenReturn((IBinder) observers[i]);
mAms.registerUidObserver(observers[i], changesToObserve[i] /* which */,
ActivityManager.PROCESS_STATE_UNKNOWN /* cutpoint */,
mContext.getOpPackageName());
ActivityManager.PROCESS_STATE_UNKNOWN /* cutpoint */, null /* caller */);
// When we invoke AMS.registerUidObserver, there are some interactions with observers[i]
// mock in RemoteCallbackList class. We don't want to test those interactions and
@@ -677,12 +674,10 @@ public class ActivityManagerServiceTest {
mockNoteOperation();
final IUidObserver observer = mock(IUidObserver.Stub.class);
when(observer.asBinder()).thenReturn((IBinder) observer);
doReturn(Process.myUid()).when(sPackageManagerInternal)
.getPackageUid(mContext.getOpPackageName(), 0 /* flags */, mContext.getUserId());
mAms.registerUidObserver(observer, ActivityManager.UID_OBSERVER_PROCSTATE /* which */,
ActivityManager.PROCESS_STATE_SERVICE /* cutpoint */,
mContext.getOpPackageName());
ActivityManager.PROCESS_STATE_SERVICE /* cutpoint */, null /* callingPackage */);
// When we invoke AMS.registerUidObserver, there are some interactions with observer
// mock in RemoteCallbackList class. We don't want to test those interactions and
// at the same time, we don't want those to interfere with verifyNoMoreInteractions.
@@ -776,9 +771,7 @@ public class ActivityManagerServiceTest {
final IUidObserver observer = mock(IUidObserver.Stub.class);
when(observer.asBinder()).thenReturn((IBinder) observer);
doReturn(Process.myUid()).when(sPackageManagerInternal)
.getPackageUid(mContext.getOpPackageName(), 0 /* flags */, mContext.getUserId());
mAms.registerUidObserver(observer, 0, 0, mContext.getOpPackageName());
mAms.registerUidObserver(observer, 0, 0, null);
// Verify that when observers are registered, then validateUids is correctly updated.
addPendingUidChanges(pendingItemsForUids);
mAms.mUidObserverController.dispatchUidsChanged();