Iterate on storage permissions model.

This change updates the permissions design to use app-ops for
controlling write access, which is only extended to the default app
for a particular collection type.

Bug: 119713234
Test: atest android.appsecurity.cts.PermissionsHostTest
Test: atest android.appsecurity.cts.ExternalStorageHostTest
Test: atest cts/tests/tests/provider/src/android/provider/cts/MediaStore*
Change-Id: I40811ff175b3b8410b58ed901948a23a56f8a8c2
This commit is contained in:
Jeff Sharkey
2018-11-18 17:53:02 -07:00
parent 0430c3ceef
commit 9787a9459d
8 changed files with 45 additions and 62 deletions

View File

@@ -159,9 +159,6 @@ package android {
field public static final java.lang.String WRITE_CONTACTS = "android.permission.WRITE_CONTACTS";
field public static final deprecated java.lang.String WRITE_EXTERNAL_STORAGE = "android.permission.WRITE_EXTERNAL_STORAGE";
field public static final java.lang.String WRITE_GSERVICES = "android.permission.WRITE_GSERVICES";
field public static final java.lang.String WRITE_MEDIA_AUDIO = "android.permission.WRITE_MEDIA_AUDIO";
field public static final java.lang.String WRITE_MEDIA_IMAGES = "android.permission.WRITE_MEDIA_IMAGES";
field public static final java.lang.String WRITE_MEDIA_VIDEO = "android.permission.WRITE_MEDIA_VIDEO";
field public static final java.lang.String WRITE_SECURE_SETTINGS = "android.permission.WRITE_SECURE_SETTINGS";
field public static final java.lang.String WRITE_SETTINGS = "android.permission.WRITE_SETTINGS";
field public static final java.lang.String WRITE_SYNC_SETTINGS = "android.permission.WRITE_SYNC_SETTINGS";

View File

@@ -1180,11 +1180,11 @@ public class AppOpsManager {
Manifest.permission.ACTIVITY_RECOGNITION,
Manifest.permission.SMS_FINANCIAL_TRANSACTIONS,
Manifest.permission.READ_MEDIA_AUDIO,
Manifest.permission.WRITE_MEDIA_AUDIO,
null, // no permission for OP_WRITE_MEDIA_AUDIO
Manifest.permission.READ_MEDIA_VIDEO,
Manifest.permission.WRITE_MEDIA_VIDEO,
null, // no permission for OP_WRITE_MEDIA_VIDEO
Manifest.permission.READ_MEDIA_IMAGES,
Manifest.permission.WRITE_MEDIA_IMAGES,
null, // no permission for OP_WRITE_MEDIA_IMAGES
};
/**
@@ -1462,11 +1462,11 @@ public class AppOpsManager {
AppOpsManager.MODE_ALLOWED, // ACTIVITY_RECOGNITION
AppOpsManager.MODE_DEFAULT, // SMS_FINANCIAL_TRANSACTIONS
AppOpsManager.MODE_ALLOWED, // READ_MEDIA_AUDIO
AppOpsManager.MODE_ALLOWED, // WRITE_MEDIA_AUDIO
AppOpsManager.MODE_ERRORED, // WRITE_MEDIA_AUDIO
AppOpsManager.MODE_ALLOWED, // READ_MEDIA_VIDEO
AppOpsManager.MODE_ALLOWED, // WRITE_MEDIA_VIDEO
AppOpsManager.MODE_ERRORED, // WRITE_MEDIA_VIDEO
AppOpsManager.MODE_ALLOWED, // READ_MEDIA_IMAGES
AppOpsManager.MODE_ALLOWED, // WRITE_MEDIA_IMAGES
AppOpsManager.MODE_ERRORED, // WRITE_MEDIA_IMAGES
};
/**

View File

@@ -2532,55 +2532,33 @@ public class PackageParser {
final ArraySet<String> newPermissions = new ArraySet<>();
newPermissions.add(android.Manifest.permission.READ_MEDIA_AUDIO);
newPermissions.add(android.Manifest.permission.WRITE_MEDIA_AUDIO);
newPermissions.add(android.Manifest.permission.READ_MEDIA_VIDEO);
newPermissions.add(android.Manifest.permission.WRITE_MEDIA_VIDEO);
newPermissions.add(android.Manifest.permission.READ_MEDIA_IMAGES);
newPermissions.add(android.Manifest.permission.WRITE_MEDIA_IMAGES);
newPermissions.add(android.Manifest.permission.ACCESS_MEDIA_LOCATION);
newPermissions.add(android.Manifest.permission.WRITE_OBB);
final ArraySet<String> dangerousPermissions = new ArraySet<>();
dangerousPermissions.add(android.Manifest.permission.READ_EXTERNAL_STORAGE);
dangerousPermissions.add(android.Manifest.permission.WRITE_EXTERNAL_STORAGE);
final ArraySet<String> removedPermissions = new ArraySet<>();
removedPermissions.add(android.Manifest.permission.READ_EXTERNAL_STORAGE);
removedPermissions.add(android.Manifest.permission.WRITE_EXTERNAL_STORAGE);
for (int i = pkg.permissions.size() - 1; i >= 0; i--) {
final Permission p = pkg.permissions.get(i);
if (newPermissions.contains(p.info.name)) {
pkg.permissions.remove(i);
} else if (dangerousPermissions.contains(p.info.name)) {
p.info.protectionLevel &= ~PermissionInfo.PROTECTION_MASK_BASE;
p.info.protectionLevel |= PermissionInfo.PROTECTION_DANGEROUS;
} else if (removedPermissions.contains(p.info.name)) {
p.info.flags &= ~PermissionInfo.FLAG_REMOVED;
}
}
}
} else {
if (FORCE_AUDIO_PACKAGES.contains(pkg.packageName)) {
pkg.requestedPermissions.add(android.Manifest.permission.READ_MEDIA_AUDIO);
pkg.requestedPermissions.add(android.Manifest.permission.WRITE_MEDIA_AUDIO);
}
if (FORCE_VIDEO_PACKAGES.contains(pkg.packageName)) {
pkg.requestedPermissions.add(android.Manifest.permission.READ_MEDIA_VIDEO);
pkg.requestedPermissions.add(android.Manifest.permission.WRITE_MEDIA_VIDEO);
}
if (FORCE_IMAGES_PACKAGES.contains(pkg.packageName)) {
pkg.requestedPermissions.add(android.Manifest.permission.READ_MEDIA_IMAGES);
pkg.requestedPermissions.add(android.Manifest.permission.WRITE_MEDIA_IMAGES);
}
if (SystemProperties.getBoolean(StorageManager.PROP_FORCE_LEGACY, false)) {
if (pkg.requestedPermissions
.contains(android.Manifest.permission.READ_EXTERNAL_STORAGE)) {
pkg.requestedPermissions.add(android.Manifest.permission.READ_MEDIA_AUDIO);
pkg.requestedPermissions.add(android.Manifest.permission.READ_MEDIA_VIDEO);
pkg.requestedPermissions.add(android.Manifest.permission.READ_MEDIA_IMAGES);
}
if (pkg.requestedPermissions
.contains(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
pkg.requestedPermissions.add(android.Manifest.permission.WRITE_MEDIA_AUDIO);
pkg.requestedPermissions.add(android.Manifest.permission.WRITE_MEDIA_VIDEO);
pkg.requestedPermissions.add(android.Manifest.permission.WRITE_MEDIA_IMAGES);
}
}
}

View File

@@ -137,8 +137,6 @@ public class StorageManager {
public static final String PROP_FORCE_VIDEO = "persist.fw.force_video";
/** {@hide} */
public static final String PROP_FORCE_IMAGES = "persist.fw.force_images";
/** {@hide} */
public static final String PROP_FORCE_LEGACY = "persist.fw.force_legacy";
/** {@hide} */
public static final String UUID_PRIVATE_INTERNAL = null;

View File

@@ -25,6 +25,7 @@ import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Environment;
import android.os.Process;
import android.os.SystemProperties;
import android.os.storage.StorageManager;
import android.permission.PermissionManager.SplitPermissionInfo;
import android.text.TextUtils;
@@ -930,6 +931,16 @@ public class SystemConfig {
XmlUtils.skipCurrentTag(parser);
}
}
// If the storage model feature flag is disabled, we need to fiddle
// around with permission definitions to return us to pre-Q behavior.
// STOPSHIP(b/112545973): remove once feature enabled by default
if (!SystemProperties.getBoolean(StorageManager.PROP_ISOLATED_STORAGE, false)) {
if (newPermissions.contains(android.Manifest.permission.READ_MEDIA_AUDIO) ||
newPermissions.contains(android.Manifest.permission.READ_MEDIA_VIDEO) ||
newPermissions.contains(android.Manifest.permission.READ_MEDIA_IMAGES)) {
return;
}
}
if (!newPermissions.isEmpty()) {
mSplitPermissions.add(new SplitPermissionInfo(splitPerm, newPermissions, targetSdk));
}

