Merge "Limit stage install to system and whitelisted packges only (2/2)" into rvc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
cde07e5dc5
@@ -55,4 +55,6 @@ interface IPackageInstaller {
|
|||||||
in IntentSender statusReceiver, int userId, in List<String> whiteListedPermissions);
|
in IntentSender statusReceiver, int userId, in List<String> whiteListedPermissions);
|
||||||
|
|
||||||
void setPermissionsResult(int sessionId, boolean accepted);
|
void setPermissionsResult(int sessionId, boolean accepted);
|
||||||
|
|
||||||
|
void bypassNextStagedInstallerCheck(boolean value);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -82,6 +82,7 @@ import com.android.internal.util.ImageUtils;
|
|||||||
import com.android.internal.util.IndentingPrintWriter;
|
import com.android.internal.util.IndentingPrintWriter;
|
||||||
import com.android.server.IoThread;
|
import com.android.server.IoThread;
|
||||||
import com.android.server.LocalServices;
|
import com.android.server.LocalServices;
|
||||||
|
import com.android.server.SystemConfig;
|
||||||
import com.android.server.pm.parsing.PackageParser2;
|
import com.android.server.pm.parsing.PackageParser2;
|
||||||
import com.android.server.pm.permission.PermissionManagerServiceInternal;
|
import com.android.server.pm.permission.PermissionManagerServiceInternal;
|
||||||
|
|
||||||
@@ -151,6 +152,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
|
|||||||
private final Callbacks mCallbacks;
|
private final Callbacks mCallbacks;
|
||||||
|
|
||||||
private volatile boolean mOkToSendBroadcasts = false;
|
private volatile boolean mOkToSendBroadcasts = false;
|
||||||
|
private volatile boolean mBypassNextStagedInstallerCheck = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* File storing persisted {@link #mSessions} metadata.
|
* File storing persisted {@link #mSessions} metadata.
|
||||||
@@ -541,7 +543,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Build.IS_DEBUGGABLE || isDowngradeAllowedForCaller(callingUid)) {
|
if (Build.IS_DEBUGGABLE || isCalledBySystemOrShell(callingUid)) {
|
||||||
params.installFlags |= PackageManager.INSTALL_ALLOW_DOWNGRADE;
|
params.installFlags |= PackageManager.INSTALL_ALLOW_DOWNGRADE;
|
||||||
} else {
|
} else {
|
||||||
params.installFlags &= ~PackageManager.INSTALL_ALLOW_DOWNGRADE;
|
params.installFlags &= ~PackageManager.INSTALL_ALLOW_DOWNGRADE;
|
||||||
@@ -571,6 +573,14 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mBypassNextStagedInstallerCheck) {
|
||||||
|
mBypassNextStagedInstallerCheck = false;
|
||||||
|
} else if (params.isStaged
|
||||||
|
&& !isCalledBySystemOrShell(callingUid)
|
||||||
|
&& !isWhitelistedStagedInstaller(requestedInstallerPackageName)) {
|
||||||
|
throw new SecurityException("Installer not allowed to commit staged install");
|
||||||
|
}
|
||||||
|
|
||||||
if (!params.isMultiPackage) {
|
if (!params.isMultiPackage) {
|
||||||
// Only system components can circumvent runtime permissions when installing.
|
// Only system components can circumvent runtime permissions when installing.
|
||||||
if ((params.installFlags & PackageManager.INSTALL_GRANT_RUNTIME_PERMISSIONS) != 0
|
if ((params.installFlags & PackageManager.INSTALL_GRANT_RUNTIME_PERMISSIONS) != 0
|
||||||
@@ -683,11 +693,15 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
|
|||||||
return sessionId;
|
return sessionId;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isDowngradeAllowedForCaller(int callingUid) {
|
private boolean isCalledBySystemOrShell(int callingUid) {
|
||||||
return callingUid == Process.SYSTEM_UID || callingUid == Process.ROOT_UID
|
return callingUid == Process.SYSTEM_UID || callingUid == Process.ROOT_UID
|
||||||
|| callingUid == Process.SHELL_UID;
|
|| callingUid == Process.SHELL_UID;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isWhitelistedStagedInstaller(String installerName) {
|
||||||
|
return SystemConfig.getInstance().getWhitelistedStagedInstallers().contains(installerName);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateSessionAppIcon(int sessionId, Bitmap appIcon) {
|
public void updateSessionAppIcon(int sessionId, Bitmap appIcon) {
|
||||||
synchronized (mSessions) {
|
synchronized (mSessions) {
|
||||||
@@ -963,6 +977,11 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void bypassNextStagedInstallerCheck(boolean value) {
|
||||||
|
mBypassNextStagedInstallerCheck = value;
|
||||||
|
}
|
||||||
|
|
||||||
private static int getSessionCount(SparseArray<PackageInstallerSession> sessions,
|
private static int getSessionCount(SparseArray<PackageInstallerSession> sessions,
|
||||||
int installerUid) {
|
int installerUid) {
|
||||||
int count = 0;
|
int count = 0;
|
||||||
|
|||||||
@@ -297,6 +297,8 @@ class PackageManagerShellCommand extends ShellCommand {
|
|||||||
return runGetModuleInfo();
|
return runGetModuleInfo();
|
||||||
case "log-visibility":
|
case "log-visibility":
|
||||||
return runLogVisibility();
|
return runLogVisibility();
|
||||||
|
case "bypass-staged-installer-check":
|
||||||
|
return runBypassStagedInstallerCheck();
|
||||||
default: {
|
default: {
|
||||||
String nextArg = getNextArg();
|
String nextArg = getNextArg();
|
||||||
if (nextArg == null) {
|
if (nextArg == null) {
|
||||||
@@ -392,6 +394,20 @@ class PackageManagerShellCommand extends ShellCommand {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private int runBypassStagedInstallerCheck() {
|
||||||
|
final PrintWriter pw = getOutPrintWriter();
|
||||||
|
try {
|
||||||
|
mInterface.getPackageInstaller()
|
||||||
|
.bypassNextStagedInstallerCheck(Boolean.parseBoolean(getNextArg()));
|
||||||
|
return 0;
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
pw.println("Failure ["
|
||||||
|
+ e.getClass().getName() + " - "
|
||||||
|
+ e.getMessage() + "]");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private int uninstallSystemUpdates() {
|
private int uninstallSystemUpdates() {
|
||||||
final PrintWriter pw = getOutPrintWriter();
|
final PrintWriter pw = getOutPrintWriter();
|
||||||
List<String> failedUninstalls = new LinkedList<>();
|
List<String> failedUninstalls = new LinkedList<>();
|
||||||
|
|||||||
Reference in New Issue
Block a user