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

Commit a9d522f4 authored by Nikita Ioffe's avatar Nikita Ioffe
Browse files

Fix the visibility check for sdk_sandbox processes

For some cases (e.g. WebView), the visibility is implicitly granted to
the calling uid. Right now the visibility rules for sdk sandbox uids
only take into account the forceQueryable apks, which means that WebView
will never be visible to sdk sandbox uids.

This change adds the implicitly queryable apps to the app visibility
check for the sdk sandbox uids.

Test: run SdkSandboxClientWebView
Test: atest CtsSdkSandboxInprocessTests
Test: atest AppsFilterImplTest
Bug: 238871061
Merged-In: Icfeb8e48151e1675d7b85c9714238f4a499ec6ea
Change-Id: Icfeb8e48151e1675d7b85c9714238f4a499ec6ea
(cherry picked from commit 5a1cba22)
parent 59bc423e
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -323,7 +323,8 @@ public abstract class AppsFilterBase implements AppsFilterSnapshot {
                return false;
            } else if (Process.isSdkSandboxUid(callingAppId)) {
                // we only allow sdk sandbox processes access to forcequeryable packages
                return !isForceQueryable(targetPkgSetting.getAppId());
                return !isForceQueryable(targetPkgSetting.getAppId())
                      && !isImplicitlyQueryable(callingAppId, targetPkgSetting.getAppId());
            }
            if (mCacheReady) { // use cache
                if (!shouldFilterApplicationUsingCache(callingUid,
+33 −0
Original line number Diff line number Diff line
@@ -1376,6 +1376,39 @@ public class AppsFilterImplTest {
                        null /* callingSetting */, target, SYSTEM_USER));
    }

    @Test
    public void testSdkSandbox_implicitAccessGranted_canSeePackage() throws Exception {
        final AppsFilterImpl appsFilter =
                new AppsFilterImpl(mFeatureConfigMock, new String[]{}, false, null,
                        mMockHandler);
        final WatchableTester watcher = new WatchableTester(appsFilter, "onChange");
        watcher.register();
        simulateAddBasicAndroid(appsFilter);
        watcher.verifyChangeReported("addBasic");
        appsFilter.onSystemReady(mPmInternal);
        watcher.verifyChangeReported("systemReady");

        PackageSetting target = simulateAddPackage(appsFilter,
                pkg("com.some.package"), DUMMY_TARGET_APPID,
                setting -> setting.setPkgFlags(ApplicationInfo.FLAG_SYSTEM));

        int callingUid = 20123;
        assertTrue(Process.isSdkSandboxUid(callingUid));

        // Without granting the implicit access the app shouldn't be visible to the sdk sandbox uid.
        assertTrue(
                appsFilter.shouldFilterApplication(mSnapshot, callingUid,
                        null /* callingSetting */, target, SYSTEM_USER));

        appsFilter.grantImplicitAccess(callingUid, target.getAppId(), false /* retainOnUpdate */);
        watcher.verifyChangeReported("grantImplicitAccess");

        // After implicit access was granted the app should be visible to the sdk sandbox uid.
        assertFalse(
                appsFilter.shouldFilterApplication(mSnapshot, callingUid,
                        null /* callingSetting */, target, SYSTEM_USER));
    }

    private List<Integer> toList(int[] array) {
        ArrayList<Integer> ret = new ArrayList<>(array.length);
        for (int i = 0; i < array.length; i++) {