Merge "Add change id for opting in to R selinux changes"
This commit is contained in:
@@ -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,39 +2613,43 @@ 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;
|
final SharedUserSetting sharedUser;
|
||||||
final SharedUserSetting sharedUser;
|
final String oldSeInfo;
|
||||||
final String oldSeInfo;
|
synchronized (m.mLock) {
|
||||||
synchronized (m.mLock) {
|
ps = m.mSettings.getPackageLPr(packageName);
|
||||||
ps = m.mSettings.getPackageLPr(packageName);
|
if (ps == null) {
|
||||||
if (ps == null) {
|
Slog.e(TAG, "Failed to find package setting " + packageName);
|
||||||
Slog.e(TAG, "Failed to find package setting " + packageName);
|
return;
|
||||||
return;
|
|
||||||
}
|
|
||||||
pkg = ps.pkg;
|
|
||||||
sharedUser = ps.getSharedUser();
|
|
||||||
oldSeInfo = AndroidPackageUtils.getSeInfo(pkg, ps);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pkg == null) {
|
|
||||||
Slog.e(TAG, "Failed to find package " + packageName);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
final String newSeInfo = SELinuxMMAC.getSeInfo(pkg, sharedUser,
|
|
||||||
m.mInjector.getCompatibility());
|
|
||||||
|
|
||||||
if (!newSeInfo.equals(oldSeInfo)) {
|
|
||||||
Slog.i(TAG, "Updating seInfo for package " + packageName + " from: "
|
|
||||||
+ oldSeInfo + " to: " + newSeInfo);
|
|
||||||
ps.getPkgState().setOverrideSeInfo(newSeInfo);
|
|
||||||
m.prepareAppDataAfterInstallLIF(pkg);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
pkg = ps.pkg;
|
||||||
|
sharedUser = ps.getSharedUser();
|
||||||
|
oldSeInfo = AndroidPackageUtils.getSeInfo(pkg, ps);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pkg == null) {
|
||||||
|
Slog.e(TAG, "Failed to find package " + packageName);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
final String newSeInfo = SELinuxMMAC.getSeInfo(pkg, sharedUser,
|
||||||
|
m.mInjector.getCompatibility());
|
||||||
|
|
||||||
|
if (!newSeInfo.equals(oldSeInfo)) {
|
||||||
|
Slog.i(TAG, "Updating seInfo for package " + packageName + " from: "
|
||||||
|
+ oldSeInfo + " to: " + newSeInfo);
|
||||||
|
ps.getPkgState().setOverrideSeInfo(newSeInfo);
|
||||||
|
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);
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user