Cuando se habla del desarrollo de aplicaciones para dispositivos móviles es necesario tener en cuenta una serie de puntos acerca de la plataforma con el objetivo de garantizar la seguridad. Android es un sistema operativo para smartphones que contiene aplicaciones.
Por defecto el sistema viene instalado con un conjunto de aplicaciones básicas como lo son el teléfono, correo, agenda de contactos y algunas más. Sin embargo cuando un desarrollador quiere crear su propia aplicación para esta plataforma debe seguir una serie de buenas prácticas al utilizar las API de Android y el SDK provisto por Google.
Las aplicaciones para esta plataforma se encuentran desarrolladas en Java y se ejecutan dentro de una máquina virtual, y para ser instalada en el sistema se distribuyen como archivos con extensión APK. Estas aplicaciones pueden estar disponibles en el Android Market publicadas por su desarrollador o en otros repositorios de aplicaciones no oficiales.
Android se encuentra basado en Linux, incluyendo además, sus propios mecanismos de seguridad adaptados para los smartphones. De esta manera el sistema operativo logra combinar una serie de funcionalidades como memoria compartida, multitarea, identificadores de usuarios (UIDs), permisos de archivo, Java y toda su conocida estructura. El resultado de estas combinaciones lo convierte un sistema multiusuario, donde cada aplicación se ejecuta en un proceso separado bajo un UID diferente y con sus propios permisos.
Parte del modelo de seguridad de Android basado en estas características genera que un programa no pueda escribir el código o los datos de otra aplicación. En el caso que dos aplicaciones deseen compartir información dicha interacción debe ser explícita a través de distintos componentes del sistema:
- Activity: permiten iniciar llamadas a distintos componentes del sistema, permiten la interacción con el usuario.
- Service: permiten el procesamiento en segundo plano, suelen ser utilizados para el control de aplicaciones, recursos del sistema.
- Content Provider: es una interfaz estandarizada para compartir datos o información entre la misma aplicación o con otra.
- Broadcast Receiver: es una interfaz para recibir eventos (Intents) asociados a determinadas acciones. Por ejemplo la recepción de un mensaje de texto.
El componente con el cual se realiza la comunciación puede estar en la misma aplicación o pertenecer a otra. Dicha interacción es a través de los Intents. Un Intent es un objeto utilizado para la señalización entre componentes, permite iniciar la interfaz de usuario de una aplicación, enviar un mensaje entre componentes o iniciar un servicio en segundo plano. Además cada aplicación de Android contiene un archivo con nombre AndroidManifest.xml que contiene:
- los componentes contenidos en la aplicación
- reglas de acceso
- dependencia de las rutinas
- permisos del sistema necesarios
Como Android se centra en ICC (Inter Component Communication, en español, Comunicación entre Componentes) el manifiesto de Android le permite a los desarrolladores permitir una política de control y acceso a sus componentes. Como existen algunas excepciones, a continuación compartimos con ustedes una serie de buenas practicas para los desarrolladores de Android:
- Definir atributos de privacidad (“exported”): esto se debe a que los componentes pueden ser públicos o privados. Si no se define correctamente esta política los componentes de la aplicación podrían ser accedidos por una aplicación ajena.
- Definir permisos de acceso para todos los componentes: esto se debe a que si el acceso no se encuentra definido mediante una llamada remota al componente, una aplicación podría conectarse a un recurso para el cual no tiene acceso. Por ejemplo la ejecución remota de código que permita leer el contenido de la tarjeta SD.
- Siempre especificar los permisos de acceso a los Intent Broadcast: si no se define una etiqueta de permisos al emitir un Broadcast, cualquier aplicación podría leerlo.
- Definir de manera separada los permisos de lectura y escritura: El intercambio de contenidos no tiene por qué ser todo o nada, según el recurso se pueden definir permisos de manera separada, garantizando la integridad y confidencialidad de la información.
- Seleccionar los permisos de la aplicación con criterio: cada uno de los permisos solicitados en el Android Manifest para los componentes de la aplicación deben ser los mínimos necesarios para su funcionamiento. De otra manera se abre la puerta a la utilización de los componentes para fines maliciosos.
- Proteger la información confidencial: Al almacenar información sensible del usuario o de sus contactos siempre es recomendable que se encuentre cifrada incluso si se va a almacenar dentro de una base de datos en el dispositivo.
- Definir los permisos de acceso al sistema de archivo: como Android se encuentra basado en Linux es posible definir permisos a nivel de archivo dentro del sistema de archivos evitando que una aplicación bajo un disinto UID acceda a ellos.
- Cifrar la comunicación: cuando una aplicación envía información a una dirección URL intenta cifrar los datos, ya que si la comunicación es bajo HTTP y se envían las contraseñas en texto plano podrían ser interceptadas por un atacante.
La política de permisos de Android que se puede definir en el Android Manifest es bastante clara y específica. Sin embargo se le debe prestar especial atención ya que una mala definición de permisos podría permitirle a una aplicación maliciosa acceder a información sensible del usuario. Cualquier proceso de desarrollo de software el proceso de testing es de suma importancia, además de garantizar un correcto funcionamiento se debe tener en cuenta la seguridad. Como desarrollador de aplicaciones no solo es necesario que la aplicación funcione correctamente sino que además le garantice al usuario la seguridad de su información.
Pablo Ramos, Especialista en Awareness & Research ESET