Seguridad y Protección de Datos en Android
Transcripción
Seguridad y Protección de Datos en Android
Seguridad y Protección de Datos en Android Juan Heguiabehere Joaquı́n Rinaudo 22o Escuela de Verano de Ciencias Informáticas RIO 2015 Sobre el curso I I I I 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 I Lunes: Android como plataforma de desarrollo I I I I I I I I I I I I 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: I Kernel de Linux I Código nativo de userspace I Ambiente Android (bibliotecas/servicios escritos en Java) I Máquina virtual Dalvik / ART I Aplicaciones Android (escritas en Java) Componentes de Android Fuente: A. Gorla, Static and Dynamic Analysis Techniques for Mobile Security Kernel de Linux I I I Provee acceso al hardware ”Sandboxes” Modificaciones de Google I I I Baseband del teléfono Binder para IPC Optimizaciones varias Zygote Zygote es el proceso que levanta todas las aplicaciones Android I Crea la primera VM I Levanta clases y recursos básicos de Android I Levanta un socket Unix y espera pedidos I Al recibir un pedido, hace fork() I La VM nueva ya tiene todos los recursos y clases básicos I 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 I Máquinas virtuales basadas en registros I Interpretan bytecode DEX (Dalvik EXecutable) I Se apoyan en funcionalidades provistas por bibliotecas de soporte de código nativo I Compilan el bytecode a nativo: I I Dalvik compila Just In Time ART compila Ahead Of Time Componentes nativos de userspace I I I I 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: I Bajo nivel: Permisos de usuarios y grupos de Linux (conocido como Sandbox de Android). I I I Regula la separación entre aplicaciones. A nivel Kernel de Linux. Alto nivel: permisos de aplicaciones, para efectuar acciones especı́ficas. I I Regula el acceso de las aplicaciones a los recursos de hardware A nivel Runtime/Dalvik. Sandbox de Android I I I I 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 I Llamadas a las API de sistema I IPC (enviar o recibir Intents) I Operaciones de bases de datos (Content Providers) I Varios niveles de protección: I I I I I I 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 I I I I 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: I Proceso a nivel de sistema I Se actualiza solo I Se puede otorgar permisos por su cuenta I Da soporte a las APIs de Google I GPS no es parte del SO: no es Open Source I GPS se puede deshabilitar, pero dejan de funcionar las apps de Google Entonces: I GPS agiliza las actualizaciones, siendo por afuera del SO I La parte del SO que es Open Source es más básica I Las vulnerabilidades del kernel no se ven afectadas Aplicaciones Android Componentes de una aplicación Android I Actividades I I I Servicios I I I Permiten a la aplicación reaccionar ante eventos del aparato Proveedores de contenidos I I I Corren en segundo plano (no hay interfaz de usuario) Suelen aceptar solicitudes de otras aplicaciones Receptores de notificaciones I I Partes de la aplicación que interactúan con el usuario Una por pantalla de la aplicación Dan acceso a bases de datos centralizadas Se consultan desde otras aplicaciones Archivo Manifest.xml I Enumera actividades, servicios, receptores, proveedores de contenidos, y permisos requeridos por la aplicación Actividades I Funcionan en base a callbacks I I I I I I I I Contienen widgets: elementos de IU I I onCreate() onStart() onPause() onResume() onStop() onRestart() onDestroy() Los widgets tienen sus propios callbacks Pueden ser habilitadas para usar desde otras apps (con Intents) Servicios I Son como los servicios de Unix: I I I Se manejan también por callbacks: I I I I I I Corren en segundo plano Usualmente reciben pedidos de otras aplicaciones onCreate() onStartCommand() onBind() onDestroy() onHandleIntent() (thread único) Tı́picamente se lanzan, detienen e invocan a través de Intents. Receptores de notificaciones I Sirven para reaccionar ante eventos del sistema: I I I I I I I 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 I I I I 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 I I I I 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: I I I I startActivity broadcastIntent startService Información que lleva el Intent: I I I Acción (ACTION DIAL, ACTION VIEW, ...) Datos (‘tel:123’, ‘content://contacts/people/’, ...) Información adicional: I I I I 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 I I I 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) I I I I 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 I I I I I I 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 I I I I I I I 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 Build system Dependencias basadas en Maven Generación de variantes Refactoreo y completamiento avanzado Editor gráfico de layout Firma de APK y manejo de keystores Soporte para NDK AndroidStudio Gradle Sı́ Sı́ Sı́ Sı́ Sı́ Pronto Eclipse+ADT Ant No No No Sı́ Sı́ Sı́ Android Studio: Eligiendo versión de API Android Studio: Tipos de pantalla Android Studio: El desarrollo Android Debug Bridge - adb I I Permite conectarse a un teléfono via USB o a un emulador Permite: I I I I Copiar archivos Redireccionar ports Instalar programas Abrir un shell: I I I I I 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 I I I I I I I I I I I I I 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 I I I I I I I I I I I I I 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) I I I I I I I I I I 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