Verify INTERACT_ACROSS_USERS_FULL perm for cross-user calls.

Bug: 218338453
Bug: 217935264
Test: atest tests/cts/hostside/src/com/android/cts/net/HostsideRestrictBackgroundNetworkTests.java
Change-Id: I3ef13204834e04228280a73e8a095720d5e854a3
This commit is contained in:
Sudheer Shanka
2022-04-25 15:36:27 -07:00
parent 4384a4b74c
commit 85a9add6bd
4 changed files with 31 additions and 4 deletions

View File

@@ -116,8 +116,8 @@ package android.app {
method @RequiresPermission(android.Manifest.permission.SET_ACTIVITY_WATCHER) public void addHomeVisibilityListener(@NonNull java.util.concurrent.Executor, @NonNull android.app.HomeVisibilityListener);
method public void alwaysShowUnsupportedCompileSdkWarning(android.content.ComponentName);
method public long getTotalRam();
method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public int getUidProcessCapabilities(int);
method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public int getUidProcessState(int);
method @RequiresPermission(allOf={android.Manifest.permission.PACKAGE_USAGE_STATS, android.Manifest.permission.INTERACT_ACROSS_USERS_FULL}, conditional=true) public int getUidProcessCapabilities(int);
method @RequiresPermission(allOf={android.Manifest.permission.PACKAGE_USAGE_STATS, android.Manifest.permission.INTERACT_ACROSS_USERS_FULL}, conditional=true) public int getUidProcessState(int);
method public void holdLock(android.os.IBinder, int);
method public static boolean isHighEndGfx();
method @RequiresPermission(android.Manifest.permission.SET_ACTIVITY_WATCHER) public void removeHomeVisibilityListener(@NonNull android.app.HomeVisibilityListener);

View File

@@ -3710,10 +3710,16 @@ public class ActivityManager {
/**
* Returns the process state of this uid.
*
* If the caller does not hold {@link Manifest.permission#INTERACT_ACROSS_USERS_FULL}
* permission, they can only query process state of UIDs running in the same user as the caller.
*
* @hide
*/
@TestApi
@RequiresPermission(Manifest.permission.PACKAGE_USAGE_STATS)
@RequiresPermission(allOf = {
Manifest.permission.PACKAGE_USAGE_STATS,
Manifest.permission.INTERACT_ACROSS_USERS_FULL
}, conditional = true)
public int getUidProcessState(int uid) {
try {
return getService().getUidProcessState(uid, mContext.getOpPackageName());
@@ -3725,10 +3731,17 @@ public class ActivityManager {
/**
* Returns the process capability of this uid.
*
* If the caller does not hold {@link Manifest.permission#INTERACT_ACROSS_USERS_FULL}
* permission, they can only query process capabilities of UIDs running in the same user
* as the caller.
*
* @hide
*/
@TestApi
@RequiresPermission(Manifest.permission.PACKAGE_USAGE_STATS)
@RequiresPermission(allOf = {
Manifest.permission.PACKAGE_USAGE_STATS,
Manifest.permission.INTERACT_ACROSS_USERS_FULL
}, conditional = true)
public @ProcessCapability int getUidProcessCapabilities(int uid) {
try {
return getService().getUidProcessCapabilities(uid, mContext.getOpPackageName());

View File

@@ -100,6 +100,8 @@ interface IActivityManager {
String callingPackage);
void unregisterUidObserver(in IUidObserver observer);
boolean isUidActive(int uid, String callingPackage);
@JavaPassthrough(annotation=
"@android.annotation.RequiresPermission(allOf = {android.Manifest.permission.PACKAGE_USAGE_STATS, android.Manifest.permission.INTERACT_ACROSS_USERS_FULL}, conditional = true)")
int getUidProcessState(int uid, in String callingPackage);
@UnsupportedAppUsage
int checkPermission(in String permission, int pid, int uid);
@@ -742,6 +744,8 @@ interface IActivityManager {
/** Called by PendingIntent.queryIntentComponents() */
ParceledListSlice queryIntentComponentsForIntentSender(in IIntentSender sender, int matchFlags);
@JavaPassthrough(annotation=
"@android.annotation.RequiresPermission(allOf = {android.Manifest.permission.PACKAGE_USAGE_STATS, android.Manifest.permission.INTERACT_ACROSS_USERS_FULL}, conditional = true)")
int getUidProcessCapabilities(int uid, in String callingPackage);
/** Blocks until all broadcast queues become idle. */

View File

@@ -7204,6 +7204,11 @@ public class ActivityManagerService extends IActivityManager.Stub
enforceCallingPermission(android.Manifest.permission.PACKAGE_USAGE_STATS,
"getUidProcessState");
}
// In case the caller is requesting processState of an app in a different user,
// then verify the caller has INTERACT_ACROSS_USERS_FULL permission
mUserController.handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(),
UserHandle.getUserId(uid), false /* allowAll */, ALLOW_FULL_ONLY,
"getUidProcessState", callingPackage); // Ignore return value
synchronized (mProcLock) {
if (mPendingStartActivityUids.isPendingTopUid(uid)) {
@@ -7219,6 +7224,11 @@ public class ActivityManagerService extends IActivityManager.Stub
enforceCallingPermission(android.Manifest.permission.PACKAGE_USAGE_STATS,
"getUidProcessState");
}
// In case the caller is requesting processCapabilities of an app in a different user,
// then verify the caller has INTERACT_ACROSS_USERS_FULL permission
mUserController.handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(),
UserHandle.getUserId(uid), false /* allowAll */, ALLOW_FULL_ONLY,
"getUidProcessCapabilities", callingPackage); // Ignore return value
synchronized (mProcLock) {
return mProcessList.getUidProcessCapabilityLOSP(uid);