summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorakirilov <akirilov@google.com>2018-10-16 14:52:05 -0700
committerandroid-build-team Robot <android-build-team-robot@google.com>2018-11-15 18:20:04 +0000
commitab39f6cb7afc48584da3c59d8e2a5e1ef121aafb (patch)
treef5ee6e23b4a3e056465becb618ea2deed380742a /src
parent419c6b327562afc9af3bed5e92741e5bf190ec30 (diff)
downloadandroid_packages_apps_PackageInstaller-ab39f6cb7afc48584da3c59d8e2a5e1ef121aafb.tar.gz
android_packages_apps_PackageInstaller-ab39f6cb7afc48584da3c59d8e2a5e1ef121aafb.tar.bz2
android_packages_apps_PackageInstaller-ab39f6cb7afc48584da3c59d8e2a5e1ef121aafb.zip
RESTRICT AUTOMERGE: Trust session id only if started with ACTION_CONFIRM_INSTALL
InstallStart was reading sessionInfo whenever the starting intent had the extra EXTRA_SESSION_ID. This could happen even if an external app inserted a valid session id into its own REQUEST_INSTALL_PACKAGE intent. This allows apps to potentially spoof the calling package. Test: Existing tests pass: atest GtsPackageInstallTestCases GtsNoPermissionTestCases \ GtsNoPermissionTestCases25 Bug: 112031362 Change-Id: Icdab1deeaf6b0afe7a61709cd87305336c467e33 (cherry picked from commit 8af3d62da1a56d8cc3e7c915516cbc4ce8642099)
Diffstat (limited to 'src')
-rw-r--r--src/com/android/packageinstaller/InstallStart.java9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/com/android/packageinstaller/InstallStart.java b/src/com/android/packageinstaller/InstallStart.java
index d06b6f55..42927373 100644
--- a/src/com/android/packageinstaller/InstallStart.java
+++ b/src/com/android/packageinstaller/InstallStart.java
@@ -58,9 +58,14 @@ public class InstallStart extends Activity {
Intent intent = getIntent();
String callingPackage = getCallingPackage();
+ final boolean isSessionInstall =
+ PackageInstaller.ACTION_CONFIRM_PERMISSIONS.equals(intent.getAction());
+
// If the activity was started via a PackageInstaller session, we retrieve the calling
// package from that session
- int sessionId = intent.getIntExtra(PackageInstaller.EXTRA_SESSION_ID, -1);
+ final int sessionId = (isSessionInstall
+ ? intent.getIntExtra(PackageInstaller.EXTRA_SESSION_ID, -1)
+ : -1);
if (callingPackage == null && sessionId != -1) {
PackageInstaller packageInstaller = getPackageManager().getPackageInstaller();
PackageInstaller.SessionInfo sessionInfo = packageInstaller.getSessionInfo(sessionId);
@@ -103,7 +108,7 @@ public class InstallStart extends Activity {
nextActivity.putExtra(PackageInstallerActivity.EXTRA_ORIGINAL_SOURCE_INFO, sourceInfo);
nextActivity.putExtra(Intent.EXTRA_ORIGINATING_UID, originatingUid);
- if (PackageInstaller.ACTION_CONFIRM_PERMISSIONS.equals(intent.getAction())) {
+ if (isSessionInstall) {
nextActivity.setClass(this, PackageInstallerActivity.class);
} else {
Uri packageUri = intent.getData();