Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7fd4ea6c authored by Jackal Guo's avatar Jackal Guo Committed by Android (Google) Code Review
Browse files

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

parents ad0f187a 70737fcd
Loading
Loading
Loading
Loading
+22 −46
Original line number Diff line number Diff line
@@ -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.
    @Override
    public int getPackageProcessState(String packageName, String callingPackage) {
        if (!hasUsageStatsPermission(callingPackage)) {
            enforceCallingPermission(android.Manifest.permission.PACKAGE_USAGE_STATS, func);
        }
            enforceCallingPermission(android.Manifest.permission.PACKAGE_USAGE_STATS,
                    "getPackageProcessState");
        }
    @Override
    public int getPackageProcessState(String packageName, String callingPackage) {
        enforceUsageStatsPermission(callingPackage, "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;
+1 −1
Original line number Diff line number Diff line
@@ -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
        }
+4 −11
Original line number Diff line number Diff line
@@ -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();