Introducción al SO de los móviles

De Training B Wiki
Salta a la navegació Salta a la cerca


El SO de Android

Android se desarrollo en 2003 por Android Inc, el objetivo era desarrollar un sistema operativo para cámaras. La idea inicial no era crear un SO de móviles, sino más bien crear un SO para dispositivos electrónicos de carácter más general. En 2003, Andy Rubin, Rich Miner, Nick Sear y Chris White empezaron a desarrollar un sistema operativo avanzado y escalable para diversos operativos.

Pero a medida que avanzo el proyecto, fueron conscienctes del potencial que tenía su tecnologia y decidieron expandir su enfoque hacia los dispositivos móviles, que por aquel entonces, solo había alguna versión de Windows mobile, o las propias BlackBerrys. Así que en 2004, cambió la dirección del proyecto y se entregaron por completo a los móviles. En 2005, Google adquirió la empresa y basó el núcleo del sistema en Linux.

La migración a Linux fué un paso crucial y estratégico en el desarrollod e Android:

  • Código abierto y licencia GPL: Asumiendo Linux como el núcleo de Android, se asumía la política de código fuente accesible y disponible para cualquier persona, ya que Linux es GPL y obliga a todos sus derivados a ser también de código libre.
  • Estabilidad y Rendimiento: Android heredó la estabilidad y rendimiento de Linux, era la base sólia sobre la que se construiria todo el sistema operativo.
  • Compabilitat de Hardware: Asumiendo el núcleo de Linux, Android mejoraba su compatibilidad con los hardwares del mercado, y eso ayudó a los fabricantes a generar nuevos modelos usando como base a Android.
  • Comunidad de desarrolladores: La comunidad de desarrolladores que podía contribuir al proyecto aumento exponencialmente.
  • Comandos y aplicacions de Linux: Android ahora podía disponer de un conjunto de scripts, herramientas y utilidades ya existentes en Linux.

Para competir con Apple, en 2007 Google fundó la Open Handset Alliance, una alianza de varios fabricantes de hardware para promover Android como un sistema operativo de código abierto, permitiendo el soporte de aplicaciones de terceros. El primer teléfono móvil lanzado con este sistema fue el T-Mobile G1, que salió al mercado un año después del primer iPhone, en octubre de 2008. No fue hasta 2012 que todos los fabricantes combinados lograron convertir a Android en el sistema operativo móvil con más dispositivos.

Como resultado, la filosofía de Android, aunque comparte ciertas similitudes con iOS, es estructuralmente diferente. Android está concebido como un sistema abierto, brindando gran libertad a los integradores y a las compañías que lo utilizan para ofrecer servicios de manera más flexible a los usuarios.

Este último punto es, al mismo tiempo, una ventaja crucial, ya que existe una amplia diversidad de dispositivos y sistemas que utilizan el sistema operativo. Esto evita el "Vendor Lock-in" presente en Apple. Sin embargo, al mismo tiempo, cada fabricante tiene sus diferencias, lo que hace más difícil uniformizar el sistema de manera general.

Estructura interna y por capas del sistema operativo Android

Android, como sistema operativo, está diseñado con una arquitectura de capas que permite una organización modular y eficiente de sus componentes. La estructura interna de Android se puede entender mediante sus capas, que van desde el hardware hasta las aplicaciones de usuario. A continuación, se describen las capas principales del sistema operativo Android:

Estructura interna de las capas del SO de Android
Estructura interna de las capas del SO de Android


  1. Kernel de Linux: En la capa más baja se encuentra el kernel de Linux. Este proporciona servicios esenciales como gestión de memoria, manejo de procesos, manejo de dispositivos y controladores de hardware. El kernel actúa como interfaz entre el hardware y el resto del sistema operativo.
  2. Abstracción del Hardware (HAL): És la primera capa específica del sistema Android e interacciona con el Hardware propio del dispositivo móvil.
  3. Librerías de Android: Sobre el kernel, se encuentran las librerías de Android, que proporcionan funciones esenciales para el desarrollo de aplicaciones. Estas librerías incluyen la implementación de funciones fundamentales como manipulación de datos, gráficos, acceso a la red y gestión de archivos. Están escritas principalmente en C y C++.
  4. Android Runtime (ART): ART es responsable de la ejecución de las aplicaciones Android. Con la compilación AOT, las aplicaciones se traducen en código nativo durante la instalación, lo que mejora la eficiencia y el rendimiento en comparación con la ejecución JIT (Just-In-Time) utilizada por Dalvik. A más, ART proporciona un entorno de ejecución controlado y un nivel de abstracción entre aplicaciones y hardware.
  5. JAVA API Framework: En esta capa se encuentra el framework de aplicaciones, que proporciona las API y los servicios esenciales para el desarrollo de aplicaciones Android. Esto incluye la gestión de la interfaz de usuario, la administración de recursos, la conectividad de red, la gestión de datos y otros servicios esenciales. El framework está compuesto por módulos como Activity Manager, Content Providers, View System, etc.
  6. Aplicaciones de Sistema y usuario: Este nivel incluye aplicaciones esenciales del sistema que proporcionan funcionalidades básicas, como la aplicación de teléfono, contactos, mensajes, entre otras. Estas aplicaciones son parte integral del sistema y, en algunos casos, son específicas del fabricante. A más, incorpora las aplicaciones que los usuarios instalan desde Google Play u otras fuentes. Estas aplicaciones aprovechan las API proporcionadas por el framework para ofrecer una amplia variedad de funciones y servicios.

La estructura por capas de Android permite una clara separación de responsabilidades y facilita la flexibilidad y la escalabilidad del sistema operativo, así como el desarrollo de aplicaciones de terceros.

Las particiones y el sistema de ficheros en Android

El esquema de particiones de Android

Las particiones del SO de Android son las divisiones físicas del almacenamiento interno de nuestro dispositivo. Cada partición tendrá su propósito específico, con sus directorios específicos, aunque pueden haber variaciones entre dispositivos Android. Las principales particiones son:

  1. Partición raíz(/): Es la partición principal en el sistema de archivos de Android. Contiene los directorios y archivos fundamentales necesarios para el funcionamiento del sistema.
  2. Boot Partition (/boot): Esta partición contiene los archivos necesarios para iniciar el sistema operativo Android. Incluye el kernel del sistema, que es esencial para iniciar el dispositivo.
  3. System Partition (/system): Aquí se encuentran los archivos del sistema operativo Android, como el código del sistema, las bibliotecas compartidas y las aplicaciones del sistema. Esta partición suele estar montada como de solo lectura (read-only) para garantizar la estabilidad y seguridad del sistema.
  4. Recovery Partition (/recovery): Es una partición de Android, contiene el mínimo entorno de ejecución para la recuperación del sistema. Se puede utilizar para su mantenimiento, la instalación de actualizaciones de sistema o el restablecimiento de fábrica.
  5. Data Partition (/data): Esta partición almacena los datos de usuario, incluyendo las aplicaciones instaladas, configuraciones, y otros datos específicos del usuario. A diferencia de la partición del sistema, esta partición suele ser de lectura/escritura.
  6. Cache Partition (/cache): La partición de caché almacena datos temporales utilizados por el sistema operativo y algunas aplicaciones. Limpiar la caché a veces puede resolver problemas de rendimiento.
  7. Vendor Partition (/vendor): En algunos dispositivos, esta partición contiene archivos específicos del fabricante o del proveedor de servicios. Puede incluir controladores de hardware, configuraciones personalizadas y otros archivos relacionados con el firmware del dispositivo.
  8. Sdcard o Data Media Partition (/sdcard o /mnt/sdcard): Esta partición representa el almacenamiento externo del dispositivo, ya sea una tarjeta SD o el almacenamiento interno. Aquí es donde se almacenan archivos multimedia, descargas y otros datos del usuario.
  9. **Metadata Partition (/metadata): Algunos dispositivos pueden tener una partición de metadatos que almacena información específica sobre la configuración del dispositivo, el firmware y otros detalles importantes.

El sistema de ficheros de Android

