Merge "Add change id for opting in to R selinux changes"

This commit is contained in:
Bram Bonné
2021-06-15 09:20:30 +00:00
committed by Gerrit Code Review
3 changed files with 94 additions and 43 deletions

View File

@@ -348,6 +348,7 @@ import com.android.server.ServiceThread;
import com.android.server.SystemConfig; import com.android.server.SystemConfig;
import com.android.server.SystemServerInitThreadPool; import com.android.server.SystemServerInitThreadPool;
import com.android.server.Watchdog; import com.android.server.Watchdog;
import com.android.server.compat.CompatChange;
import com.android.server.compat.PlatformCompat; import com.android.server.compat.PlatformCompat;
import com.android.server.net.NetworkPolicyManagerInternal; import com.android.server.net.NetworkPolicyManagerInternal;
import com.android.server.pm.Installer.InstallerException; import com.android.server.pm.Installer.InstallerException;
@@ -2612,8 +2613,7 @@ public class PackageManagerService extends IPackageManager.Stub
PackageManagerService m = new PackageManagerService(injector, onlyCore, factoryTest); PackageManagerService m = new PackageManagerService(injector, onlyCore, factoryTest);
t.traceEnd(); // "create package manager" t.traceEnd(); // "create package manager"
injector.getCompatibility().registerListener(SELinuxMMAC.SELINUX_LATEST_CHANGES, final CompatChange.ChangeListener selinuxChangeListener = packageName -> {
packageName -> {
synchronized (m.mInstallLock) { synchronized (m.mInstallLock) {
final AndroidPackage pkg; final AndroidPackage pkg;
final PackageSetting ps; final PackageSetting ps;
@@ -2644,7 +2644,12 @@ public class PackageManagerService extends IPackageManager.Stub
m.prepareAppDataAfterInstallLIF(pkg); m.prepareAppDataAfterInstallLIF(pkg);
} }
} }
}); };
injector.getCompatibility().registerListener(SELinuxMMAC.SELINUX_LATEST_CHANGES,
selinuxChangeListener);
injector.getCompatibility().registerListener(SELinuxMMAC.SELINUX_R_CHANGES,
selinuxChangeListener);
m.installWhitelistedSystemPackages(); m.installWhitelistedSystemPackages();
ServiceManager.addService("package", m); ServiceManager.addService("package", m);

View File

