From 290e57886db79fb83df61ce00636609b6c03c67f Mon Sep 17 00:00:00 2001 From: Bryce Lee Date: Wed, 1 Feb 2017 16:41:20 -0800 Subject: [PATCH] Limit getRunningServices to calling uid's services. Previously all running services for the user were returned when calling ActivityManager#getRunningServices. This changelist enforces restrictions similar to getRunningTasks, where only the user services with a matching uid will be returned. Fixes: 34274345 Test: manual with sample app Test: make -j32 cts; cts-tradefed; run cts --module CtsAppTestCases --test android.app.cts.ServiceTest#testRunningServices Change-Id: I2a13328424d3741fec6076f45ba638bb754d19c5 --- .../com/android/server/am/ActiveServices.java | 24 +++++++++++-------- .../server/am/ActivityManagerService.java | 6 ++++- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index 5655dc54ded71..041fee2352e31 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -16,6 +16,8 @@ package com.android.server.am; +import static android.content.pm.PackageManager.PERMISSION_GRANTED; +import static android.Manifest.permission.INTERACT_ACROSS_USERS_FULL; import static com.android.server.am.ActivityManagerDebugConfig.*; import java.io.FileDescriptor; @@ -1391,8 +1393,7 @@ public final class ActiveServices { } if (r != null) { if (mAm.checkComponentPermission(r.permission, - callingPid, callingUid, r.appInfo.uid, r.exported) - != PackageManager.PERMISSION_GRANTED) { + callingPid, callingUid, r.appInfo.uid, r.exported) != PERMISSION_GRANTED) { if (!r.exported) { Slog.w(TAG, "Permission Denial: Accessing service " + r.name + " from pid=" + callingPid @@ -2775,16 +2776,15 @@ public final class ActiveServices { return info; } - List getRunningServiceInfoLocked(int maxNum, int flags) { + List getRunningServiceInfoLocked(int maxNum, int flags, + int callingUid, boolean allowed) { ArrayList res = new ArrayList(); - final int uid = Binder.getCallingUid(); final long ident = Binder.clearCallingIdentity(); try { - if (ActivityManager.checkUidPermission( - android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, - uid) == PackageManager.PERMISSION_GRANTED) { + if (ActivityManager.checkUidPermission(INTERACT_ACROSS_USERS_FULL, callingUid) + == PERMISSION_GRANTED) { int[] users = mAm.mUserController.getUsers(); for (int ui=0; ui alls = getServicesLocked(users[ui]); @@ -2802,16 +2802,20 @@ public final class ActiveServices { res.add(info); } } else { - int userId = UserHandle.getUserId(uid); + int userId = UserHandle.getUserId(callingUid); ArrayMap alls = getServicesLocked(userId); for (int i=0; i