summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Todd Kennedy <toddke@google.com> 2020-04-29 09:23:36 -0700
committer Todd Kennedy <toddke@google.com> 2020-05-26 20:15:45 +0000
commitdcf6bafbaaeed52609f857dc6c3c3f64ad689162 (patch)
tree2e351e85747917aed98a3b4d5efc7826d3106de3
parent80542add04f3e77e6d63e7383ffd57722f5f2435 (diff)
Add check for cross user permission
Bug: 153995991 Bug: 153996872 Bug: 153996866 Bug: 155466646 Test: atest ManagedProfileCrossProfileTest Change-Id: I9d5f8b506f796c4890352ea9d77ec80d3a9ef1da
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java30
1 files changed, 28 insertions, 2 deletions
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index f31dbbf077bb..6cd8d052c4b5 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -369,6 +369,7 @@ import com.android.server.pm.permission.PermissionsState;
import com.android.server.policy.PermissionPolicyInternal;
import com.android.server.security.VerityUtils;
import com.android.server.storage.DeviceStorageMonitorInternal;
+import com.android.server.uri.UriGrantsManagerInternal;
import com.android.server.utils.TimingsTraceAndSlog;
import com.android.server.wm.ActivityTaskManagerInternal;
@@ -4429,6 +4430,11 @@ public class PackageManagerService extends IPackageManager.Stub
if (getInstantAppPackageName(callingUid) != null) {
throw new SecurityException("Instant applications don't have access to this method");
}
+ if (!mUserManager.exists(userId)) {
+ throw new SecurityException("User doesn't exist");
+ }
+ mPermissionManager.enforceCrossUserPermission(
+ callingUid, userId, false, false, "checkPackageStartable");
final boolean userKeyUnlocked = StorageManager.isUserKeyUnlocked(userId);
synchronized (mLock) {
final PackageSetting ps = mSettings.mPackages.get(packageName);
@@ -5801,9 +5807,15 @@ public class PackageManagerService extends IPackageManager.Stub
@Override
public ChangedPackages getChangedPackages(int sequenceNumber, int userId) {
- if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ final int callingUid = Binder.getCallingUid();
+ if (getInstantAppPackageName(callingUid) != null) {
+ return null;
+ }
+ if (!mUserManager.exists(userId)) {
return null;
}
+ mPermissionManager.enforceCrossUserPermission(
+ callingUid, userId, false, false, "getChangedPackages");
synchronized (mLock) {
if (sequenceNumber >= mChangedPackagesSequenceNumber) {
return null;
@@ -8808,9 +8820,23 @@ public class PackageManagerService extends IPackageManager.Stub
private ProviderInfo resolveContentProviderInternal(String name, int flags, int userId) {
if (!mUserManager.exists(userId)) return null;
- flags = updateFlagsForComponent(flags, userId);
final int callingUid = Binder.getCallingUid();
+ flags = updateFlagsForComponent(flags, userId);
final ProviderInfo providerInfo = mComponentResolver.queryProvider(name, flags, userId);
+ boolean checkedGrants = false;
+ if (providerInfo != null) {
+ // Looking for cross-user grants before enforcing the typical cross-users permissions
+ if (userId != UserHandle.getUserId(callingUid)) {
+ final UriGrantsManagerInternal mUgmInternal =
+ LocalServices.getService(UriGrantsManagerInternal.class);
+ checkedGrants =
+ mUgmInternal.checkAuthorityGrants(callingUid, providerInfo, userId, true);
+ }
+ }
+ if (!checkedGrants) {
+ mPermissionManager.enforceCrossUserPermission(
+ callingUid, userId, false, false, "resolveContentProvider");
+ }
if (providerInfo == null) {
return null;
}