El sistema de ficheros de Android parte también del kernel de Linux. Pero como pasa con Linux, nos podemos encontrar con diferencias entre versiones. Aún así, los principales directorios son:

  1. Root (/): Es la raíz del sistema sistema de archivos y se encuentran los directorios principales, como "system", "data", "proc", y otros. La partición raíz generalmente está montada de solo lectura (read-only) para garantizar la integridad del sistema.
  2. /system: Este directorio contiene los archivos del sistema operativo Android, incluyendo la interfaz de usuario, bibliotecas compartidas, binarios y otros componentes esenciales.
  3. /data: Es donde se almacenan los datos de las aplicaciones y los usuarios. Este directorio es de lectura/escritura y contiene subdirectorios como "data/app" (para las aplicaciones instaladas), "data/data" (datos específicos de las aplicaciones), y otros.
  4. /cache: Este directorio almacena datos temporales utilizados por el sistema operativo y algunas aplicaciones. Puede contener archivos temporales, cachés de aplicaciones y otros datos que pueden eliminarse sin afectar el funcionamiento general del sistema.
  5. /sdcard o /mnt/sdcard: Este directorio (o enlaces simbólicos) suele representar el almacenamiento externo, como una tarjeta SD.. Aquí es donde se almacenan los archivos multimedia, descargas y otros datos del usuario.
  6. /proc: Este directorio virtual proporciona información en tiempo real sobre el estado del sistema, procesos en ejecución, o configuración del kernel. Contiene información que el kernel del sistema genera dinámicamente.
  7. /dev: Este directorio contiene archivos especiales que representan dispositivos de hardware en el sistema. Por ejemplo, /dev/sda puede representar un disco duro.
  8. /mnt: Este directorio se utiliza para montar otros sistemas de archivos, como sistemas de archivos de red o dispositivos de almacenamiento extraíbles.
  9. /system/vendor: En algunos dispositivos, este directorio almacena archivos específicos del fabricante o del proveedor de servicios, como controladores y configuraciones personalizadas.
  10. /system/bin y /system/xbin: Contienen binarios ejecutables utilizados por el sistema y las aplicaciones.
  11. /sbin: Contiene binarios del sistema que son esenciales para el inicio del sistema. Este directorio suele estar reservado para el usuario root.

La relación entre las particiones y los directorios

En el siguiente esquema se muestra la relación existente entre las particiones físicas y los principales directorios de Android.

+-----------------------------------------------------------------------------+
|                                 Raíz (/)                                    |
|                                                                             |
|  +---------------------+  +---------------------+  +---------------------+  |
|  |  /system (ext4)     |  |  /data (ext4)       |  |  /cache (ext4)      |  |
|  |                     |  |                     |  |                     |  |
|  |  - app              |  |  - app              |  |  - app              |  |
|  |  - bin              |  |  - dalvik-cache     |  |  - app-private      |  |
|  |  - etc              |  |  - data             |  |  - data             |  |
|  |  - framework        |  |  - misc             |  |  - system           |  |
|  |  - lib              |  |  - user             |  |  - lost+found       |  |
|  |  - priv-app         |  |  - system           |  |                     |  |
|  +---------------------+  +---------------------+  +---------------------+  |
|                                                                             |
|  +---------------------+  +---------------------+  +---------------------+  |
|  |  /boot (ext4)       |  |  /recovery (ext4)   |  |  /vendor (ext4)     |  |
|  |                     |  |                     |  |                     |  |
|  |  - kernel           |  |  - etc              |  |  - bin              |  |
|  |  - ramdisk          |  |  - recovery         |  |  - etc              |  |
|  |                     |  |                     |  |  - lib              |  |
|  +---------------------+  +---------------------+  +---------------------+  |
|                                                                             |
|  +---------------------+  +---------------------+  +---------------------+  |
|  |  /sdcard (exFAT,    |  | /mnt/sdcard         |  |  /metadata (FAT32,  |  |
|  |   FAT32, etc.)      |  |  (exFAT, FAT32, etc)|  |   exFAT, FAT32, etc)|  |
|  |                     |  |                     |  |                     |  |
|  |  - DCIM             |  |  - Alarms           |  |  - metadata         |  |
|  |  - Music            |  |  - Download         |  |                     |  |
|  |  - Pictures         |  |  - Movies           |  +---------------------+  |
|  |                     |  |  - Music            |                           |
|  +---------------------+  +---------------------+                           |
+-----------------------------------------------------------------------------+