View File

@@ -794,7 +794,8 @@
<permission android:name="android.permission.READ_EXTERNAL_STORAGE"
android:label="@string/permlab_sdcardRead"
android:description="@string/permdesc_sdcardRead"
android:protectionLevel="normal" />
android:protectionLevel="dangerous"
android:permissionFlags="removed" />
<!-- Allows an application to write to external storage.
<p class="note"><strong>Note:</strong> If <em>both</em> your <a
@@ -814,7 +815,8 @@
<permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:label="@string/permlab_sdcardWrite"
android:description="@string/permdesc_sdcardWrite"
android:protectionLevel="normal" />
android:protectionLevel="dangerous"
android:permissionFlags="removed" />
<!-- Runtime permission controlling access to the user's shared aural media
collection. -->
@@ -831,12 +833,6 @@
android:description="@string/permdesc_audioRead"
android:protectionLevel="dangerous" />
<!-- Allows an application to modify the user's shared audio collection. -->
<permission android:name="android.permission.WRITE_MEDIA_AUDIO"
android:label="@string/permlab_audioWrite"
android:description="@string/permdesc_audioWrite"
android:protectionLevel="dangerous" />
<!-- Runtime permission controlling access to the user's shared visual media
collection, including images and videos. -->
<permission-group android:name="android.permission-group.MEDIA_VISUAL"
@@ -852,24 +848,12 @@
android:description="@string/permdesc_imagesRead"
android:protectionLevel="dangerous" />
<!-- Allows an application to modify the user's shared images collection. -->
<permission android:name="android.permission.WRITE_MEDIA_IMAGES"
android:label="@string/permlab_imagesWrite"
android:description="@string/permdesc_imagesWrite"
android:protectionLevel="dangerous" />
<!-- Allows an application to read the user's shared video collection. -->
<permission android:name="android.permission.READ_MEDIA_VIDEO"
android:label="@string/permlab_videoRead"
android:description="@string/permdesc_videoRead"
android:protectionLevel="dangerous" />
<!-- Allows an application to modify the user's shared video collection. -->
<permission android:name="android.permission.WRITE_MEDIA_VIDEO"
android:label="@string/permlab_videoWrite"
android:description="@string/permdesc_videoWrite"
android:protectionLevel="dangerous" />
<!-- Allows an application to access any geographic locations persisted in the
user's shared collection. -->
<permission android:name="android.permission.ACCESS_MEDIA_LOCATION"

View File

@@ -201,6 +201,24 @@
<new-permission name="android.permission.ACCESS_BACKGROUND_LOCATION" />
</split-permission>
<!-- Apps holding either the legacy READ or WRITE permissions will inherit
the ability to <em>read</em> new typed permissions in the Q release; they
won't gain the ability to <em>write</em> that content. -->
<!-- STOPSHIP(b/112545973): change targetSdk to Q when SDK version finalised -->
<split-permission name="android.permission.READ_EXTERNAL_STORAGE"
targetSdk="10000">
<new-permission name="android.permission.READ_MEDIA_AUDIO" />
<new-permission name="android.permission.READ_MEDIA_VIDEO" />
<new-permission name="android.permission.READ_MEDIA_IMAGES" />
</split-permission>
<!-- STOPSHIP(b/112545973): change targetSdk to Q when SDK version finalised -->
<split-permission name="android.permission.WRITE_EXTERNAL_STORAGE"
targetSdk="10000">
<new-permission name="android.permission.READ_MEDIA_AUDIO" />
<new-permission name="android.permission.READ_MEDIA_VIDEO" />
<new-permission name="android.permission.READ_MEDIA_IMAGES" />
</split-permission>
<!-- This is a list of all the libraries available for application
code to link against. -->

View File

@@ -195,7 +195,6 @@ public final class DefaultPermissionGrantPolicy {
// STOPSHIP(b/112545973): remove once feature enabled by default
if (SystemProperties.getBoolean(StorageManager.PROP_ISOLATED_STORAGE, false)) {
MEDIA_AURAL_PERMISSIONS.add(Manifest.permission.READ_MEDIA_AUDIO);
MEDIA_AURAL_PERMISSIONS.add(Manifest.permission.WRITE_MEDIA_AUDIO);
}
}
@@ -203,10 +202,8 @@ public final class DefaultPermissionGrantPolicy {
static {
// STOPSHIP(b/112545973): remove once feature enabled by default
if (SystemProperties.getBoolean(StorageManager.PROP_ISOLATED_STORAGE, false)) {
MEDIA_VISUAL_PERMISSIONS.add(Manifest.permission.READ_MEDIA_IMAGES);
MEDIA_VISUAL_PERMISSIONS.add(Manifest.permission.WRITE_MEDIA_IMAGES);
MEDIA_VISUAL_PERMISSIONS.add(Manifest.permission.READ_MEDIA_VIDEO);
MEDIA_VISUAL_PERMISSIONS.add(Manifest.permission.WRITE_MEDIA_VIDEO);
MEDIA_VISUAL_PERMISSIONS.add(Manifest.permission.READ_MEDIA_IMAGES);
}
}