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

Documentos relacionados