Seguridad en Android

La seguridad en los dispositivos Android es fundamental, fijaros la de recursos que tenemos para defender nuestros dispositivos tipo PC, mientras que parece que con Android no tenemos los mismos. Y esto contrasta con la información privilegiada y el acceso a aplicaciones importantes que tenemos en nuestro móvil. Para securizar nuestro dispositivo, Android implementa diversas medidas de seguridad en favor de la integridad del sistema y la privacidad del usuario. Las más importantes son:

Modelo de Permisos

El modelo de permisos de Android es un sistema que regula el acceso que las aplicaciones tienen a diferentes recursos y funciones del dispositivo. Este modelo es esencial para garantizar la privacidad y seguridad de los usuarios al limitar el alcance de las acciones que una aplicación puede realizar sin el consentimiento explícito del usuario.

Principios básicos del sistema de permisos de Android

Los permisos están basados en un conjunto de principios básicos que regulan su uso:

  1. Consentimiento del Usuario: Antes de que una aplicación pueda acceder a ciertos recursos o realizar ciertas acciones, debe obtener el consentimiento del usuario. Este consentimiento se solicita durante la instalación de la aplicación y puede ser revocado posteriormente en la configuración del sistema.
  2. División en Categorías: Los permisos se dividen en categorías que representan áreas específicas de funcionalidad o acceso. Algunas categorías comunes incluyen "Cámara", "Ubicación", "Contactos", o "Almacenamiento".
  3. Permisos de Tiempo de Ejecución: A partir de Android 6.0 (Marshmallow), se introdujo el concepto de permisos de tiempo de ejecución. Esto significa que algunas categorías de permisos, como la ubicación y el acceso a archivos, se solicitan cuando la aplicación intenta acceder a esos recursos durante la ejecución, no solo durante la instalación.
  4. Normal Permissions y Dangerous Permissions: Hay dos tipos principales de permisos: normales y peligrosos. Los 'Normals', son concedidos automáticamente durante la instalación de la aplicación (por ejemplo: el uso de Internet o el efecto de vibrar), mientras que los 'dangerous' requieren el consentimiento explícito del usuario durante su ejecución/instalación y pueden incluir acceso a datos sensibles o funciones del sistema (por ejemplo: el uso de la cámara, la localización o la grabadora de audio).

La gestión de los permisos para los desarrolladores

  1. Solicitud de Permisos: Las aplicaciones deben declarar los permisos que necesitan en su archivo del manifest. Tanto los permisos normales, como con los peligrosos, deben ser solicitados explícitamente.
  2. Solicitudes en Tiempo de Ejecución: Para permisos dangerous, como acceso a la cámara o ubicación, la aplicación debe solicitarlos al usuario durante el tiempo de ejecución, cuando se realiza la acción que requiere el permiso. La solicitud debe mostrar un diálogo explicando por qué la aplicación necesita de ese permisos. El usuario debe tener la posibilidad de denegar la solicitud.
  3. Gestión en Configuración: Los usuarios pueden revisar y gestionar los permisos de las aplicaciones en la configuración del dispositivo en cualquier momento. Se debe poder revocar o conceder permisos a aplicaciones de forma individual.

Las categorías de permisos en Android

Los permisos en Android se dividen en diversas categorías según la función que desarrollen o el recurso del cual hagan uso. De esta forma, podemos otorgar permisos por categorías y simplificar su administración. Las principales categorías son:

  1. Calendar
  2. Camera
  3. Contacts
  4. Location
  5. Microphone
  6. Phone
  7. Sensors
  8. SMS
  9. Storage
  10. Internet
  11. Bluetooth
  12. NFC
  13. Body sensors

La gestión de los permisos por parte de los usuarios

El sistema de permisos es básico para mantener el dispositivo Android securizado. Debemos concienciar a los usuarios con las siguientes recomendaciones: - El usuario debe revisar los permisos solicitados por una aplicación antes de instalarla. - El usuario debe ser cauteloso al otorgar permisos peligrosos y debe entender por qué una aplicación los necesita. - El usuario debe revisar y ajustar los permisos de las aplicaciones en la configuración del dispositivo según sea necesario.

