¿Por qué el proveedor de contenido sin permisos y exportado = true es accesible para cualquier aplicación?

Aquí hay una prueba que corrí para entender los permisos de Android Content Provider:

App ProviderApp manifest:

<provider android:authorities="com.mycompany.myProviderApp" android:name="com.mycompany.myProviderApp.ContentProviderForMyOtherApps" android:exported="true"/> 

También implementé un dummy ContentProvider ( ContentProviderForMyOtherApps ) con un método de query básica que devuelve una cadena en ProviderApp :

 public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { String[] cols = {"column1"}; MatrixCursor cursor = new MatrixCursor(cols); MatrixCursor.RowBuilder builder = cursor.newRow(); builder.add("HELLO!"); return cursor; } 

Código de App ClientApp :

 Cursor cursor = getContentResolver().query(Uri.parse("content://com.mycompany.myProviderApp"),null,null,null,null); cursor.moveToFirst(); Log.d(TAG, cursor.getString(0)); // output: HELLO! 

Bueno, así que todo funciona bien, ClientApp accede al proveedor con éxito.

Pero mi comprensión de la documentación, basada en los extractos siguientes, es que ClientApp debería haber sido negado el acceso al proveedor, porque:

  • ProviderApp manifiesto no tiene android:readPermission dentro del provider (por ejemplo, com.mycompany.myProviderApp.READ )
  • El manifiesto de ClientApp no tiene uses-permission correspondientes (por ejemplo, com.mycompany.myProviderApp.READ )

Extractos de la documentación:

Si la aplicación de un proveedor no especifica ningún permiso, otras aplicaciones no tienen acceso a los datos del proveedor.

Https://developer.android.com/guide/topics/providers/content-provider-basics.html#Permissions

Androide: exportado

Si el proveedor de contenido está disponible para otras aplicaciones para usar: true: El proveedor está disponible para otras aplicaciones. Cualquier aplicación puede usar el URI de contenido del proveedor para acceder a él, sujeto a los permisos especificados para el proveedor.

Https://developer.android.com/guide/topics/manifest/provider-element.html

¿Por qué este código (proveedor y cliente que declaran NO permisos) realmente funciona?

(¿Qué he perdido en la documentación?)

La documentación tiene un error. Esta:

Si la aplicación de un proveedor no especifica ningún permiso, otras aplicaciones no tienen acceso a los datos del proveedor.

Debe leerse como:

Si la aplicación de un proveedor no especifica ningún permiso, el acceso de otras aplicaciones a los datos del proveedor se determina únicamente por el valor android:exported ( true concede acceso ilimitado a todas las aplicaciones, el acceso a bloques false por otras aplicaciones) y android:grantUriPermissions value (Que se complica).

IMHO, esa sección entera tiene que ser reescrito. Pero, con respecto a su prueba, un proveedor sin permisos exportado está abierto, con cualquier aplicación capaz de leer y escribir con impunidad.

  • Android M detecta si el cuadro de diálogo de permisos está visible
  • ¿Por qué mi BroadcastReceive causa una denegación READ_PRIVILEGED_PHONE_STATE en M?
  • ¿Qué permisos se pueden conceder a los dispositivos enraizados?
  • Obtener detalles del permiso mediante programación
  • ¿Pueden solicitar permisos sincrónicamente en el modelo de permisos de ejecución de Android Marshmallow (API 23)?
  • ¿Cuándo debo usar el permiso ACCESS_COARSE_LOCATION?
  • Reproductor de música preguntando para escribir permiso de almacenamiento externo?
  • Borrar los permisos permitidos en Android M
  • Negación de permisos de Android 6.0: requiere permiso android.permission.WRITE_SETTINGS
  • ¿Qué pasará con aplicaciones que no se actualizan y que ejecutan código que requiere un permiso que el usuario desautorizado en Android 6.0 Marshmallow
  • Implementación del permiso de Marshmallow
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.