Merge "Block SHELL_UID from overlay fabricate and clear shell overlays on boot" into sc-dev am: 987cfe1bff

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/16077739

Change-Id: Icd5d0e40eb0263b216c79527c5f1cd7bc4327e9d
This commit is contained in:
Winson Chiu
2021-11-04 04:38:34 +00:00
committed by Automerger Merge Worker

View File

@@ -71,6 +71,7 @@ import android.text.TextUtils;
import android.util.ArrayMap; import android.util.ArrayMap;
import android.util.ArraySet; import android.util.ArraySet;
import android.util.AtomicFile; import android.util.AtomicFile;
import android.util.EventLog;
import android.util.Slog; import android.util.Slog;
import android.util.SparseArray; import android.util.SparseArray;
@@ -81,7 +82,6 @@ import com.android.server.FgThread;
import com.android.server.LocalServices; import com.android.server.LocalServices;
import com.android.server.SystemConfig; import com.android.server.SystemConfig;
import com.android.server.SystemService; import com.android.server.SystemService;
import com.android.server.pm.UserManagerService; import com.android.server.pm.UserManagerService;
import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.AndroidPackage;
@@ -285,6 +285,12 @@ public final class OverlayManagerService extends SystemService {
restoreSettings(); restoreSettings();
// Wipe all shell overlays on boot, to recover from a potentially broken device
String shellPkgName = TextUtils.emptyIfNull(
getContext().getString(android.R.string.config_systemShell));
mSettings.removeIf(overlayInfo -> overlayInfo.isFabricated
&& shellPkgName.equals(overlayInfo.packageName));
initIfNeeded(); initIfNeeded();
onSwitchUser(UserHandle.USER_SYSTEM); onSwitchUser(UserHandle.USER_SYSTEM);
@@ -891,6 +897,16 @@ public final class OverlayManagerService extends SystemService {
throw new IllegalArgumentException(request.typeToString() throw new IllegalArgumentException(request.typeToString()
+ " unsupported for user " + request.userId); + " unsupported for user " + request.userId);
} }
// Normal apps are blocked from accessing OMS via SELinux, so to block non-root,
// non privileged callers, a simple check against the shell UID is sufficient, since
// that's the only exception from the other categories. This is enough while OMS
// is not a public API, but this will have to be changed if it's ever exposed.
if (callingUid == Process.SHELL_UID) {
EventLog.writeEvent(0x534e4554, "202768292", -1, "");
throw new IllegalArgumentException("Non-root shell cannot fabricate overlays");
}
realUserId = UserHandle.USER_ALL; realUserId = UserHandle.USER_ALL;
// Enforce that the calling process can only register and unregister fabricated // Enforce that the calling process can only register and unregister fabricated