El modelo de permisos de Android es una parte esencial del sistema operativo que equilibra la funcionalidad de las aplicaciones con la protección de la privacidad del usuario. La transparencia en las solicitudes de permisos y la capacidad de gestión otorgan a los usuarios un mayor control sobre la seguridad de sus dispositivos.

Sandboxing y el aislamiento de las aplicaciones

Una de las preocupaciones de Android es la de proteger las aplicaciones entre si, evitar que una aplicación pueda afectar al resto e afectarla negativamente.

Para ello se usa el sandboxing y se aíslan las aplicaciones, de esta forma se consigue que las aplicaciones se ejecuten en entornos controlados y no haya interferencias.

Ambas técnicas mejoran la seguridad de nuestro dispositivo y evitan que las vulnerabilidades de una aplicación afecten a recursos críticos y al sistema operativo.

Sandboxing

El sandboxing es cuando ejecutamos una aplicación en un entorno virtual aislado. Se usa también para comprobar la seguridad de una aplicación antes de importarla a producción. La virtualización permite limitar las acciones y recursos a los que puede acceder.

Para ello, cada aplicación se ejecuta con sus propios procesos de sistemas, su espacio de memoria privada y sus recursos preasignados.

Además, esta abstracción permite restringir el acceso de las aplicaciones a ciertos recursos del sistema, como los archivos de configuración del sistema operativo.

Aislamiento de las aplicaciones

El aislamiento de las aplicaciones es la separación de los datos y procesos de la aplicación del resto del sistema. Cada aplicación tiene su propio directorio de datos y almacenamiento privado donde guardar sus archivos y configuraciones.

De esta forma, la aplicación solo puede acceder a su directorio, parecido a una jail, la aplicación es incapaz de poder ver más allá. Y en caso de necesitar algún recurso del SO, este se hará a través de los permisos y desde la virtualización HAL, evitando así la interacción directa con el recurso.

En conclusión, el sandboxing y el aislamiento de aplicaciones son elementos cruciales del diseño de seguridad de Android. Estas prácticas contribuyen a un entorno de ejecución seguro y controlado, permitiendo a los usuarios disfrutar de la diversidad de aplicaciones sin comprometer la integridad del sistema.

Actualizaciones de Seguridad

Google ofrece actualizaciones de seguridad mensuales para abordar vulnerabilidades conocidas en el sistema operativo. Sin embargo, la implementación de estas actualizaciones puede variar según el fabricante y el operador del dispositivo, lo que ha llevado a problemas de fragmentación en el ecosistema Android.

Las actualizaciones de seguridad en Android son clave para abordar y corregir vulnerabilidades, mejorar la seguridad del sistema operativo y proteger a los usuarios contra posibles amenazas.

Es tarea del administrador IT de una organización que todos sus dispositivos estén actualizados. Para ello es importante entender algunos aspectos básicos:

  1. Ciclo de Publicación de Actualizaciones de Seguridad: Google publica de forma mensual actualizaciones de seguridad, éstas son enviadas a los fabricantes de dispositivos Android y publicadas en el proyecto de código abierto Android Open Source Project (AOSP).
  2. Contenido de las Actualizaciones de Seguridad: Las actualizaciones incluyen 'parches de seguridad para securizar los dispositivos de las vulnerabilidades aparecidas y subsanadas, y además, también pueden incorporar mejoras generales de seguridad para mitigar riesgos potenciales.
  3. Distribución de Actualizaciones: La fragmentación de los dispositivos Android, los operadores de red y la región configurada en el dispositivo, puede afectar a la disponibilidad de las actualizaciones.
  4. Período de soporte para actualizaciones de seguridad: Cada fabricante ofrece un período de soporte para la actualización de sus dispositivos, el cual puede variar también según modelo. Existen actualizaciones generales de Android y actualizaciones de seguridad de Android. Es completamente inseguro usar un móvil fuera del período de soporte de seguridad. En muchos casos, el soporte no se define según años, si no por versiones de Android. Uno de los móviles con un período más grande es Google Pixel 8, con 7 años de soporte.
  5. Android Enterprise Recommended: Programa de dispositivos recomendados de Google que destaca dispositivos que cumplen con estándares específicos de actualizaciones de seguridad y rendimiento. La mayoría de dispositivos móviles que conocemos están en la lista.

