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

Commit 6f2a341b authored by Jackal Guo's avatar Jackal Guo
Browse files

Apply package visibility to getUidForSharedUser

Add package visibility filtering to the implementation. Besides,
ensure the correct behavior in the AppEnumerationInternalTests.

Bug: 187722308
Test: AppEnumerationInternalTests
Test: manually using the PoC in the buganizer to ensure the symptom
      no longer exists.
Change-Id: I79ddb18ea07d662df0238673ab0939b32a8daf8a
parent 4883cbd8
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1057,7 +1057,7 @@ public class ApplicationPackageManager extends PackageManager {
            throws NameNotFoundException {
        try {
            int uid = mPM.getUidForSharedUser(sharedUserName);
            if(uid != -1) {
            if (uid != Process.INVALID_UID) {
                return uid;
            }
        } catch (RemoteException e) {
+10 −8
Original line number Diff line number Diff line
@@ -10055,24 +10055,26 @@ public class PackageManagerService extends IPackageManager.Stub
    @Override
    public int getUidForSharedUser(String sharedUserName) {
        if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
            return -1;
        }
        if (sharedUserName == null) {
            return -1;
            return Process.INVALID_UID;
        }
        final int callingUid = Binder.getCallingUid();
        if (getInstantAppPackageName(callingUid) != null) {
            return Process.INVALID_UID;
        }
        // reader
        synchronized (mLock) {
            SharedUserSetting suid;
            try {
                suid = mSettings.getSharedUserLPw(sharedUserName, 0, 0, false);
                if (suid != null) {
                final SharedUserSetting suid = mSettings.getSharedUserLPw(sharedUserName,
                        0 /* pkgFlags */, 0 /* pkgPrivateFlags */, false /* create */);
                if (suid != null && !shouldFilterApplicationLocked(suid, callingUid,
                        UserHandle.getUserId(callingUid))) {
                    return suid.userId;
                }
            } catch (PackageManagerException ignore) {
                // can't happen, but, still need to catch it
            }
            return -1;
            return Process.INVALID_UID;
        }
    }
+1 −0
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@
    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.FilePusher">
        <option name="push" value="AppEnumerationSyncProviderTestApp.apk->/data/local/tmp/appenumerationtests/AppEnumerationSyncProviderTestApp.apk" />
        <option name="push" value="AppEnumerationHasAppOpPermissionTestApp.apk->/data/local/tmp/appenumerationtests/AppEnumerationHasAppOpPermissionTestApp.apk" />
        <option name="push" value="AppEnumerationSharedUserTestApp.apk->/data/local/tmp/appenumerationtests/AppEnumerationSharedUserTestApp.apk" />
    </target_preparer>

    <option name="test-tag" value="AppEnumerationInternalTest" />
+22 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import static com.google.common.truth.Truth.assertThat;
import android.app.AppGlobals;
import android.content.pm.IPackageManager;
import android.content.pm.ProviderInfo;
import android.os.Process;

import androidx.test.runner.AndroidJUnit4;

@@ -45,14 +46,18 @@ public class AppEnumerationInternalTests {
            TEST_DATA_PATH + "AppEnumerationSyncProviderTestApp.apk";
    private static final String HAS_APPOP_PERMISSION_APK_PATH =
            TEST_DATA_PATH + "AppEnumerationHasAppOpPermissionTestApp.apk";
    private static final String SHARED_USER_APK_PATH =
            TEST_DATA_PATH + "AppEnumerationSharedUserTestApp.apk";

    private static final String TARGET_SYNC_PROVIDER = "com.android.appenumeration.syncprovider";
    private static final String TARGET_HAS_APPOP_PERMISSION =
            "com.android.appenumeration.hasappoppermission";
    private static final String TARGET_SHARED_USER = "com.android.appenumeration.shareduid";

    private static final String SYNC_PROVIDER_AUTHORITY = TARGET_SYNC_PROVIDER;
    private static final String PERMISSION_REQUEST_INSTALL_PACKAGES =
            "android.permission.REQUEST_INSTALL_PACKAGES";
    private static final String SHARED_USER_NAME = "com.android.appenumeration.shareduid";

    private IPackageManager mIPackageManager;

@@ -65,6 +70,7 @@ public class AppEnumerationInternalTests {
    public void tearDown() throws Exception {
        uninstallPackage(TARGET_SYNC_PROVIDER);
        uninstallPackage(TARGET_HAS_APPOP_PERMISSION);
        uninstallPackage(TARGET_SHARED_USER);
    }

    @Test
@@ -111,6 +117,22 @@ public class AppEnumerationInternalTests {
        assertThat(packageNames).asList().doesNotContain(TARGET_HAS_APPOP_PERMISSION);
    }

    @Test
    public void getUidForSharedUser_canSeeForceQueryable() throws Exception {
        installPackage(SHARED_USER_APK_PATH, true /* forceQueryable */);

        final int uid = mIPackageManager.getUidForSharedUser(SHARED_USER_NAME);
        assertThat(uid).isGreaterThan(Process.FIRST_APPLICATION_UID);
    }

    @Test
    public void getUidForSharedUser_cannotSeeSharedUser() throws Exception {
        installPackage(SHARED_USER_APK_PATH, false /* forceQueryable */);

        final int uid = mIPackageManager.getUidForSharedUser(SHARED_USER_NAME);
        assertThat(uid).isEqualTo(Process.INVALID_UID);
    }

    private static void installPackage(String apkPath, boolean forceQueryable) {
        final StringBuilder cmd = new StringBuilder("pm install ");
        if (forceQueryable) {
+14 −0
Original line number Diff line number Diff line
@@ -48,3 +48,17 @@ android_test_helper_app {
    test_suites: ["device-tests"],
    platform_apis: true,
}

android_test_helper_app {
    name: "AppEnumerationSharedUserTestApp",
    srcs: ["src/**/*.java"],
    manifest: "AndroidManifest-sharedUser.xml",
    dex_preopt: {
        enabled: false,
    },
    optimize: {
        enabled: false,
    },
    test_suites: ["device-tests"],
    platform_apis: true,
}
Loading