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

Commit 98253dfa authored by Bram Bonné's avatar Bram Bonné
Browse files

Allow app's targetSDK to overwrite SELINUX_LATEST_CHANGES SDK

The previous behavior capped the maximum target SDK level for apps to
the current platform target SDK in SELinux policy. This prevented
developing and testing newer SELinux policies in AOSP.

In addition to allowing higher targetSDKs specified by the app to be
considered in SELinux policies, this change adds a test to enforce that
behavior for future target SDK versions.

Bug: 190375530
Test: atest com.android.server.pm.SELinuxMMACTest
Test: atest CtsSelinuxTargetSdkCurrentTestCases
Test: atest CtsSelinuxTargetSdk29TestCases
Test: atest CtsSelinuxTargetSdk28TestCases
Test: atest CtsSelinuxTargetSdk27TestCases

Change-Id: Iee40e5ffd677038157ab7349a38eb34934458e25
Merged-In: Iee40e5ffd677038157ab7349a38eb34934458e25
(cherry picked from commit bedbb890)
parent e6510baf
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -79,7 +79,7 @@ public final class SELinuxMMAC {

    /**
     * Allows opt-in to the latest targetSdkVersion enforced changes without changing target SDK.
     * Turning this change off for an app targeting the latest SDK is a no-op.
     * Turning this change off for an app targeting >= the latest SDK is a no-op.
     *
     * <p>Has no effect for apps using shared user id.
     *
@@ -92,7 +92,7 @@ public final class SELinuxMMAC {
    /**
     * This change gates apps access to untrusted_app_R-targetSDK SELinux domain. Allows opt-in
     * to R targetSdkVersion enforced changes without changing target SDK. Turning this change
     * off for an app targeting S is a no-op.
     * off for an app targeting >= S is a no-op.
     *
     * <p>Has no effect for apps using shared user id.
     *
@@ -364,7 +364,7 @@ public final class SELinuxMMAC {
        }
        final ApplicationInfo appInfo = pkg.toAppInfoWithoutState();
        if (compatibility.isChangeEnabledInternal(SELINUX_LATEST_CHANGES, appInfo)) {
            return android.os.Build.VERSION_CODES.S;
            return Math.max(android.os.Build.VERSION_CODES.S, pkg.getTargetSdkVersion());
        } else if (compatibility.isChangeEnabledInternal(SELINUX_R_CHANGES, appInfo)) {
            return Math.max(android.os.Build.VERSION_CODES.R, pkg.getTargetSdkVersion());
        }
+10 −0
Original line number Diff line number Diff line
@@ -90,6 +90,16 @@ public class SELinuxMMACTest {
                is("default:targetSdkVersion=" + LATEST_OPT_IN_VERSION));
    }

    @Test
    public void getSeInfoTargetingCurDevelopment() {
        AndroidPackage pkg = makePackage(Build.VERSION_CODES.CUR_DEVELOPMENT);
        when(mMockCompatibility.isChangeEnabledInternal(eq(SELinuxMMAC.SELINUX_LATEST_CHANGES),
                argThat(argument -> argument.packageName.equals(pkg.getPackageName()))))
                .thenReturn(true);
        assertThat(SELinuxMMAC.getSeInfo(pkg, null, mMockCompatibility),
                is("default:targetSdkVersion=" + Build.VERSION_CODES.CUR_DEVELOPMENT));
    }

    @Test
    public void getSeInfoNoOptInButAlreadyR() {
        AndroidPackage pkg = makePackage(R_OPT_IN_VERSION);