El cifrado de Datos

Android permite el cifrado de datos de todo el sistema de ficheros o de un archivo en concreto. El cifrado nos permite que solo los usuarios que conocen la contraseña puedan acceder a nuestros archivos.

Full-Disk Encription

Es la encriptación de todo nuestro dispositivo. En el momento de arranque nos pedirá una contraseña, PIN o patrón de desbloqueo para su arranque.

La clave de cifrado es necesaria para poder desencriptar nuestro dispositivo y permite mantener la confidencialidad de nuestros datos en caso de extravío del dispositivo móvil.

Permanentemente, la clave se usa para poder encriptar y desencriptar los datos durante su lectura y escritura. Es decir, internamente todo está encriptado, y en caso que el dispositivo entre en reposo, va a requerir de nuevo la clave para poder desencriptar y arrancar de nuevo.

File-Based Encryption

Es la encriptación de un archivo en concreto. No se encripta toda la partición, si no solo el fichero en cuestión. El usuario podrá crear una contraseña específica o usar sus propias credenciales del sistema para su encriptación.

La principal ventaja es que al ser un sistema de encriptación independiente de todo el sistema operativo, podemos encriptar según sea el usuario, permitiendo que dos usuarios compartan el mismo dispositivo y con claves de encriptación diferenciadas.

Google Play Protect

Es un servicio de seguridad creado por Google el cual escena de forma continua nuestras aplicaciones para identificar posibles amenazas en nuestro dispositivo. En caso de detectar actividad maliciosa, es capaz de deshabilitar la aplicación y alertar al usuario.

Además, ofrece protección antiphising, es capaz de desinstalar una aplicación de los dispositivos de forma remota, proporciona seguridad durante la navegación por web, y es el encargado de informado sobre la gestión de los permisos de una aplicación antes de instalarla.

Secure Boot y Autenticación Biométrica

El inicio seguro y la autenticación biométrica son componentes clave de la seguridad en Android, diseñados para proteger el acceso al dispositivo y a los datos almacenados en él.

Secure Boot

Son los procesos de securización que realiza el sistema operativo durante el arranque del dispositivo. Par ello, se verifica la firma digital de todos los componentes (hardware y software) para comprobar que no se hayan alterado por código malicioso. Similar a la UEFI de un PC.

Todos los componentes de arranque tienen un hash único que les identifica, si la firma obtenida en el arranque no coincide con la última firma "legal", se envía una señal al usuario para advertirle que el sistema operativo podría estar corrupto.

Los archivos, o mecanismos, del proceso de arranque están fuera de la encriptación, son los encargados de hacer funcionar el dispositivo, de aquí su vulnerabilidad. Después del arranque, el usuario ya podrá introducir la clave en caso de que haya encriptado su dispositivo.

Administradores de Dispositivos y "Find My Device"

  - Los administradores de dispositivos permiten a los usuarios rastrear, bloquear o borrar remotamente sus dispositivos en caso de pérdida o robo.
  - La función "Find My Device" facilita la ubicación y gestión de dispositivos Android perdidos.

Red Privada Virtual (VPN) y Seguridad en la Red

  - Android admite la configuración de VPN para garantizar conexiones seguras a través de redes públicas.
  - Se implementan protocolos de seguridad en las conexiones de red para proteger la información transmitida.

Seguridad en el Navegador y Protección contra Phishing

  - Los navegadores en Android incluyen características de seguridad, como la protección contra phishing, que alertan a los usuarios sobre posibles sitios web maliciosos.

Aunque Android implementa diversas medidas de seguridad, los usuarios también desempeñan un papel crucial al tomar decisiones informadas, como instalar aplicaciones solo desde fuentes confiables, mantener actualizado el software y ser conscientes de los permisos otorgados a las aplicaciones. La seguridad en Android es un esfuerzo continuo, y tanto los desarrolladores como los usuarios desempeñan un papel importante en mantener un entorno seguro.