From 0749dcd19301fe4093f9cf8677c722d17bceabfb Mon Sep 17 00:00:00 2001 From: Christopher Tate Date: Thu, 13 Aug 2009 15:13:03 -0700 Subject: [PATCH] Backup participants must now hold the BACKUP_DATA permission Packages that do not use android.permission.BACKUP_DATA will neither be backed up nor restored. That permission is currently signature-only. In the future if access to the backup/restore infrastructure is made available to arbitrary 3rd party applications, the permission checks (and indeed, the permission itself) can simply be removed. --- core/res/AndroidManifest.xml | 7 ++++++ core/res/res/values/strings.xml | 5 ++++ packages/SettingsProvider/AndroidManifest.xml | 2 ++ .../android/server/BackupManagerService.java | 23 +++++++++++++++++-- tests/backup/AndroidManifest.xml | 1 + 5 files changed, 36 insertions(+), 2 deletions(-) diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index cf85af53592d5..d55f188eb53cc 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -1046,6 +1046,13 @@ android:description="@string/permdesc_backup" android:protectionLevel="signatureOrSystem" /> + + + Allows the application to control the system's backup and restore mechanism. Not for use by normal applications. + + back up and restore the application's data + + Allows the application to participate in the system's backup and restore mechanism. + display unauthorized windows diff --git a/packages/SettingsProvider/AndroidManifest.xml b/packages/SettingsProvider/AndroidManifest.xml index d84572b2715a6..af0a1bdd5f656 100644 --- a/packages/SettingsProvider/AndroidManifest.xml +++ b/packages/SettingsProvider/AndroidManifest.xml @@ -2,6 +2,8 @@ package="com.android.providers.settings" android:sharedUserId="android.uid.system"> + + packages = mPackageManager.getInstalledPackages(flags); int N = packages.size(); for (int a = N-1; a >= 0; a--) { - ApplicationInfo app = packages.get(a).applicationInfo; + PackageInfo pkg = packages.get(a); + ApplicationInfo app = pkg.applicationInfo; if (((app.flags&ApplicationInfo.FLAG_ALLOW_BACKUP) == 0) - || app.backupAgentName == null) { + || app.backupAgentName == null + || (mPackageManager.checkPermission(android.Manifest.permission.BACKUP_DATA, + pkg.packageName) != PackageManager.PERMISSION_GRANTED)) { packages.remove(a); } } @@ -899,6 +903,15 @@ class BackupManagerService extends IBackupManager.Stub { for (BackupRequest request : mQueue) { Log.d(TAG, "starting agent for backup of " + request); + // Don't run backup, even if requested, if the target app does not have + // the requisite permission + if (mPackageManager.checkPermission(android.Manifest.permission.BACKUP_DATA, + request.appInfo.packageName) != PackageManager.PERMISSION_GRANTED) { + Log.w(TAG, "Skipping backup of unprivileged package " + + request.appInfo.packageName); + continue; + } + IBackupAgent agent = null; int mode = (request.fullBackup) ? IApplicationThread.BACKUP_MODE_FULL @@ -1287,6 +1300,12 @@ class BackupManagerService extends IBackupManager.Stub { if (DEBUG) Log.d(TAG, "processOneRestore packageName=" + packageName); + // Don't restore to unprivileged packages + if (mPackageManager.checkPermission(android.Manifest.permission.BACKUP_DATA, + packageName) != PackageManager.PERMISSION_GRANTED) { + Log.d(TAG, "Skipping restore of unprivileged package " + packageName); + } + // !!! TODO: get the dirs from the transport File backupDataName = new File(mDataDir, packageName + ".restore"); File newStateName = new File(mStateDir, packageName + ".new"); diff --git a/tests/backup/AndroidManifest.xml b/tests/backup/AndroidManifest.xml index 3778742e105ed..d992627de6091 100644 --- a/tests/backup/AndroidManifest.xml +++ b/tests/backup/AndroidManifest.xml @@ -1,5 +1,6 @@ +