Merge "Revert "Verify the incoming package first.""
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user