From c533b566ff60041d4964765ce09a3da78e8866ca Mon Sep 17 00:00:00 2001 From: Fyodor Kupolov Date: Fri, 1 Apr 2016 14:37:07 -0700 Subject: [PATCH] Lock down access to getProfiles for 3P apps MANAGE_USERS permission is not required if calling userId is the same as requested user id. Theoretically this allows any 3P app to read UserInfo state including PII fields like name and icon. The change clears PII fields if the caller doesn't have MANAGE_USERS permission. Bug: 27705805 Change-Id: Ic69c8cc6aafb7ac72b4fc2b9691cb8e4bef3fb2c --- .../android/server/pm/UserManagerService.java | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index 06a91fb0c8577..60a0d6282483e 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -467,13 +467,16 @@ public class UserManagerService extends IUserManager.Stub { @Override public List getProfiles(int userId, boolean enabledOnly) { + boolean returnFullInfo = true; if (userId != UserHandle.getCallingUserId()) { checkManageUsersPermission("getting profiles related to user " + userId); + } else { + returnFullInfo = hasManageUsersPermission(); } final long ident = Binder.clearCallingIdentity(); try { synchronized (mUsersLock) { - return getProfilesLU(userId, enabledOnly); + return getProfilesLU(userId, enabledOnly, returnFullInfo); } } finally { Binder.restoreCallingIdentity(ident); @@ -481,7 +484,7 @@ public class UserManagerService extends IUserManager.Stub { } /** Assume permissions already checked and caller's identity cleared */ - private List getProfilesLU(int userId, boolean enabledOnly) { + private List getProfilesLU(int userId, boolean enabledOnly, boolean fullInfo) { UserInfo user = getUserInfoLU(userId); ArrayList users = new ArrayList(mUsers.size()); if (user == null) { @@ -503,7 +506,14 @@ public class UserManagerService extends IUserManager.Stub { if (profile.partial) { continue; } - users.add(userWithName(profile)); + UserInfo userInfo = userWithName(profile); + // If full info is not required - clear PII data to prevent 3P apps from reading it + if (!fullInfo) { + userInfo = new UserInfo(userInfo); + userInfo.name = null; + userInfo.iconPath = null; + } + users.add(userInfo); } return users; }