Como se indica aquí:
Las interacciones entre usuarios están bloqueadas usando el GID everybody
.
Android reserva UIDs / GIDs que van desde 10000
hasta 19999
para aplicaciones. AID_EVERYBODY
es uno de los grupos especiales, que se utiliza para controlar la capacidad de lectura / escritura de la aplicación en el almacenamiento externo (/sdcard
). Este grupo tiene GID 9997 para el propietario del dispositivo. Si hay perfiles o múltiples usuarios, el GID toma la forma de XX09997
, donde XX
es UserID. Así que u11_everybody
se resuelve a UID 1109997
y u11_a500
a 1110500
.
A partir de Android 6, cada aplicación tiene su propia vista de /sdcard
, que está controlada exponiendo /data/media/[UserID]
con diferentes permisos. Esto se logra utilizando un sistema de archivos emulado (anteriormente FUSE
, ahora sdcardfs
) y espacios de nombres de montaje. Para el propietario del dispositivo es decir, UserId 0
, /sdcard
aparece con las siguientes tres VISTAS de conjuntos de permisos:
- Para procesos en ejecución en el espacio de nombres de montaje root como
init
, netd
, vold
, etc., los permisos aparecen como 0.1015
, 0771
.
- Para procesos que tienen
android.permission.READ_EXTERNAL_STORAGE
, los permisos aparecen como 0.9997
, 0750
.
- Para procesos que tienen
android.permission.WRITE_EXTERNAL_STORAGE
, los permisos aparecen como 0.9997
, 0770
.
La captura de pantalla muestra tres VISTAS
emuladas con diferentes valores de gid
y máscara
para obtener diferentes conjuntos de permisos: * Los archivos nunca tienen permiso de ejecución es decir, máscara=6
se convierte en máscara=7
para archivos.
* máscara=23
aparece incorrecto, ¿puede ser un error? En realidad es máscara=27
.
Teniendo en cuenta las tres distintas VISTAS
, llegamos a cuatro situaciones:
- Los procesos que se ejecutan como root, es decir, UID
0
, siempre tienen acceso de lectura/escritura a /sdcard
. Sin embargo, si un proceso no privilegiado que se ejecuta en el espacio de nombres de montaje root desea acceso de lectura/escritura a /sdcard
, eso sería controlado por el grupo AID_SDCARD_RW (GID 1015
). Un ejemplo es el daemon de ADB que se ejecuta con UID / GID 2000
pero 1015
en sus grupos suplementarios.
Dado que cada aplicación se ejecuta con su UID único en un espacio de nombres de montaje separado:
- Las aplicaciones sin permisos
READ/WRITE_EXTERNAL_STORAGE
no podrán leer ni escribir en /sdcard
.
Dado que cada aplicación es miembro del grupo everybody (9997)
:
- Las aplicaciones con permiso
READ_EXTERNAL_STORAGE
podrán leer el /sdcard
.
- Las aplicaciones con permiso
WRITE_EXTERNAL_STORAGE
podrán escribir en /sdcard
. Por lo tanto, la aplicación tiene acceso completo de lectura/escritura al Almacenamiento Público
compartido / externo, incluido el Almacenamiento Privado
de otras aplicaciones.
Hay una excepción a las reglas anteriores para aplicaciones; cada aplicación siempre tiene acceso de lectura/escritura a su propio Almacenamiento Privado Externo. Tomemos como ejemplo la aplicación com.xyz
con UID 10500
. Además del directorio de datos interno /data/data/com.xyz
, la aplicación tiene un directorio de Almacenamiento Privado
/sdcard/Android/data/com.xyz
con UID propietario 10500
. Por lo tanto, este directorio siempre es legible / escribible por la aplicación.
Tenga en cuenta que /sdcard/Android/data
es accesible para todas las aplicaciones, pero sin acceso de lectura/escritura.
De la misma manera funciona para otras cuentas de usuario / perfiles.
Paquetes Binarios Opacos: (OBB)
Algunas aplicaciones necesitan almacenamiento adicional para guardar archivos grandes que no se pueden incluir en el archivo .apk
debido al límite máximo de tamaño de 100MB. Hay dos posibles ubicaciones de obb
donde se guardan estos archivos: /data/media/obb/
y /sdcard/Android/obb/
. El primero fue introducido antes del concepto de múltiples usuarios, por lo que solo está disponible para el propietario del dispositivo. El segundo está disponible para aplicaciones en cuentas de usuario múltiples / perfiles también.
El acceso al primero se controla de la misma manera que al /sdcard
, mientras que el segundo siempre es accesible por una aplicación, al igual que el almacenamiento externo privado.
RELACIONADO: