Seguridad y Protección de Datos en Android Juan Heguiabehere Joaquín Rinaudo 22 o Escuela de Verano de Ciencias Informáticas RIO 2015
Sobre el curso Lunes: Android como plataforma de desarrollo - Malware Martes: Malware (cont) - Diseño seguro en aplicaciones Jueves: Búsqueda de vulnerabilidades - Análisis estático Viernes: Búsqueda de vulnerabilidades - Análisis dinámico
Sobre el curso Lunes: Android como plataforma de desarrollo Arquitectura de Android Kernel de Linux Bibliotecas nativas Java - Dalvik VM Android SDK - Clases nativas Modelo de seguridad de Android Aplicaciones Android Herramientas de desarrollo Malware Martes: Malware (cont) - Diseño seguro en aplicaciones Jueves: Búsqueda de vulnerabilidades - Análisis estático Viernes: Búsqueda de vulnerabilidades - Análisis dinámico
Contenidos Sobre el curso Arquitectura de Android Componentes de Android Kernel de Linux Zygote Runtime Componentes nativos de userspace Modelo de Seguridad de Android Sandbox Permisos Problema: Cómo llegan las actualizaciones Aplicaciones Android Componentes de una aplicación Android Actividades Servicios Receptores de notificaciones Generando un paquete de Android Herramientas
Arquitectura de Android
Arquitectura de Android Cinco componentes principales: Kernel de Linux Código nativo de userspace Ambiente Android (bibliotecas/servicios escritos en Java) Máquina virtual Dalvik / ART Aplicaciones Android (escritas en Java)
Componentes de Android Fuente: A. Gorla, Static and Dynamic Analysis Techniques for Mobile Security
Kernel de Linux Provee acceso al hardware Sandboxes Modificaciones de Google Baseband del teléfono Binder para IPC Optimizaciones varias
Zygote Zygote es el proceso que levanta todas las aplicaciones Android Crea la primera VM Levanta clases y recursos básicos de Android Levanta un socket Unix y espera pedidos Al recibir un pedido, hace fork() La VM nueva ya tiene todos los recursos y clases básicos Copy-on-Write agrega eficiencia (pero perjudica el ASLR)
Dalvik/ART Diseñadas específicamente para proveer una capa de abstracción eficiente hacia el SO Máquinas virtuales basadas en registros Interpretan bytecode DEX (Dalvik EXecutable) Se apoyan en funcionalidades provistas por bibliotecas de soporte de código nativo Compilan el bytecode a nativo: Dalvik compila Just In Time ART compila Ahead Of Time
Componentes nativos de userspace Incluyen servicios y bibliotecas de sistema Se comunican con servicios y drivers de bajo nivel Facilitan operaciones de bajo nivel Pueden tener ganancias de eficiencia
Ciclo de vida de un APK Fuente: http://www.anandtech.com/show/8231/a-closer-look-at-android-runtime-art-in-android-l
Modelo de Seguridad de Android
Modelo de Seguridad de Android Android utiliza dos modelos complementarios de permisos: Bajo nivel: Permisos de usuarios y grupos de Linux (conocido como Sandbox de Android). Regula la separación entre aplicaciones. A nivel Kernel de Linux. Alto nivel: permisos de aplicaciones, para efectuar acciones específicas. Regula el acceso de las aplicaciones a los recursos de hardware A nivel Runtime/Dalvik.
Sandbox de Android Procesos de usuarios diferentes no pueden interactuar directamente entre sí (enviar señales, leer/escribir memoria) Un usuario no puede acceder a los archivos de otro Aplicaciones diferentes casi siempre pertenecen a usuarios diferentes. También se utilizan grupos suplementarios de Linux para acceder a determinados recursos (como la tarjeta SD)
Permisos de Android Manejados por Dalvik/Android Runtime Llamadas a las API de sistema IPC (enviar o recibir Intents) Operaciones de bases de datos (Content Providers) Varios niveles de protección: Normal: riesgo mínimo de abuso Dangerous: Acceso a datos personales o riesgo de abuso sobre el dispositivo Signature: Sólo accesible a aplicaciones firmadas con el mismo certificado que la que registra el permiso SignatureOrSystem: Acceso como el anterior, más las aplicaciones que vienen pre instaladas Al instalar una aplicación, se muestran los permisos solicitados Si no se aprueban, la aplicación no se instala
El problema de las actualizaciones Google actualiza el Android base El fabricante lo adapta a los modelos correspondientes (no todos) El carrier le aplica sus modificaciones (si le parece) El carrier pone la actualización a disposición del usuario Resultado: La mayoría de los teléfonos Android corre una versión desactualizada del SO
Actualizaciones II Google Play Services: Proceso a nivel de sistema Se actualiza solo Se puede otorgar permisos por su cuenta Da soporte a las APIs de Google GPS no es parte del SO: no es Open Source GPS se puede deshabilitar, pero dejan de funcionar las apps de Google Entonces: GPS agiliza las actualizaciones, siendo por afuera del SO La parte del SO que es Open Source es más básica Las vulnerabilidades del kernel no se ven afectadas
Aplicaciones Android
Componentes de una aplicación Android Actividades Partes de la aplicación que interactúan con el usuario Una por pantalla de la aplicación Servicios Corren en segundo plano (no hay interfaz de usuario) Suelen aceptar solicitudes de otras aplicaciones Receptores de notificaciones Permiten a la aplicación reaccionar ante eventos del aparato Proveedores de contenidos Dan acceso a bases de datos centralizadas Se consultan desde otras aplicaciones Archivo Manifest.xml Enumera actividades, servicios, receptores, proveedores de contenidos, y permisos requeridos por la aplicación
Actividades Funcionan en base a callbacks oncreate() onstart() onpause() onresume() onstop() onrestart() ondestroy() Contienen widgets: elementos de IU Los widgets tienen sus propios callbacks Pueden ser habilitadas para usar desde otras apps (con Intents)
Servicios Son como los servicios de Unix: Corren en segundo plano Usualmente reciben pedidos de otras aplicaciones Se manejan también por callbacks: oncreate() onstartcommand() onbind() ondestroy() onhandleintent() (thread único) Típicamente se lanzan, detienen e invocan a través de Intents.
Receptores de notificaciones Sirven para reaccionar ante eventos del sistema: Fin del proceso de boot Salida del sueño SMS enviado... Callback: onreceive Pueden ser registrados en runtime (no sólo en el Manifest) Muy usado por servicios de segundo plano... y malware
Proveedores de Contenidos Interfaz estructurada hacia repositorios de datos compartidos (usualmente SQLite) Una aplicación puede funcionar como ContentProvider, y puede exponer ese servicio a otras aplicaciones Se registran con un ContentResolver, que rutea los pedidos según el tipo de contenidos Ejemplo: Contacts, o Calendar
Intents Parte fundamental del mecanismo de IPC Descripción abstracta de la operación a realizar Pueden llevar o no un destinatario específico Tres tipos: startactivity broadcastintent startservice Información que lleva el Intent: Acción (ACTION DIAL, ACTION VIEW,...) Datos ( tel:123, content://contacts/people/,...) Información adicional: categoría de la acción a ejecutar tipo de los datos del Intent componente específico a utilizar para la acción extras: Información adicional
AndroidManifest: Actividades <activity android:name=".exampleactivity" android:process=":new process" android:exported="true" android:permission="android.permission.send SMS" <intent-filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter> </activity>
AndroidManifest: Servicios <service android:enabled =["true" "false"] android:exported=["true" "false"] android:icon="drawable resource" android:isolated process=["true" "false"] android:label="string resource" android:name="string" android:permission="string" android:process="string"... </service>
AndroidManifest: Receptores de notificaciones <receiver android:enabled =["true" "false"] android:exported=["true" "false"] android:icon="drawable resource" android:label="string resource" android:name="string" android:permission="string" android:process="string"... </receiver>
AndroidManifest: Proveedores de contenidos <provider android:authorities ="list" android:enabled =["true" "false"] android:exported=["true" "false"] android:granturipermissions=["true" "false"] android:icon="drawable resource" android:initorder="integer" android:multiprocess=["true" "false"] android:label="string resource" android:name="string" android:permission="string" android:process="string" android:readpermission="string" android:syncable=["true" "false"] android:writepermission="string"... </service>
Generando un paquete Android
Generando un paquete Android (cont) Fuente: http://developer.android.com/sdk/installing/studio-build.html
Generación de un paquete Android La herramienta aapt compila los recursos de la aplicación (como parámetros de la UI, layouts, y otros archivos XML del proyecto) a forma binaria. También genera un archivo R.java que los referencia. La herramienta aidl compila los archivos.aidl en interfaces Java. El código Java generado, más el de la aplicación, son compilados a archivos.class.
Generación de un paquete Android(cont) La herramienta dex convierte los archivos.class en bytecode Dalvik, junto con otras bibliotecas que se hayan incluido como archivos.class. Todos los archivos que no se compilan, más los compilados, más los archivos.dex, son empaquetados con la herramienta apkbuilder. El archivo apk generado debe ser firmado, o bien con una clave de prueba o con una de producción. Si la aplicación se firma en modo producción, también debe alinearse con la herramienta zipalign.
Herramientas de desarrollo
Eclipse con ADT Eclipse IDE + Android Developer Tools Builds utilizan Ant Android SDK Editor de layouts Emulador de Android URL: http://developer.android.com/sdk/index.html
Android Studio Basado en IntelliJ IDEA Builds utilizan Gradle Android SDK Editor de layouts Emulador de Android En beta, pero el Eclipse con ADT se está abandonando URL: http://developer.android.com/sdk/installing/studio.html
Diferencias entre Android Studio y Eclipse+ADT Característica AndroidStudio Eclipse+ADT Build system Gradle Ant Dependencias basadas en Maven Sí No Generación de variantes Sí No Refactoreo y completamiento avanzado Sí No Editor gráfico de layout Sí Sí Firma de APK y manejo de keystores Sí Sí Soporte para NDK Pronto Sí
Android Studio: Eligiendo versión de API
Android Studio: Tipos de pantalla
Android Studio: El desarrollo
Android Debug Bridge - adb Permite conectarse a un teléfono via USB o a un emulador Permite: Copiar archivos Redireccionar ports Instalar programas Abrir un shell: am - Activity Manager, interactúa con aplicaciones pm - Package Manager, administra aplicaciones sqlite3 - Maneja bases de datos de aplicaciones logcat - Acceso a los logs Otros comandos, en /system/bin
Comandos de Activity Manager start [options] <INTENT> startservice [options] <INTENT> broadcast [options] <INTENT> instrument [options] <COMPONENT> profile start <PROCESS> <FILE> profile stop <PROCESS> dumpheap [options] <PROCESS> <FILE> set-debug-app [options] <PACKAGE> clear-debug-app monitor [options] force-stop <PACKAGE> kill [options] <PACKAGE> kill-all
Comandos de Package Manager list packages [options] <FILTER> list permission-groups list permissions [options] <GROUP> list instrumentation list features list libraries list users path <PACKAGE> install [options] <PATH> uninstall [options] <PACKAGE> clear <PACKAGE> enable <PACKAGE OR COMPONENT> disable <PACKAGE OR COMPONENT>
Comandos de Package Manager (sigue) disable-user [options] <PACKAGE OR COMPONENT> grant <PACKAGE PERMISSION> revoke <PACKAGE PERMISSION> set-install-location <LOCATION> get-install-location set-permission-enforced <PERMISSION> [true false] trim-caches <DESIRED FREE SPACE> create-user <USER NAME> remove-user <USER ID> get-max-users