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

Commit 0259e53e authored by Nicholas Sauer's avatar Nicholas Sauer
Browse files

Require that the caller has INTERACT_ACROSS_USERS in order to retrieve

home tasks of other users.

This prevents users from observing home tasks of other users on the device.

bug: 140274903
Test: cts-tradefed run cts-dev -m CtsPermissionTestCases -t android.permission.cts.NoActivityRelatedPermissionTest#testGetTask
cts-tradefed run cts-dev -m CtsWindowManagerDeviceTestCases
cts-tradefed run cts-dev -m CtsAppTestCases
Change-Id: Ia5fdb1ba1ab7d9ec27d1afbb3a359b454c7075c0
parent d383981f
Loading
Loading
Loading
Loading
+13 −4
Original line number Diff line number Diff line
@@ -4543,19 +4543,28 @@ class ActivityStack extends ConfigurationContainer {
     *         then skip running tasks that match those types.
     */
    void getRunningTasks(List<TaskRecord> tasksOut, @ActivityType int ignoreActivityType,
            @WindowingMode int ignoreWindowingMode, int callingUid, boolean allowed) {
            @WindowingMode int ignoreWindowingMode, int callingUid, boolean allowed,
            boolean crossUser) {
        boolean focusedStack = mRootActivityContainer.getTopDisplayFocusedStack() == this;
        boolean topTask = true;
        int userId = UserHandle.getUserId(callingUid);
        for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
            final TaskRecord task = mTaskHistory.get(taskNdx);
            if (task.getTopActivity() == null) {
                // Skip if there are no activities in the task
                continue;
            }
            if (!allowed && !task.isActivityTypeHome() && task.effectiveUid != callingUid) {
                // Skip if the caller can't fetch this task
            if (task.effectiveUid != callingUid) {
                if (task.userId != userId && !crossUser) {
                    // Skip if the caller does not have cross user permission
                    continue;
                }
                if (!allowed && !task.isActivityTypeHome()) {
                    // Skip if the caller isn't allowed to fetch this task, except for the home
                    // task which we always return.
                    continue;
                }
            }
            if (ignoreActivityType != ACTIVITY_TYPE_UNDEFINED
                    && task.getActivityType() == ignoreActivityType) {
                // Skip ignored activity type
+11 −3
Original line number Diff line number Diff line
@@ -19,6 +19,8 @@ package com.android.server.wm;
import static android.Manifest.permission.BIND_VOICE_INTERACTION;
import static android.Manifest.permission.CHANGE_CONFIGURATION;
import static android.Manifest.permission.CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS;
import static android.Manifest.permission.INTERACT_ACROSS_USERS;
import static android.Manifest.permission.INTERACT_ACROSS_USERS_FULL;
import static android.Manifest.permission.INTERNAL_SYSTEM_WINDOW;
import static android.Manifest.permission.MANAGE_ACTIVITY_STACKS;
import static android.Manifest.permission.READ_FRAME_BUFFER;
@@ -2508,15 +2510,16 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
            @WindowConfiguration.ActivityType int ignoreActivityType,
            @WindowConfiguration.WindowingMode int ignoreWindowingMode) {
        final int callingUid = Binder.getCallingUid();
        final int callingPid = Binder.getCallingPid();
        final boolean crossUser = isCrossUserAllowed(callingPid, callingUid);
        ArrayList<ActivityManager.RunningTaskInfo> list = new ArrayList<>();

        synchronized (mGlobalLock) {
            if (DEBUG_ALL) Slog.v(TAG, "getTasks: max=" + maxNum);

            final boolean allowed = isGetTasksAllowed("getTasks", Binder.getCallingPid(),
                    callingUid);
            final boolean allowed = isGetTasksAllowed("getTasks", callingPid, callingUid);
            mRootActivityContainer.getRunningTasks(maxNum, list, ignoreActivityType,
                    ignoreWindowingMode, callingUid, allowed);
                    ignoreWindowingMode, callingUid, allowed, crossUser);
        }

        return list;
@@ -3545,6 +3548,11 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
        return allowed;
    }

    boolean isCrossUserAllowed(int pid, int uid) {
        return checkPermission(INTERACT_ACROSS_USERS, pid, uid) == PERMISSION_GRANTED
                || checkPermission(INTERACT_ACROSS_USERS_FULL, pid, uid) == PERMISSION_GRANTED;
    }

    private PendingAssistExtras enqueueAssistContext(int requestType, Intent intent, String hint,
            IAssistDataReceiver receiver, Bundle receiverExtras, IBinder activityToken,
            boolean focused, boolean newSessionId, int userHandle, Bundle args, long timeout,
+2 −2
Original line number Diff line number Diff line
@@ -2260,9 +2260,9 @@ class RootActivityContainer extends ConfigurationContainer
    void getRunningTasks(int maxNum, List<ActivityManager.RunningTaskInfo> list,
            @WindowConfiguration.ActivityType int ignoreActivityType,
            @WindowConfiguration.WindowingMode int ignoreWindowingMode, int callingUid,
            boolean allowed) {
            boolean allowed, boolean crossUser) {
        mStackSupervisor.getRunningTasks().getTasks(maxNum, list, ignoreActivityType,
                ignoreWindowingMode, mActivityDisplays, callingUid, allowed);
                ignoreWindowingMode, mActivityDisplays, callingUid, allowed, crossUser);
    }

    void sendPowerHintForLaunchStartIfNeeded(boolean forceSend, ActivityRecord targetActivity) {
+2 −2
Original line number Diff line number Diff line
@@ -40,7 +40,7 @@ class RunningTasks {

    void getTasks(int maxNum, List<RunningTaskInfo> list, @ActivityType int ignoreActivityType,
            @WindowingMode int ignoreWindowingMode, ArrayList<ActivityDisplay> activityDisplays,
            int callingUid, boolean allowed) {
            int callingUid, boolean allowed, boolean crossUser) {
        // Return early if there are no tasks to fetch
        if (maxNum <= 0) {
            return;
@@ -55,7 +55,7 @@ class RunningTasks {
                final ActivityStack stack = display.getChildAt(stackNdx);
                mTmpStackTasks.clear();
                stack.getRunningTasks(mTmpStackTasks, ignoreActivityType, ignoreWindowingMode,
                        callingUid, allowed);
                        callingUid, allowed, crossUser);
                mTmpSortedSet.addAll(mTmpStackTasks);
            }
        }
+2 −2
Original line number Diff line number Diff line
@@ -1289,10 +1289,10 @@ public class RecentTasksTest extends ActivityTestsBase {
        @Override
        void getTasks(int maxNum, List<RunningTaskInfo> list, int ignoreActivityType,
                int ignoreWindowingMode, ArrayList<ActivityDisplay> activityDisplays,
                int callingUid, boolean allowed) {
                int callingUid, boolean allowed, boolean crossUser) {
            mLastAllowed = allowed;
            super.getTasks(maxNum, list, ignoreActivityType, ignoreWindowingMode, activityDisplays,
                    callingUid, allowed);
                    callingUid, allowed, crossUser);
        }
    }
}
Loading