@@ -18,6 +18,7 @@ package com.android.server.pm;
import android.compat.annotation.ChangeId; import android.compat.annotation.ChangeId;
import android.compat.annotation.EnabledAfter; import android.compat.annotation.EnabledAfter;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageParser.SigningDetails; import android.content.pm.PackageParser.SigningDetails;
import android.content.pm.Signature; import android.content.pm.Signature;
import android.os.Environment; import android.os.Environment;
@@ -77,9 +78,21 @@ public final class SELinuxMMAC {
private static final String TARGETSDKVERSION_STR = ":targetSdkVersion="; private static final String TARGETSDKVERSION_STR = ":targetSdkVersion=";
/** /**
* This change gates apps access to untrusted_app_R-targetSDk SELinux domain. Allows opt-in * 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.
*
* <p>Has no effect for apps using shared user id.
*
* TODO(b/143539591): Update description with relevant SELINUX changes this opts in to.
*/
@EnabledAfter(targetSdkVersion = android.os.Build.VERSION_CODES.R)
@ChangeId
static final long SELINUX_LATEST_CHANGES = 143539591L;
/**
* 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 * to R targetSdkVersion enforced changes without changing target SDK. Turning this change
* off for an app targeting R is a no-op. * off for an app targeting S is a no-op.
* *
* <p>Has no effect for apps using shared user id. * <p>Has no effect for apps using shared user id.
* *
@@ -87,7 +100,7 @@ public final class SELinuxMMAC {
*/ */
@EnabledAfter(targetSdkVersion = android.os.Build.VERSION_CODES.Q) @EnabledAfter(targetSdkVersion = android.os.Build.VERSION_CODES.Q)
@ChangeId @ChangeId
static final long SELINUX_LATEST_CHANGES = 143539591L; static final long SELINUX_R_CHANGES = 168782947L;
// Only initialize sMacPermissions once. // Only initialize sMacPermissions once.
static { static {
@@ -349,9 +362,11 @@ public final class SELinuxMMAC {
if ((sharedUserSetting != null) && (sharedUserSetting.packages.size() != 0)) { if ((sharedUserSetting != null) && (sharedUserSetting.packages.size() != 0)) {
return sharedUserSetting.seInfoTargetSdkVersion; return sharedUserSetting.seInfoTargetSdkVersion;
} }
if (compatibility.isChangeEnabledInternal(SELINUX_LATEST_CHANGES, final ApplicationInfo appInfo = pkg.toAppInfoWithoutState();
pkg.toAppInfoWithoutState())) { if (compatibility.isChangeEnabledInternal(SELINUX_LATEST_CHANGES, appInfo)) {
return android.os.Build.VERSION_CODES.R; return android.os.Build.VERSION_CODES.S;
} else if (compatibility.isChangeEnabledInternal(SELINUX_R_CHANGES, appInfo)) {
return Math.max(android.os.Build.VERSION_CODES.R, pkg.getTargetSdkVersion());
} }
return pkg.getTargetSdkVersion(); return pkg.getTargetSdkVersion();

View File

@@ -44,7 +44,8 @@ import org.mockito.junit.MockitoJUnitRunner;
public class SELinuxMMACTest { public class SELinuxMMACTest {
private static final String PACKAGE_NAME = "my.package"; private static final String PACKAGE_NAME = "my.package";
private static final int OPT_IN_VERSION = Build.VERSION_CODES.R; private static final int LATEST_OPT_IN_VERSION = Build.VERSION_CODES.S;
private static final int R_OPT_IN_VERSION = Build.VERSION_CODES.R;
@Mock @Mock
PlatformCompat mMockCompatibility; PlatformCompat mMockCompatibility;
@@ -56,7 +57,17 @@ public class SELinuxMMACTest {
argThat(argument -> argument.packageName.equals(pkg.getPackageName())))) argThat(argument -> argument.packageName.equals(pkg.getPackageName()))))
.thenReturn(true); .thenReturn(true);
assertThat(SELinuxMMAC.getSeInfo(pkg, null, mMockCompatibility), assertThat(SELinuxMMAC.getSeInfo(pkg, null, mMockCompatibility),
is("default:targetSdkVersion=" + OPT_IN_VERSION)); is("default:targetSdkVersion=" + LATEST_OPT_IN_VERSION));
}
@Test
public void getSeInfoOptInToR() {
AndroidPackage pkg = makePackage(Build.VERSION_CODES.P);
when(mMockCompatibility.isChangeEnabledInternal(eq(SELinuxMMAC.SELINUX_R_CHANGES),
argThat(argument -> argument.packageName.equals(pkg.getPackageName()))))
.thenReturn(true);
assertThat(SELinuxMMAC.getSeInfo(pkg, null, mMockCompatibility),
is("default:targetSdkVersion=" + R_OPT_IN_VERSION));
} }
@Test @Test
@@ -70,13 +81,33 @@ public class SELinuxMMACTest {
} }
@Test @Test
public void getSeInfoNoOptInButAlreadyR() { public void getSeInfoNoOptInButAlreadyLatest() {
AndroidPackage pkg = makePackage(OPT_IN_VERSION); AndroidPackage pkg = makePackage(LATEST_OPT_IN_VERSION);
when(mMockCompatibility.isChangeEnabledInternal(eq(SELinuxMMAC.SELINUX_LATEST_CHANGES), when(mMockCompatibility.isChangeEnabledInternal(eq(SELinuxMMAC.SELINUX_LATEST_CHANGES),
argThat(argument -> argument.packageName.equals(pkg.getPackageName())))) argThat(argument -> argument.packageName.equals(pkg.getPackageName()))))
.thenReturn(false); .thenReturn(false);
assertThat(SELinuxMMAC.getSeInfo(pkg, null, mMockCompatibility), assertThat(SELinuxMMAC.getSeInfo(pkg, null, mMockCompatibility),
is("default:targetSdkVersion=" + OPT_IN_VERSION)); is("default:targetSdkVersion=" + LATEST_OPT_IN_VERSION));
}
@Test
public void getSeInfoNoOptInButAlreadyR() {
AndroidPackage pkg = makePackage(R_OPT_IN_VERSION);
when(mMockCompatibility.isChangeEnabledInternal(eq(SELinuxMMAC.SELINUX_R_CHANGES),
argThat(argument -> argument.packageName.equals(pkg.getPackageName()))))
.thenReturn(false);
assertThat(SELinuxMMAC.getSeInfo(pkg, null, mMockCompatibility),
is("default:targetSdkVersion=" + R_OPT_IN_VERSION));
}
@Test
public void getSeInfoOptInRButLater() {
AndroidPackage pkg = makePackage(R_OPT_IN_VERSION + 1);
when(mMockCompatibility.isChangeEnabledInternal(eq(SELinuxMMAC.SELINUX_R_CHANGES),
argThat(argument -> argument.packageName.equals(pkg.getPackageName()))))
.thenReturn(true);
assertThat(SELinuxMMAC.getSeInfo(pkg, null, mMockCompatibility),
is("default:targetSdkVersion=" + (R_OPT_IN_VERSION + 1)));
} }
private AndroidPackage makePackage(int targetSdkVersion) { private AndroidPackage makePackage(int targetSdkVersion) {