¿Existen las mismas restricciones para JavaScript en Android Chrome que en Windows?
Las aplicaciones en Android ya están contenidas en múltiples sandboxes, ya sea un navegador web o alguna otra aplicación. Existe el robusto Control de Acceso Discrecional del kernel de Linux ( DAC ); UIDs / GIDs / modos, complementados por el Control de Acceso Obligatorio ( MAC ); SELinux. La máquina virtual Java de cada aplicación (el proceso nativo) se ejecuta con su propio y único UID y contexto SELinux. Android también hace uso de Linux espacios de nombres , capacidades y seccomp . Ver Sandbox de aplicaciones .
Además, Android tiene su propio marco de control de permisos. El acceso a los recursos del sistema, los dispositivos y los sistemas de archivos se rige por una larga lista de permisos manifiestos como el almacenamiento, la cámara, los contactos, etc., que tienen diferentes niveles de protección . Ver Permisos .
Así que cualquier otra restricción puesta en el código interno de las aplicaciones (como en JS) no proporciona ninguna mejora significativa en Android.
De su comentario:
Pero si todas las aplicaciones de Android son sandboxed entonces cómo puede una persona subir un archivo a un sitio web.
Se consigue a través de la aplicación de Android almacenamiento externo compartido al que sólo pueden acceder las aplicaciones si el usuario da su permiso.
En resumen, si concedo permiso de almacenamiento al navegador X y abro una aplicación web Y en ese navegador, ¿significa eso que Y también puede acceder a mis medios, archivos, etc.?
Definitivamente sí. No hay ninguna restricción por parte del sistema operativo. Una aplicación web se ejecuta dentro de un navegador web. Un navegador web es una aplicación Android ordinaria. Cuando una aplicación Android se inicia, se bifurca un proceso UNIX nativo que está sujeto a todas las restricciones DAC, MAC y otras a nivel del kernel. Una aplicación web que se ejecuta en el mismo proceso nativo no es una entidad separada. Desde el punto de vista del sistema operativo, todo el proceso nativo es una sola unidad. Así que las mismas restricciones se aplican a todo el código en ese proceso, ya sea escrito en Java, JS, C, Python, o cualquier otro lenguaje.
Dejando de lado el JavaScript, ¿hay alguna otra forma de que cualquier PWA o aplicación web o sitio web vea el contenido de mi almacenamiento interno sin mi permiso?
Bien, primero tenemos que definir mi y almacenamiento interno .
El DAC en los sistemas operativos de escritorio (al menos en Windows y Linux) es diferente al de Android. En los sistemas operativos de escritorio los archivos pertenecen a los usuarios humanos. Así que cuando se dice mis archivos Esto significa que a todos ellos se les asigna un identificador (UID/GID) que representa a un usuario humano. Y todos los programas ejecutados por un usuario humano también se ejecutan con el mismo UID, por lo que pueden acceder a los archivos de los demás. Es por eso que las restricciones adicionales (como la mejora de JS en Chrome, como usted mencionó, y el uso de Firefox de los espacios de nombres de Linux, etc.) se ponen en los programas, en particular los que interactúan con Internet, por ejemplo, los navegadores web. Compruebe también firejail .
Pero en Android, son las aplicaciones las que están aisladas entre sí, no los usuarios humanos. Cada aplicación tiene asignado un UID/GID único y los archivos pertenecen a las aplicaciones. Para más detalles, véase mi respuesta a ¿Los usuarios múltiples están protegidos entre sí de forma diferente a las aplicaciones? .
En cuanto al almacenamiento, Android almacena las configuraciones, las aplicaciones y los datos en una partición montada en /data
que no es accesible sin rootear ( ¿Por qué se necesitan permisos de superusuario para acceder a la partición /data? ). Las aplicaciones tienen su almacenamiento privado (en /data/data/
) que no es accesible para ninguna otra aplicación porque cada directorio de la aplicación tiene su propio UID/GID que pertenece a su aplicación propietaria (así es como funciona el DAC).
Para compartir archivos entre aplicaciones, Android proporciona un sistema sin permisos emulado sistema de archivos llamado almacenamiento externo compartido . Es un almacenamiento físicamente interno ( /data/media
) accesible en /sdcard/
( principal ), o adicionalmente puede ser una tarjeta SD físicamente externa ( secundario ). El almacenamiento compartido externo contiene directorios privados que pertenecen a aplicaciones individuales. Estos directorios están disponibles para las aplicaciones sin requerir ningún permiso. El resto de los directorios públicos sólo son accesibles para las aplicaciones a las que se les ha concedido Permiso de almacenamiento ( READ_EXTERNAL_STORAGE
y WRITE_EXTERNAL_STORAGE
) por parte del usuario.
Sin embargo, el acceso a nivel de sistema de archivos a todo el /sdcard
está muy obsoleto en Android 10 y 11 debido a su amplia naturaleza. Ahora hay MediaStore y Marco de acceso al almacenamiento (SAF) que proporcionan a las aplicaciones incluso un acceso limitado a los archivos del almacenamiento compartido externo. Para más detalles ver mis respuestas a ¿Dónde almacenan los datos las aplicaciones de Android? , El viaje de almacenamiento de Android y ¿Qué es el UID "u#_everybody"? .
Así que:
- Acceso a los archivos creados/descargados por una aplicación en su almacenamiento privado o directorios privados en el almacenamiento externo nunca está restringido.
- Acceso a los archivos de otras aplicaciones en almacenamiento privado nunca es posible.
- Acceso a los archivos en almacenamiento público externo o almacenamiento externo privado de otras aplicaciones está sujeta a los permisos concedidos a la aplicación por el usuario.