Blog

Seguridad en Android – Parte I – Android y su arquitectura

Vamos a comenzar una serie de post sobre seguridad en Android. En primer lugar, vamos a ver los conceptos básicos de Android así como su arquitectura.

Android es un sistema operativo móvil basado en Linux. El SDK de Android proporciona herramientas para desarrollar aplicaciones utilizando el lenguaje de programación Java. Originalmente, Android fue desarrollado por una startup del mismo nombre que, en 2005, compró Google. Cualquiera es capaz de utilizar Android descargando su código completo.

Android tiene una gran ventaja y es que es de código de abierto. No obstante, esto permite introducir una mayor cantidad de malware comparada con otros sistemas operativos de código cerrado.

La arquitectura de Android está divida en capas como se puede observar en la siguiente imagen:

arquitectura

 A continuación vamos a ver en detalle cada una de las capas:

  • Linux Kernel. El kernel de linux ha sido utilizado durante mucho tiempo como un sistema operativo multi-usuario seguro, aislando un usuario del resto. Android utiliza esta propiedad como una plataforma multiusuario donde un usuario es una aplicación y cada aplicación está aislada del resto. El kernel de linux gestiona los drivers de los dispositivos como el bluetooth, la cámara, etc. A su vez, el kernel posee un mecanismo para realizar RPC seguros.
    Cada aplicación instalada en el dispositivo, posee un único UID (User Identification) y un único GID (Group Identification). El UID es el id de la aplicación durante el tiempo que esté instalada en el dispositivo.
  • Middleware. Por encima del kernel de linux se encuentra el middleware que proporciona las librerías para el código de ejecución (libSSL, libc, OpenGl, etc). Esta capa también proporciona el entorno de ejecución para aplicaciones Java.
    Una cuestión importante es: ¿posee Android una máquina virtual de Java para ejecutar las aplicaciones? La respuesta es no. Un fichero java (JAR) no se ejecuta en Android. Lo que proporciona Android es una máquina virtual Dalvik. De esta forma, Android llama a una herramienta llamada dx para convertir código de bytes a ejecutables Dalvik (DEX).
  • Máquina virtual Dalvik. Permite ejecutar aplicaciones programadas en Java. No afirma ser una máquina virtual de java pero cumple ese propósito. Dalvik permite crear aplicaciones con un mejor rendimiento y un menor consumo de energía, características importantísimas en dispositivos móviles.
    Está optimizada para requerir poca memoria y está diseñada para permitir ejecutar varias instancias de la máquina virtual simultáneamente.
  • Capa de aplicación. Incluye interfaces de programación de aplicaciones (APIs) utilizados en las aplicaciones centrales. A su vez, proporciona aplicaciones como un cliente de correo.

Por último vamos a ver cómo es la estructura de una aplicación Android ya que es muy importante para no poner en riesgo la seguridad de nuestro dispositivo.

Cada aplicación es creada como una pila de componentes. Lo bueno de esta estructura es que cada componente es una entidad auto-contenida y puede ser llamada exclusivamente incluso por otra aplicación. Esto permite la compartición de componentes.

La siguiente figura muestra la anatomía de una aplicación Android:

arqApk

Android soporta cuatro tipos de componentes:

  • Activity. Normalmente es parte de la interfaz de usuario de la aplicación. Es el componente que interacciona con el usuario. Un ejemplo seria el componente de login de una pantalla.
  • Service. Este componente gestiona los procesos que corren en background. No tiene interfaz de usuario. Un ejemplo sería un componente que sincroniza el reproductor de música con las canciones preseleccionadas por el usuario.
  • Broadcast Receiver. Es la bandeja de entrada donde se reciben los mensajes del sistema Android o de otras aplicaciones. Como ejemplo, Android lanza un Intent llamado BOOT_COMPLETED después de encenderse.
  • Content Provider. Este componente es el almacén de datos de la aplicación. La aplicación también puede compartir sus datos con otros componentes de Android. Un ejemplo sería una lista de deseos de una tienda online.

Todos estos componentes están declarados en el AndroidManifest.xml (manifiesto). A su vez, el archivo de manifiesto lista otros requerimientos de aplicación como el mínimo nivel de API requerido, permisos de usuarios, permisos para usar hardware, etc. Más adelante comentaremos estos ficheros a fondo ya que son muy importantes para gestionar de forma correcta la seguridad en los dispositivos Android.

Todos los componentes se comunican entre ellos usando Intents. Los Intents son mecanismos de Android para comunicación asíncrona entre procesos. Hay mecanismos diferenciados para enviar los Intents a cada tipo de componente. Es importante entender que los Intents no son seguros. Cualquier aplicación puede esnifar el Intent por lo que no es recomendable poner información sensible en ellos. Y por supuesto, no solo pueden ser esnifados si no que pueden ser alterados por un software malicioso.

En la capa de aplicación, los componentes de Android siguen el modelo basado en permisos. Esto significa que un componente debe de tener los permisos adecuados para llamar a otros componentes.

Esto es todo por el momento. En los siguientes posts iremos profundizando en los problemas de seguridad en Android, tanto de forma teórica como de forma práctica.

Autor:  Borja Simancas (@borjasr92)

  1. monumentos
    monumentos02-25-2014

    Este es grande artículo. Felicidades de nuevo.

  2. Borja
    Borja02-25-2014

    Muchas gracias! Espero que los siguientes artículos de la serie os sigan gustando.

  3. Maurizio
    Maurizio05-17-2014

    Enhorabuena un grwn post. Saludo.

Leave a Reply

*

    No Twitter Messages