Seguridad en Android: Aplicación de bloqueo para la prevención de Shoulder Surfing Cristian Torres Barrantes Trabajo de Fin de Grado dirigido por Manel Medina Llinàs Departamento de Arquitectura de Computadores Facultat d’Informàtica de Barcelona Universitat Politècnica de Catalunya Junio 2016 Resumen Desde que a finales de 2008 salió al mercado la primera versión oficial del sistema operativo Android ha ido aumentando el número de usuarios de smartphones hasta que, en la actualidad, el 82.8 % de éstos utilizan este sistema. Ante este hecho, el mundo del cibercrimen se ha volcado para encontrar vectores de ataque que permitan obtener los datos privados de los usuarios. En este contexto, el proyecto que se presenta a continuación pretende estudiar los mecanismos actuales de seguridad que son inherentes en Android, las principales extensiones que resuelven situaciones no contempladas por los creadores de este sistema y los principales métodos usados para comprometer la privacidad de los usuarios. Por otro lado, se desarrolla una aplicación para proteger la sustracción de información sensible de dichos usuarios ante un tipo concreto de ataque de ingenierı́a social: Shoulder Surfing. Índice Resumen I Índice de figuras V Índice de códigos VIII Índice de tablas X 1. Introducción 1.1. Formulación del problema . . 1.2. Contextualización . . . . . . . 1.2.1. Definición del contexto 1.2.2. Actores implicados . . 1.3. Estado del arte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 2 2 2 3 2. Alcance del proyecto 2.1. Definición del alcance . . . . . . . . 2.2. Riesgos y obstáculos . . . . . . . . . 2.3. Metodologı́a y rigor . . . . . . . . . 2.3.1. Métodos de trabajo . . . . . 2.3.2. Herramientas de seguimiento 2.3.3. Métodos de validación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 6 6 6 7 8 . . . . . . 9 9 11 11 12 12 13 . . . . . 14 14 14 15 17 17 . . . . . . . . . . . . . . . 3. Pliegue de condiciones 3.1. Descripción y motivación . . . . . . . . 3.2. Entorno . . . . . . . . . . . . . . . . . . 3.3. Estado actual . . . . . . . . . . . . . . . 3.4. Diseño arquitectónico e Implementación 3.5. Gestión de riesgos . . . . . . . . . . . . 3.6. Competencias técnicas de la especialidad . . . . . . . . . . . . 4. Planificación temporal 4.1. Planificación estimada del proyecto . . . . . 4.2. Descripción de las tareas . . . . . . . . . . . 4.3. Diagrama de Gantt . . . . . . . . . . . . . . 4.4. Recursos . . . . . . . . . . . . . . . . . . . . 4.5. Valoración de alternativas y plan de acción ii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Índice iii 5. Fundamentos teóricos 5.1. Sistemas Android . . . . . . . . . . . . . . . 5.1.1. Arquitectura del sistema . . . . . . . 5.1.1.1. Kernel . . . . . . . . . . . . 5.1.1.2. Librerı́as . . . . . . . . . . 5.1.1.3. Runtime . . . . . . . . . . 5.1.1.4. Framework de la aplicación 5.1.1.5. Aplicaciones . . . . . . . . 5.1.2. Arquitectura de una aplicación . . . 5.1.2.1. Android Manifest . . . . . 5.1.2.2. Actividades . . . . . . . . . 5.1.2.3. Servicios . . . . . . . . . . 5.1.2.4. Content providers . . . . . 5.1.2.5. Broadcast recievers . . . . 5.2. Seguridad en Android . . . . . . . . . . . . 5.2.1. Modelo de seguridad . . . . . . . . . 5.2.1.1. Sandboxing . . . . . . . . . 5.2.1.2. Gestión de permisos . . . . 5.2.1.3. Acceso a memoria . . . . . 5.2.1.4. Protección de datos . . . . 5.2.1.5. Signatura de código . . . . 5.2.1.6. Binder . . . . . . . . . . . 5.2.1.7. SEAndroid . . . . . . . . . 5.2.2. Extensiones de seguridad . . . . . . 5.2.2.1. Kirin . . . . . . . . . . . . 5.2.2.2. AdDroid . . . . . . . . . . 5.2.2.3. XManDroid . . . . . . . . . 5.2.2.4. ASF . . . . . . . . . . . . . 5.2.2.5. TaintDroid . . . . . . . . . 5.3. Inseguridad de la información . . . . . . . . 5.3.1. Ingenierı́a social . . . . . . . . . . . 5.3.1.1. Shoulder Surfing . . . . . . 5.3.1.2. Tapjacking . . . . . . . . . 6. Desarrollo del proyecto 6.1. Descripción de la aplicación . . . . . . . 6.2. Procedimiento . . . . . . . . . . . . . . . 6.3. Diagrama de flujo . . . . . . . . . . . . . 6.4. Funcionalidades . . . . . . . . . . . . . . 6.4.1. Estado de la protección . . . . . 6.4.2. Establecer PIN . . . . . . . . . . 6.4.3. Establecer taps invisibles . . . . 6.4.4. Entrenamiento . . . . . . . . . . 6.4.5. Historial . . . . . . . . . . . . . . 6.4.6. Protección de aplicaciones . . . . 6.4.7. Protección de contenido privado 6.4.8. Servicio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 18 19 20 21 21 22 23 24 25 25 27 28 29 30 30 30 31 32 33 34 34 35 37 38 39 41 42 44 45 46 48 49 . . . . . . . . . . . . 52 52 54 55 58 59 61 63 68 70 72 75 80 Índice iv 6.4.9. Tutorial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 7. Gestión económica 7.1. Consideraciones iniciales . 7.2. Identificación y estimación 7.2.1. Costes directos . . 7.2.2. Costes indirectos . 7.2.3. Contingencia . . . 7.2.4. Imprevistos . . . . 7.2.5. Presupuesto . . . . 7.3. Control de gestión . . . . . . . . . . de costes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8. Sostenibilidad y compromiso social 8.1. Valoración de la sostenibilidad . . 8.2. Económica . . . . . . . . . . . . . . 8.3. Social . . . . . . . . . . . . . . . . 8.4. Ambiental . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 83 83 84 85 86 86 86 87 . . . . 88 88 88 89 90 9. Conclusiones 91 Bibliografı́a 92 Índice de figuras 4.1. Datos del diagrama de Gantt . . . . . . . . . . . . . . . . . . . . . . . . . 15 4.2. Diagrama de Gantt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 5.1. Arquitectura del sistema operativo Android . . . . . . . . . . . . . . . . . 19 5.2. Arquitectura de una aplicación . . . . . . . . . . . . . . . . . . . . . . . . 24 5.3. Ciclo de vida de una Activity . . . . . . . . . . . . . . . . . . . . . . . . . 26 5.4. Ciclo de vida de un servicio . . . . . . . . . . . . . . . . . . . . . . . . . . 28 5.5. Funcionamiento de los Content Providers . . . . . . . . . . . . . . . . . . 29 5.6. Comunicación entre procesos mediante Binder . . . . . . . . . . . . . . . . 35 5.7. Extensiones de seguridad . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 5.8. Comunicación entre librerı́as de publicidad y Android . . . . . . . . . . . 39 5.9. Comunicación entre librerı́as de publicidad y Android usando AdDroid . . 40 5.10. Arquitectura de seguridad de Android . . . . . . . . . . . . . . . . . . . . 43 5.11. Arquitectura de seguridad implantada por ASF . . . . . . . . . . . . . . . 43 5.12. Seguimiento multinivel de recursos de TaintDroid . . . . . . . . . . . . . . 44 5.13. Tapjacking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 5.14. Tapjacking con pantalla transparente . . . . . . . . . . . . . . . . . . . . . 50 6.1. Panel Configuración . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 6.2. Panel Protección . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 v Lista de figuras vi 6.3. Diagrama de flujo ideal . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 6.4. Espera activa del servicio . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 6.5. Pila de tareas recientemente abiertas . . . . . . . . . . . . . . . . . . . . . 57 6.6. Comprobación de cambio de aplicación . . . . . . . . . . . . . . . . . . . . 58 6.7. Diagrama de flujo final . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 6.8. Opciones disponibles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 6.9. Protección deshabilitada . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 6.10. Establecer PIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 6.11. Ventana de bloqueo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 6.12. Bloqueo principal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 6.13. Restablecer PIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 6.14. Taps con transparencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 6.15. Taps sin transparencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 6.16. Introducción de taps I . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 6.17. Introducción de taps II . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 6.18. Modificación del radio I . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 6.19. Modificación del radio II . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 6.20. Taps establecidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 6.21. Pantalla introductoria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 6.22. Taps de entrenamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 6.23. Visualización gráfica I . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 6.24. Resultados I . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 6.25. Visualización gráfica II . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 6.26. Resultados II . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 6.27. Historial de accesos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 6.28. Reinicio de contadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 Lista de figuras vii 6.29. Aplicaciones a proteger . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 6.30. Interfaz para proteger imágenes . . . . . . . . . . . . . . . . . . . . . . . . 76 6.31. Selección de imágenes de la galerı́a . . . . . . . . . . . . . . . . . . . . . . 76 6.32. Imágenes cifradas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 6.33. Desproteger imagen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 6.34. Lista de archivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 6.35. Archivo cifrado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 6.36. Contenido del archivo cifrado . . . . . . . . . . . . . . . . . . . . . . . . . 77 6.37. Tutorial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 6.38. Link del tutorial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 Índice de códigos 5.1. Código principal para implementar tapjacking . . . . . . . . . . . . . . . . 50 6.1. Opciones para deshabilitar la protección . . . . . . . . . . . . . . . . . . . 60 6.2. Configuración de la alarma . . . . . . . . . . . . . . . . . . . . . . . . . . 60 6.3. Parada del servicio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 6.4. Ejecución de la alarma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 6.5. Configuración del PIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 6.6. Uso de SecurePreferences . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 6.7. Recogida de taps del usuario . . . . . . . . . . . . . . . . . . . . . . . . . . 67 6.8. Representación gráfica de los taps . . . . . . . . . . . . . . . . . . . . . . . 67 6.9. Almacenamiento de los taps . . . . . . . . . . . . . . . . . . . . . . . . . . 68 6.10. Evaluación de los taps introducidos . . . . . . . . . . . . . . . . . . . . . . 70 6.11. Gestión de cada entrada del historial . . . . . . . . . . . . . . . . . . . . . 71 6.12. Obtención de valores de la base de datos . . . . . . . . . . . . . . . . . . . 72 6.13. Realización de la búsqueda en segundo plano . . . . . . . . . . . . . . . . 73 6.14. Búsqueda de aplicaciones en el sistema . . . . . . . . . . . . . . . . . . . . 74 6.15. Guardar aplicaciones protegidas . . . . . . . . . . . . . . . . . . . . . . . . 74 6.16. Selección de contenido de la galerı́a . . . . . . . . . . . . . . . . . . . . . . 78 6.17. Contenido guardado para cifrar . . . . . . . . . . . . . . . . . . . . . . . . 78 6.18. Cifrado del contenido I . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 viii Lista de figuras ix 6.19. Cifrado del contenido II . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 6.20. Descifrado del contenido . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 6.21. Consulta de la aplicación en primer plano . . . . . . . . . . . . . . . . . . 81 6.22. Comprobación del número PIN . . . . . . . . . . . . . . . . . . . . . . . . 81 Índice de tablas 7.1. Costes recursos humanos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 7.2. Costes directos por actividad . . . . . . . . . . . . . . . . . . . . . . . . . 84 7.3. Costes directos de material . . . . . . . . . . . . . . . . . . . . . . . . . . 85 7.4. Costes indirectos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 7.5. Costes contingencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 7.6. Costes imprevistos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 7.7. Presupuesto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 8.1. Valoración sostenibilidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 x 1. Introducción 1.1. Formulación del problema Desde que a finales de 2008 salió al mercado la primera versión oficial del sistema operativo Android ha ido aumentando el número de usuarios de smartphones hasta que, en la actualidad, el 82.8 % [1] de éstos utilizan este sistema. Este hecho ha propiciado el aumento del interés en atacar dicha plataforma con el fin de sustraer información privada a los usuarios. En este contexto, se pretende realizar una comprensión del funcionamiento de la seguridad en Android y de las técnicas más utilizadas para lograr evadir la protección que ofrece este sistema operativo. Centrando el foco de atención en un tipo concreto de estas técnicas se lleva a cabo el desarrollo de una aplicación, alternativa a las ya existentes en el mercado, que proporciona una protección adicional en el momento de introducir un patrón de desbloqueo a las aplicaciones instaladas. La finalidad es dotar al usuario de los medios necesarios para acceder a sus datos privados en situaciones que puedan tener un impacto negativo en su privacidad. De este modo, se solucionará el problema actual de las aplicaciones que ofrecen la funcionalidad de bloquear en base a un patrón o PIN: la efectividad se ve anulada cuando un tercero descubre la combinación correcta. La situación a la cual se pretende dar solución con el diseño de esta aplicación es el denominado Shoulder Surfing. Éste se basa en técnicas de observación directa de un dispositivo con la finalidad de sustraer información sensible del usuario. Esto sucede frecuentemente debido a la cantidad de situaciones en las cuales los usuarios utilizan sus dispositivos móviles en público. Se puede ejemplificar con el siguiente caso: un compañero de clase observa el patrón de desbloqueo de la galerı́a de fotografı́as de otro y en un posible descuido de éste último podrı́a ganar acceso a dicho contenido. 1 1 Introducción Aunque se diera esta situación, o similares, el hecho de tener un segundo nivel de protección ignoto para el atacante dificultarı́a el acceso de éste a los recursos protegidos. Con este fin se desarrolla la aplicación que se expone en este proyecto. 1.2. 1.2.1. Contextualización Definición del contexto Este proyecto se enmarca en el ámbito de la seguridad en sistemas Android. En concreto, la aplicación creada atañe al concepto de ataque de ingenierı́a social. Éste se define como un conjunto de técnicas de manipulación que se realizan sobre los usuarios con la finalidad de conseguir información confidencial. Existe un amplio abanico de técnicas que se engloban dentro de este tipo de ataque, las cuales suelen implicar el uso de correo electrónico, teléfono u otro tipo de comunicación que pretende provocar situaciones de urgencia, miedo u otras, con el fin de engañar al usuario para que revele información sin ser consciente de estar siendo vı́ctima de un fraude. No obstante, algunas de estas técnicas no requieren de un interacción directa entre el atacante y su vı́ctima, como es el caso de Shoulder Surfing. Shoulder Surfing es una de las prácticas más utilizadas para obtener información sensible de los usuarios de Android. Esto se debe a la facilidad y a la diversidad de situaciones en las cuales se puede llevar a cabo. La ejecución de esta técnica consiste en observar disimuladamente las acciones que realiza otro usuario en su dispositivo. De este modo es posible obtener claves de acceso al sistema, contraseñas u otros datos. En este tipo de ataque el usuario es el factor vulnerable por lo que no se puede conseguir una total erradicación del problema. Es aquı́ donde surge la idea de la aplicación desarrollada en este proyecto. 1.2.2. Actores implicados Acto seguido, se describe el rol de cada una de las partes involucradas en el desarrollo del proyecto y los potenciales destinatarios que se beneficiarı́an del resultado de este trabajo. 2 1 Introducción Desarrollador: es el principal actor del proyecto. Es el responsable de recopilar, estructurar y redactar la información además de desarrollar la aplicación. Director: Manel Medina Llinàs, Catedrático de Arquitectura de Computadores en la Universitat Politècnica de Catalunya, es el encargado de guiar y asistir este proyecto. Usuarios beneficiados: esta aplicación va dirigida a los usuarios que requieren mejorar la protección de la privacidad de sus dispositivos mediante un segundo nivel de autenticación que pase desapercibido ante posibles observadores. Estos usuarios podrán beneficiarse tanto en un entorno empresarial como en el personal con la finalidad de restringir el acceso a documentos y aplicaciones confidenciales. 1.3. Estado del arte Android es un sistema operativo basado en el kernel de Linux diseñado originalmente para dispositivos móviles con pantalla táctil. El uso de este sistema ha experimentado un gran crecimiento y aceptación entre los usuarios de smartphones hasta el punto de que a finales de 2015 ocho de cada diez dispositivos usaban Android. La rápida expansión de Android se debe principalmente a la gran cantidad de aplicaciones que salen al mercado ofreciendo útiles funcionalidades a los usuarios. Este hecho es consecuencia de la fácil adaptación que tienen los desarrolladores de software a la arquitectura de este sistema. Dicha arquitectura se compone de distintos módulos [2, 3] que se interconectan para compartir información y hacer uso de las funcionalidades ofrecidas por el resto de ellos. Esta modularidad permite a programadores y usuarios abstraerse de la compleja implementación interna y poder realizar sus tareas de una forma más cómoda. Tanto para un usuario estándar como para un desarrollador, la piedra angular de este sistema, la cual proporciona atracción y utilidad del mismo, son las aplicaciones. Una aplicación está formada por varios componentes [4, 5] que proporcionan un amplio abanico de funcionalidades para que puedan ser implementadas por el programador. Éste es el encargado de interactuar con las interfaces que proporciona Android a fin de facilitar el desarrollo de la aplicación de una forma correcta y segura. 3 1 Introducción La necesidad de seguridad es inherente a cualquier sistema operativo, de tal modo que no se contempla un escenario en el cual se pueda prescindir de una fuerte implementación de ésta. Es por ello que Android establece un modelo de seguridad, basado en el modelo de Linux, con la intención de blindar el sistema y evitar que sea comprometido. Dicho modelo especifica cada una de las incorporaciones nativas [6–10] que han sido adoptadas para proteger al usuario. No obstante, se ha demostrado que estas medidas de seguridad tienen un alcance de protección limitado y pueden ser evadidas [11–14] por atacantes. Esto propulsa la aparición de extensiones de seguridad [15–19] capaces de integrarse al sistema operativo con la finalidad de suplir sus carencias. 4 2. Alcance del proyecto 2.1. Definición del alcance El presente proyecto se orienta a la creación de una aplicación móvil que, tal y como se ha expuesto en apartados anteriores, pretende mejorar la seguridad de dispositivos con sistema Android en situaciones en las que se pueda dar Shoulder Surfing. No obstante, el diseño de esta aplicación no se puede concebir sin tener consolidados una serie de conocimientos sobre este sistema. Es por ello que, con la finalidad de conseguir una base teórica sólida, se ha otorgado un peso considerable a la parte bibliográfica de este ámbito. En primer lugar, se realiza un overview acerca del funcionamiento del sistema operativo Android para poder entender algunos aspectos fundamentales en cuanto a la composición interna del mismo. Posteriormente, se profundiza en la seguridad de Android debido a que es el aspecto más importante y más estrechamente relacionado con la aplicación desarrollada en este trabajo. Por último, se hace una revisión sobre los métodos más comunes utilizados por los cibercriminales con la finalidad de sustraer información . En cuanto a la parte práctica de este proyecto, lo que se pretende es crear una aplicación que aporte un segundo nivel de protección, invisible para posibles observadores, que proteja a las aplicaciones, evitando ası́ el Shoulder Surfing. 5 2 Alcance del proyecto 2.2. Riesgos y obstáculos Como en todo proyecto existen potenciales factores que pueden interferir en las expectativas fijadas desde un inicio. En este caso, los condicionantes principales hacen referencia al tiempo y a los conocimientos sobre la materia. La entrega de este trabajo está establecida en una fecha concreta y por tanto el perı́odo de tiempo para su desarrollo debe respetar dicha fecha. Esto supone que cualquier contratiempo que se produjese podrı́a afectar al avance continuado del proyecto y conducir al incumplimiento de los plazos. Debido a que no se concibe tal escenario, la planificación temporal se realizará de modo que tenga cabida la gestión de posibles adversidades sin que interfieran en el flujo de este trabajo. Algunas de éstas que se consideran hacen referencia a las funcionalidades que ya no son soportadas por Android, lo cual provoca que se tenga que optar por alternativas que no aportan las mismas prestaciones. Otro importante aspecto a considerar es el grado de conocimiento previo del alumno en la materia a tratar. Éste influirá en la rapidez con la cual avanzará la implementación del proyecto. A causa de la gran extensión que ha experimentado Android a lo largo de los últimos años, un gran número de recursos están disponibles para que el alumno pueda formarse y alcanzar los conocimientos necesarios para la correcta finalización de las tareas programadas. Por tanto, a pesar de ser un factor importante no será del todo condicionante. 2.3. Metodologı́a y rigor En esta sección se expondrá el método de trabajo elegido para fijar el rumbo del proyecto, el conjunto de herramientas seleccionadas para realizar un seguimiento del mismo y la metodologı́a empleada para validar el cumplimiento de los objetivos fijados. 2.3.1. Métodos de trabajo Con la finalidad de establecer una disciplina para el correcto desarrollo del proyecto, SCRUM ha sido la metodologı́a de trabajo elegida. Se trata de un modelo ágil de desarrollo que tiene definidas las conductas que se deben adoptar para finalizar el trabajo en el plazo fijado y asegurar que las expectativas del cliente se han cumplido. 6 2 Alcance del proyecto SCRUM tiene como caracterı́stica principal la constante interacción entre cliente y desarrollador (director y alumno) para seguir de cerca cada avance. Este hecho aporta flexibilidad ante cambios, ya que éstos, al formar parte del proceso de desarrollo, no se entienden como un problema sino como algo necesario para que el producto sea mejor. Además, permite identificar y reducir tareas innecesarias; agilizando ası́ el progreso. Por otro lado, SCRUM sigue una estrategia de desarrollo incremental, la cual permite que la planificación sea adaptable al trascurso del proyecto. Esto proporciona una mejor predicción de los tiempos necesarios para realizar cada tarea. Estas caracterı́sticas más significativas de SCRUM hacen que se ajuste a las necesidades requeridas en este trabajo y en consecuencia se pondrán en práctica. 2.3.2. Herramientas de seguimiento A lo largo del desarrollo del proyecto se utilizarán distintas herramientas para asegurar un correcto procedimiento y garantizar que la integridad del trabajo está protegida ante circunstancias disruptivas. La principal herramienta de trabajo será Android Studio, la cual proporciona todo un entorno adaptado al desarrollo de aplicaciones para Android. Además, permite la conexión con un gestor de repositorios en red como Git, GitHub, Mercurial, etc., para tener un control de versiones sobre el código implementado. Por otro lado, una herramienta clave para evitar que los avances producidos dependan del estado del dispositivo en el cual se lleva a cabo toda actividad es Mega. Este programa permite tener una carpeta en el escritorio del ordenador con sincronización constante con la nube. De este modo, cualquier cambio realizado en un fichero queda registrado tanto en la máquina fı́sica como en un medio de almacenamiento en lı́nea, el cual cuenta con una capacidad de 50GB. Además, Mega permite exportar un enlace que especifica la ruta de acceso a la carpeta respaldada. Esta caracterı́stica será aprovechada para permitirle al director del proyecto poder consultar los avances realizados de una forma cómoda y remota. 7 2 Alcance del proyecto 2.3.3. Métodos de validación Debido a las caracterı́sticas definidas anteriormente sobre el modelo de trabajo a seguir, SCRUM, los métodos de evaluación se ajustarán a las pautas que establece dicho modelo. Es decir, el trabajo será evaluado con cierta periodicidad, a convenir con las preferencias del director, para asegurar un desarrollo continuado y correcto del proyecto, evitando ası́ desviaciones e incorrectas decisiones del alumno sobre las tareas a realizar. La comunicación entre el director y el alumno se realizará semanalmente vı́a correo electrónico. En ella, el alumno detallará los avances realizados a lo largo de la semana y esperará el feedback del director para modificar el estado actual del trabajo, en caso de haber tareas desarrolladas de forma errónea, y consolidar el rumbo a seguir; evitando ası́ desviaciones. Con este fin se establece un perı́odo máximo de dos semanas en el cual puede permanecer el proyecto sin ser evaluado. 8 3. Pliegue de condiciones 3.1. Descripción y motivación El conjunto de funcionalidades que proporciona Android, en combinación con la evolución tecnológica de los dispositivos móviles, ha propiciado que los usuarios encuentren en este sistema un lugar en el cual gestionar gran parte de las acciones cotidianas que llevan a cabo. Entre éstas se encuentra una que es prácticamente inherente al usuario: la gestión de información privada y confidencial. A pesar de no haber estadı́sticas que confirmen este hecho se podrı́a estimar que alrededor de la totalidad de dispositivos con Android almacenan datos sensibles. Éstos pueden ser documentos, contenido multimedia, registros de mensajerı́a instantánea, etc., o bien información que permita identificar y ubicar a un usuario; historial de navegación, posicionamiento GPS, registro de llamadas, etc. Ante este hecho, el mundo del cibercrimen se ha volcado en la exploración intensa de este sistema para encontrar vectores de ataque que permitan obtener datos privados de los usuarios; principalmente con ánimo de lucro. El objetivo sobre el cual recae el foco de atención de un ataque es una vulnerabilidad persistente en todos los sistemas informáticos: el usuario. El usuario de hoy dı́a hace un uso constante de los dispositivos móviles ignorando los peligros silenciosos que le rodean. Se expone a gran cantidad de situaciones adversas y realiza acciones sin ser del todo consciente del impacto que pueden tener en su confidencialidad. En vista de este escenario, este proyecto pretende estudiar los mecanismos actuales de seguridad que son inherentes en Android y las principales extensiones que resuelven situaciones no contempladas por los creadores de este sistema. 9 3 Pliegue de condiciones La parte teórica de este proyecto se combinará con una parte práctica que consistirá en una aplicación destinada a proporcionar seguridad a los usuarios de Android. Dicha aplicación se trata de un software que permitirá aplicar un control de acceso sobre otras aplicaciones con un factor de protección adicional respecto a otras aplicaciones similares en el mercado. El funcionamiento consistirá en sobreponer una aplicación, la cual pide un PIN de desbloqueo, encima de la aplicación a proteger. Cuando el usuario introduzca correctamente el PIN solicitado, tendrá un acceso aparente a la aplicación protegida. Es decir, creerá que está interactuando con dicha aplicación pero en realidad lo estará haciendo con una aplicación transparente que está a la escucha de los taps que hace el usuario en la pantalla. Dichos taps han sido establecidos inicialmente por el usuario y actúan como segundo factor de autenticación. A modo de ejemplo clarificador se expone la siguiente situación: Un usuario A decide proteger la aplicación Whatsapp para que salga una ventana que pida introducir PIN cada vez que se abra. El usuario A requiere de hacer uso de Whatsapp en un lugar donde hay personas alrededor (metro, universidad, lugar de trabajo, etc.). Introduce el PIN de desbloqueo. Un usuario B está observando el momento en el que se introduce el PIN. El usuario A, una vez ha desbloqueado aparentemente Whatsapp, realizará un conjunto de taps en las posiciones de la pantalla que sólo él sabe teniendo como imagen estática de fondo la interfaz gráfica de Whatsapp. El usuario B (considerando la situación en la que dispone de un tiempo limitado para consultar el WhatsApp del usuario A y dejar el dispositivo en su sitio original) ha sido capaz de contemplar el PIN pero al acceder y no introducir los taps invisibles se le cierra la aplicación y le muestra de nuevo la pantalla de bloqueo. El objetivo de esta aplicación es paliar el efecto de una conocida técnica de ingenierı́a social llamada Shoulder Surfing, la cual, tal y como se ha comentado anteriormente, consiste en técnicas de observación directa de un dispositivo con la finalidad de sustraer información sensible del usuario. 10 3 Pliegue de condiciones Este hecho se puede producir con facilidad en multitud de escenarios debido a que el usuario se ve obligado a focalizar su atención en la pantalla en el momento de introducir el PIN. Su visión debe centrarse en las teclas que tiene que pulsar y en consecuencia no puede prestar atención a posibles observadores que están a su alrededor. La aplicación que se expone en este proyecto permite que un usuario introduzca los taps invisibles sin necesidad de mirar el dispositivo móvil. Por tanto, puede girar el teléfono hacia abajo o levantar la cabeza y observar si hay alguien pendiente cerca suyo. La precisión no es un elemento que juegue en contra del usuario, ya que éste puede graduar el margen de error aceptable para considerar que el tap está dentro de la zona correcta. 3.2. Entorno Este proyecto pertenece a la modalidad B, en la cual el alumno realiza un perı́odo de prácticas en una empresa relacionada con la temática de su proyecto, S21sec1 . S21sec es una multinacional especializada en servicios y tecnologı́a de ciberseguridad cuya finalidad es garantizar el desarrollo efectivo de los negocios. Su objetivo es la protección de los activos digitales de mayor valor y crı́ticos en las organizaciones: la información, las operaciones y la imagen de la compañı́a. Cuenta con más de 16 años de experiencia con proyectos a nivel mundial y con una amplia gama de servicios y productos destinados a garantizar la seguridad de los sistemas de información de empresas e instituciones. 3.3. Estado actual Este trabajo no forma parte de ningún otro proyecto, parte desde cero y cuenta con la personalización de todas y cada una de sus funcionalidades. Es cierto que en el mercado existen numerosas aplicaciones de bloqueo que se diferencian en el nivel de detalle a la hora de proteger. Es decir, unas permiten bloquear algunos parámetros de configuración como la ubicación GPS, el uso de datos, etc., y otras se limitan a proteger sólo aplicaciones. 1 http:www.s21sec.com 11 3 Pliegue de condiciones La idea de la aplicación surge debido al factor común que comparte un gran número de aplicaciones que personalmente he testeado: la seguridad radica en el momento en el cual el usuario inserta el PIN. Este hecho hace que por más eficiencia algorı́tmica que haya sido programada finalmente dependerá en última instancia de la discreción del usuario. Por este motivo, se decide mejorar este tipo de aplicaciones, para que el usuario pueda prevenirse de aquellas personas que están ojo avizor cuando se expone públicamente. 3.4. Diseño arquitectónico e Implementación La arquitectura de la parte práctica del proyecto constará de un conjunto de clases, programadas en Java y XML, que serán las que conformen la aplicación que funcionará sobre el sistema operativo Android. La principal herramienta software que servirá para llevar a cabo todas las tareas de programación es Android Studio. Ésta consiste en un entorno adaptado para proporcionar facilidades a los programadores de aplicaciones Android. Por otro lado, el hardware sobre el cual se realizará la implementación del proyecto consiste en un portátil y un dispositivo móvil. 3.5. Gestión de riesgos Los riesgos asociados a las herramientas y tecnologı́as empleadas en el desarrollo del proyecto no suponen una gran amenaza para la evolución del mismo. Al tratarse de una aplicación para Android no existen riesgos derivados del uso de licencias debido a que la programación para dicha plataforma es de libre acceso. Por otro lado, el uso de estándares por parte de Android erradica cualquier situación de incompatibilidad con los protocolos existentes. No obstante, al tratarse de un sistema muy fraccionado, es decir, existen múltiples versiones de éste, hace que ciertas funcionalidades deban implementarse de forma diferente para garantizar la compatibilidad entre versiones. Esto provoca que el programador realice implementaciones extras, las cuales no todas pueden llevarse a cabo a causa de medidas de seguridad adoptadas por Google. 12 3 Pliegue de condiciones El punto fuerte de Android que mitiga en gran parte estas complicaciones es la extensa documentación que se proporciona desde fuentes oficiales ası́ como la ayuda que se puede encontrar en comunidades tecnológicas. 3.6. Competencias técnicas de la especialidad Este proyecto pertenece a la especialidad de Tecnologı́as de la Información y las competencias técnicas elegidas en el momento de la inscripción del TFG fueron las siguientes: CTI2.2: Administrar y mantener aplicaciones, sistemas informáticos y redes de computadores. CTI2.3: Demostrar comprensión, aplicar y gestionar la garantı́a y la seguridad de los sistemas informáticos. CTI3.1: Concebir sistemas, aplicaciones y servicios basados en tecnologı́as de red, teniendo en cuenta Internet, web, multimedia, servicios interactivos y computación ubicua. CTI4: Utilizar metodologı́as centradas en el usuario i la organización para el desarrollo, la evaluación y la gestión de aplicaciones y sistemas basados en tecnologı́as de la información que aseguren la accesibilidad, ergonomı́a y la usabilidad de los sistemas. La descripción del proyecto dada en secciones anteriores pone de manifiesto que se abordan los aspectos relacionados con las competencias CTI2.2, CTI2.3 y CTI4. Por otro lado, la competencia CTI3.1 ha quedado finalmente excluida del alcance del trabajo. Esto se debe a que en el momento de la elección de las competencias no fue posible predecir los acontecimientos que sucederı́an a lo largo del proyecto que harı́an que esta competencia no tuviera cabida. El principal motivo para su eliminación ha sido proporcionar mayor confianza y seguridad al usuario. En un principio se iban a implementar funcionalidades que requerı́an el permiso de Internet dentro de la aplicación, como por ejemplo el restablecer el PIN en caso de olvidarlo. No obstante, el hecho de requerir el permiso de acceso y escritura en la tarjeta SD, entre otros que también pueden considerarse sensibles, hace que en combinación con el de Internet supongan un escenario que muy posiblemente no serı́a aceptado por un usuario. Por tanto, para facilitar la aceptación y distribución de esta aplicación se ha optado por prescindir de conexión con el exterior. 13 4. Planificación temporal 4.1. Planificación estimada del proyecto La realización de este proyecto tiene una duración estimada de cinco meses, con fecha de inicio el dı́a 11 de enero de 2016 y de finalización el 10 de junio de 2016. A lo largo de estos cinco meses, las horas de dedicación diarias fluctuarán en función del calendario laboral y lectivo. No obstante, el promedio de horas dedicadas por dı́a se estima en 4, lo cual hace un total de 620 horas. 4.2. Descripción de las tareas A continuación, se detallarán cronológicamente las tareas realizadas en este proyecto: 1. Primeros pasos: la primera tarea a realizar es la búsqueda de información, la cual se lleva a cabo mediante la lectura y comprensión de diversos artı́culos, tesis, capı́tulos de libros, etc. Una vez asimilado el contenido se seleccionan los conceptos relevantes con los cuales se quiere trabajar y se estructuran para la posterior redacción. Todo este proceso requiere una dedicación aproximada de 3 semanas y media. 2. Gestión del proyecto: las tareas que se desarrollan en la asignatura de Gestión de Proyectos están acotadas temporalmente por unos plazos preestablecidos. Mediante dichas tareas se define el alcance y contexto del proyecto, se realiza una estimación temporal de su duración y se estudia el impacto económico y su sostenibilidad. La duración total de estas tareas es de 6 semanas. 3. Recopilación y redacción: se lleva a cabo una selección e integración de la información más pertinente para una posterior redacción personalizada del contenido. Debido a la cantidad de fuentes que se han consultado y contrastado se necesitan más de 7 semanas para poder concluir esta tarea. 14 4 Planificación temporal 4. Desarrollo de la aplicación: para ello es necesario un proceso de aprendizaje autónomo sobre la programación en Android. Paralelamente se trabaja sobre el diseño que tendrá la aplicación y se empiezan a implementar algunas funcionalidades. Este proceso de implementación junto con su posterior redacción es el más extenso y se realiza a lo largo de más de 11 semanas. 5. Etapa final: para concluir el trabajo es necesaria una última revisión del contenido del mismo. Además, se realiza la preparación de la defensa oral que se lleva a cabo en una fecha posterior al 17 de junio. Ambas tareas ocupan 2 semanas y media. 4.3. Diagrama de Gantt En esta sección se muestra una tabla que especifica cada tarea junto con su tiempo requerido. Posteriormente, dicha tabla se presenta gráficamente en el diagrama de Gantt. Figura 4.1: Datos del diagrama de Gantt 15 4 Planificación temporal Figura 4.2: Diagrama de Gantt 16 4 Planificación temporal 4.4. Recursos A continuación, se enumeran los recursos utilizados a lo largo del proyecto: Hardware: − Ordenador portátil Fujitsu LifeBook S Series con Ubuntu 12.04. − Samsung Galaxy S3 con Android 4.4. Software: − Editor de texto Libre Office y Texmaker. − Entorno de programación Android Studio. 4.5. Valoración de alternativas y plan de acción La planificación temporal mostrada anteriormente ha sido diseñada teniendo en cuenta la carga lectiva y laboral que acompaña en paralelo al trabajo final de grado. Por este motivo se han solapado algunas tareas y se ha alargado la duración de alguna de ellas. No obstante, aún y habiendo adoptado estas medidas preventivas, es necesario identificar los principales obstáculos que podrı́an causar una desviación en la ruta fijada por el diagrama de Gantt. Éstos son mi grado de desconocimiento en ciertos ámbitos de los sistemas Android y la correcta compaginación de las diferentes actividades. En consecuencia, se ha fijado como fecha lı́mite el 10 de Junio, siete dı́as antes de la entrega final. Este margen de tiempo, combinado con los cinco dı́as de vacaciones de los que dispongo, será suficiente para solventar los imprevistos más susceptibles de ocurrir; ya que la jornada puede aumentarse a 15 horas diarias o las necesarias. Estos imprevistos están vinculados con la parte práctica de la aplicación. Si a lo largo del desarrollo del proyecto se considera, tanto por mi parte como por parte del director, que existe cierto peligro de no cumplir con el plazo de finalización del mismo se descartará la implementación de ciertas funcionalidades que requieren programarse de distintas formas para garantizar la compatibilidad con la gran mayorı́a de versiones de Android. Es decir, se acortará el target para que la aplicación funcione a la perfección en un número determinado de versiones. 17 5. Fundamentos teóricos 5.1. Sistemas Android Android fue fundado por Android Inc. en 2003 y adquirido por Google en 2005 [20]. Tres años después, a finales de 2008, verı́a la luz la primera versión oficial de este sistema, el cual tuvo una gran acogida por parte de usuarios y desarrolladores. Su rápida expansión provocó que sus competidores más cercanos, iOS y Windows Phone, se repartieran una menor parte del mercado y que sistemas operativos como BlackBerry y Symbian prácticamente dejasen de ser utilizados. Esta superioridad también es notable en la tienda de aplicaciones Google Play Store, la cual cuenta con más de 1,6 millones de aplicaciones, superando a Apple Apps Store, su principal competidor. Con una cuota de mercado estimada en el 82.8 %, Android se ha convertido en el sistema operativo más popular para smartphones y tablets con más de 350 millones de dispositivos activos y con expectativas de alcanzar los 1.000 millones en 2017. Google ha convertido a Android en uno de los competidores más importantes en el sector móvil. Gran parte de este éxito se debe al carácter open source de éste, el cual, a diferencia de otras plataformas, permite a fabricantes y desarrolladores integrar tanto su hardware como software con este sistema. Son varias las condiciones que posee Android que facilita el trabajo de los desarrolladores. De entre las más favorables destaca el uso de lenguajes de programación ampliamente extendidos como son Java y XML. Además, la guı́a para los desarrolladores y la documentación sobre las funcionalidades disponibles es extensa, detallada y dispone de diversos ejemplos de implementación. No obstante, a la par que proporciona ventajas también genera inconvenientes que afectan a desarrolladores y fabricantes de dispositivos. El más significativo hace referencia 18 5 Fundamentos teóricos a la fragmentación de la plataforma. Es decir, la cantidad de versiones existentes de Android, las cuales tienen integradas funcionalidades diferentes, hace que la compatibilidad entre dichas versiones se vea reducida, lo cual puede causar problemas de diseño y desarrollo a la hora de crear un aplicación. Sin embargo, hoy en dı́a en este sistema son más los puntos fuertes que débiles y en consecuencia los usuarios, desarrolladores y fabricantes se decantan preferiblemente por Android. 5.1.1. Arquitectura del sistema La complejidad del software que constituye el sistema operativo Android se organiza de forma modular, donde cada módulo consiste en una agrupación de funcionalidades y servicios afines. Esta organización permite a desarrolladores y a usuarios trabajar en un nivel de abstracción que no requiere profundos conocimientos del funcionamiento interno y proporciona comodidad para interactuar con el sistema. La interconexión de los distintos módulos se produce en forma de servicios que ofrece un módulo a otros de niveles superiores y al uso que hace éste de los de módulos inferiores, tal y como se ilustra en la siguiente figura. Figura 5.1: Arquitectura del sistema operativo Android 19 5 Fundamentos teóricos A continuación, se analizará cada uno de los cinco módulos ası́ como la relación que establecen con sus adyacentes. 5.1.1.1. Kernel El kernel de Linux es el módulo base sobre el cual se asenta todo el software de Android. La versión usada del kernel en los inicios de Android pertenece a la serie 2.6 y ésta evolucionó hasta la actual 3.18. Ambas cuentan con implementaciones adicionales para satisfacer necesidades especı́ficas de la plataforma. Tal y como ocurre en todos los sistemas Unix, el kernel proporciona drivers para que cualquier componente hardware pueda ser usado. Además, provee acceso al sistema de ficheros, funcionalidades de red, gestión de energı́a, memoria y procesos. A pesar de que Android esté basado en Linux, no se considera que sea una distribución de este último. De hecho, existen diferentes funcionalidades [2] que se han añadido a Android y otras que eran inherentes al kernel de Linux se han visto adaptadas. Las principales diferencias que han adoptado en Android son: Ashmem: hace referencia al sistema de memoria compartida (Anonymous SHared MEMory) que permite a múltiples procesos compartir recursos. El concepto Anonymous se debe a que los bloques en los que se divide la memoria no son asignados a un proceso de forma exclusiva, permitiendo ası́, por ejemplo, poder compartir un mismo icono entre aplicaciones. Binder: debido a que Google consideraba que los mecanismos estándar para la comunicación entre procesos (signals, pipes, sockets, memoria compartida, etc.) no eran lo suficientemente flexibles para Android, implementó su propio método llamado Binder, el cual se analizará en próximas secciones. Gestión de energı́a: Google diseñó un nuevo sistema de gestión de energı́a para poder dilatar la duración de la baterı́a de los dispositivos móviles. Para ello, se crearon drivers especı́ficos que controlan el consumo de componentes hardware, como es el caso de la iluminación de pantalla. 20 5 Fundamentos teóricos 5.1.1.2. Librerı́as Este módulo centraliza las librerı́as que proporcionan servicios al módulo Framework de la aplicación. Estas librerı́as están escritas en C/C++ e implementan llamadas a sistema que permiten a las aplicaciones hacer uso de las funcionalidades intrı́nsecas de Android. Por ejemplo, la librerı́a Surface Manager ofrece la capacidad de componer los diferentes elementos de navegación de pantalla ası́ como también gestionar las ventanas de las aplicaciones. Entre las librerı́as más representativas de Android se encuentran: Libc: incluye todas las cabeceras y funciones del lenguaje C. SQLite: permite la creación y gestión de bases de datos. WebKit: proporciona soporte para aplicaciones de tipo navegador. OpenGL y SGL: sustentan la capacidad gráfica 2D y 3D de Android. 5.1.1.3. Runtime El tiempo de ejecución de Android, más conocido como Runtime, se divide en dos diferenciadas secciones: las librerı́as del núcleo (Core Libraries) y la máquina virtual Dalvik (Dalvik VM). En cuanto a las librerı́as del núcleo, proporcionan una interacción directa con una instancia de la Dalvik VM. Están escritas, normalmente, en Java y son las encargadas de proporcionar soporte en la manipulación de ficheros, gestión de estructuras de datos, etc. Por otro lado, Dalvik es el nombre de la máquina virtual que utiliza Android para llevar a cabo la ejecución de sus aplicaciones. En lugar de hacer uso de la Java Virtual Machine (JVM), Google decidió crear su propia máquina virtual optimizada para entornos significativamente más reducidos en cuanto a recursos fı́sicos, es decir, dispositivos móviles. Esta optimización radica en la forma que tiene Dalvik de generar código ensamblador. En lugar de usar la pila, como hace hace la JVM, utiliza los registros como unidad primaria de almacenamiento; los cuales proporcionan un mejor rendimiento debido a la reducción de instrucciones necesarias [3]. 21 5 Fundamentos teóricos En la versión 4.4 de Android se introdujo una nueva máquina virtual, ART, para sustituir a la Dalvik. La principal diferencia entre ambas es el orden que establecen para compilar una aplicación. Mientras que en la Dalvik se realiza la compilación cuando una aplicación es lanzada por primera vez, en ART este proceso se realiza directamente en el momento de la instalación de la aplicación y tiene como consecuencia una mayor rapidez de ejecución. Puesto que la finalidad de esta sección es tener una visión panorámica de la arquitectura de Android, con un sondeo técnico, no se entrará en detalle en caracterı́sticas internas de estas máquinas virtuales. 5.1.1.4. Framework de la aplicación El Framework de la aplicación consiste en el conjunto de herramientas de desarrollo accesible a los programadores de aplicaciones. Las funciones que proporciona son un nexo entre el sistema y el desarrollador, a fin de que éste último pueda utilizar los recursos de Android sin necesidad de integrar complejas funcionalidades por su cuenta. Esta agrupación de tareas ya programadas que ofrece simples llamadas como medio de interacción, escondiendo la complejidad de trasfondo, se conoce como Application Programming Interface (API). Google, a lo largo de la evolución de Android, ha ido incorporando nuevas APIs a su sistema. A fin de mantener un histórico y tener organizadas las APIs según su aparición se agruparon por niveles, los cuales a principios de 2016 forman un total de 23. El primer nivel de API apareció en 2008 con la versión 1.0 de Android. A medida que ha pasado el tiempo han salido nuevas versiones de Android, identificadas con nombres diferentes (Cupcake, Eclair, Froyo, etc.) a las cuales se les atribuye un nivel de API distinto. A pesar de que cada nivel incluye algunas mejoras o funcionalidades nuevas, las siguientes APIs troncales [4] de este sistema siguen manteniendo la misma estructura: Activity Manager : proporciona un conjunto de métodos que permiten la gestión del ciclo de vida de las aplicaciones, ası́ como conocer el estado de los recursos del sistema. Además, permite consultar la memoria usada por un proceso, los servicios del sistema, entre otros. 22 5 Fundamentos teóricos Content Providers: gestionan la compartición de datos (contactos, agenda, mensajes, etc.) entre aplicaciones. Notification Manager : se encarga de comunicar al usuario eventos que ocurren en el sistema, como una llamada entrante, un mensaje recibido, baterı́a baja, etc. Telephone Manager : además de ser un potente sistema operativo, con complejas funciones, Android incorpora clases vinculadas a la finalidad esencial de un dispositivo móvil; la telefonı́a (llamadas, mensajes, etc.) View Manager : proporciona un gran número de elementos para poder construir las interfaces de usuario (GUI) de las aplicaciones. Window Manager : sus funcionalidades permiten la gestión de las ventanas, determinar cuáles son visibles y cómo se posicionan en la pantalla. Por otro lado, realiza automáticamente las transiciones y las animaciones de apertura y cierre de una aplicación, ası́ como también la rotación de éstas. Tal y como se verá más adelante, el hecho de tener conocimiento de cómo y mediante qué mecanismos se realizan las acciones del sistema, es decir, discernir entre las APIs que potencialmente pueden aprovechar agujeros de seguridad y las que no, será vital para poder realizar un ataque y/o una buena defensa. 5.1.1.5. Aplicaciones El módulo superior del software de Android está destinado a las aplicaciones, las cuales proporcionan una interfaz gráfica a los usuarios para que interactúen. Todas tienen la misma estructura y utilizan las APIs y librerı́as de módulos inferiores, permitiendo al programador desconocer los detalles de implementaciones internas. En función de su origen se distinguen dos tipos de agrupación: las aplicaciones nativas del sistema y las de terceras personas (ajenas al sistema). Las aplicaciones nativas se incluyen en la imagen del sistema y en caso de considerarse vitales no pueden ser desinstaladas o cambiadas por los usuarios. En consecuencia, se consideran seguras y por ello tienen mayores privilegios, a diferencia de las instaladas por los usuarios, para realizar acciones como el acceso al hardware, a librerı́as del sistema, etc. 23 5 Fundamentos teóricos Por otro lado, las aplicaciones ajenas al sistema se ejecutan en una Sandbox (Sección 5.2.1.1) individual para aislarlas de otras aplicaciones o de información sobre la cual el acceso no deberı́a estar permitido. La peligrosidad de éstas, aunque hayan sido descargadas de la tienda de Google, es que pueden incorporar código malicioso que se salte todo tipo de control y pueda comprometer el dispositivo, tal y como se verá en próximas secciones. 5.1.2. Arquitectura de una aplicación Las aplicaciones son la pieza clave del sistema operativo Android y las que lo dotan de todo su potencial. El desarrollo de éstas se realiza principalmente mediante dos lenguajes; Java para gestionar la parte funcional (aunque también podrı́an emplearse otros lenguajes como C/C++) y XML para tratar la parte visual, es decir, los componentes de la interfaz gráfica. Toda aplicación consiste de un conjunto de componentes, que pueden ser usados por los desarrolladores, y requiere de un entorno creado por el sistema que permita la ejecución segura de una aplicación. Ambos conceptos se ven ilustrados en la siguiente figura. Figura 5.2: Arquitectura de una aplicación Como puede observarse, Android crea un proceso donde ejecutará una instancia de la máquina virtual Dalvik, la cual será el entorno real en el que correrá una aplicación. 24 5 Fundamentos teóricos Ésta, a su vez creará hilos de ejecución (Threads) para gestionar cada uno de los principales componentes: Actividades, Servicios, Content Providers y Broadcast Receivers. El análisis de los componentes que conforman la estructura de una aplicación se muestra en las siguientes secciones. 5.1.2.1. Android Manifest A pesar de no considerarse un componente como tal, toda aplicación necesita tener un documento XML en el directorio raı́z llamado AndroidManifest.xml. Este fichero proporciona información precisa de los componentes que usará la aplicación. Se podrı́a entender como una declaración de intenciones, es decir, el programador se ve forzado a definir lo que necesita para que el usuario pueda tener una cierta garantı́a de que esa aplicación es lo que dice ser. Por ejemplo, si se requiere del permiso para acceder a Internet, éste será mostrado al usuario en el momento de la instalación para que dé su conformidad. Si la aplicación a parte de Internet necesita enviar un mensaje de texto no podrá hacerlo a menos que haya sido declarado explı́citamente el permiso necesario. 5.1.2.2. Actividades Una Activity es el principal componente de las aplicaciones en Android. Su función es llevar a cabo una actividad concreta y normalmente va acompañada de una interfaz gráfica mediante la cual el usuario interactúa con la aplicación. En el AndroidManifest.xml se pueden declarar tantas actividades como el programador crea necesarias. Cada una de ellas puede interactuar con las otras o colaborar independientemente en el desarrollo de una tarea. Por ejemplo, una aplicación para gestionar el correo puede hacer uso de una primera Activity para listar los contactos, una segunda para escribir un nuevo correo, otra para añadir un adjunto, etc. Un factor que tienen en común las actividades que se crean en Android es el ciclo de vida, donde se define un conjunto de estados por los cuales puede pasar una Activity. Existe un total de siete estados relacionados entre ellos que permiten especificar el comportamiento de la aplicación en todo momento, tal y como se puede observar en la siguiente figura. 25 5 Fundamentos teóricos Figura 5.3: Ciclo de vida de una Activity Estos estados son descritos y agrupados por Google de la siguiente manera [5]: Ciclo de vida entero: engloba desde el estado onCreate(), el cual sucede cuando se crea la Activity, hasta el estado onDestroy(), que libera los recursos reservados por el sistema. Ciclo de vida visible: abarca desde el estado onStart() hasta onStop(). Durante este tiempo el usuario puede ver la ventana de la aplicación e incluso interactuar con ella. Si otra Activity es lanzada, la anterior pasa al estado onStop() y en caso de que el sistema no la elimine por falta de recursos, volverá al estado onStart() pasando previamente por onRestart(). 26 5 Fundamentos teóricos Ciclo de vida en primer plano: este ciclo es el que se da entre los estados onResume() y onPause(). Entre ellos, la Activity afectada se encuentra en un primer plano y es la que mantiene el foco de entrada. El estado onPause(), es llamado, por ejemplo, cuando se produce un mensaje emergente que requiere el foco o cuando la actividad del usuario cesa durante un tiempo y el dispositivo entra en modo reposo. El conocimiento de estos estados y las transiciones que se producen entre ellos es fundamental para saber cómo se comportará la aplicación en todo momento. Esto se experimentará más adelante. 5.1.2.3. Servicios Un servicio es un componente diseñado para realizar tareas en un segundo plano sin la necesidad de proporcionar una interfaz gráfica al usuario. Los servicios son usados con frecuencia para gestionar operaciones que requieren de un largo tiempo de ejecución, como por ejemplo la descarga de un fichero, sin cortar la interacción del usuario con la aplicación. A diferencia de los servicios del sistema, los cuales siempre están ejecutándose, los servicios de las aplicaciones se inician y se paran bajo demanda de la aplicación o bien por la intervención del usuario. Éstos se dividen en: enlazados y desenlazados. Los servicios enlazados (Bounded services) se invocan mediante la llamada bindService() y se caracterizan por ofrecer una interfaz cliente-servidor al resto de componentes que quieran interactuar. Estos componentes son clave para mantener la ejecución del servicio, ya que la desconexión de todos y cada uno de ellos provocará la destrucción del servicio. Por otro lado, los servicios desenlazados (Unbounded services) se crean mediante la función startService() y se ejecutan indefinidamente hasta que se auto-destruyen o bien son parados por los usuarios. Su ejecución es independiente de la del componente que los ha iniciado debido a que la destrucción de este último no implicarı́a una parada del servicio. En la siguiente figura se muestra gráficamente el ciclo de vida de un servicio enlazado (derecha) y uno desenlazado (izquierda). 27 5 Fundamentos teóricos Figura 5.4: Ciclo de vida de un servicio 5.1.2.4. Content providers Los proveedores de contenido, Content Providers, gestionan el acceso a la información de una aplicación. En concreto, permiten almacenar, recuperar, actualizar y compartir los datos de una aplicación mediante el uso de un conjunto de métodos. Tal y como se muestra en el siguiente esquema, los datos pueden ser almacenados en un fichero, en una base de datos SQLite o en cualquier otro formato. Para acceder a ellos, las aplicaciones pueden instanciar un objeto Content Resolver para poder comunicarse con el Content Provider y acceder ası́ a la información o a un subconjunto de ésta. Dicho acceso puede realizarse tanto desde actividades como servicios. 28 5 Fundamentos teóricos Figura 5.5: Funcionamiento de los Content Providers 5.1.2.5. Broadcast recievers Un aspecto caracterı́stico del diseño del sistema operativo Android es que cualquier aplicación puede lanzar un componente perteneciente a otra aplicación. Por ejemplo, si un usuario quiere hacer uso de la cámara del dispositivo móvil dentro de una aplicación, en lugar de que ésta incorpore una Activity con todo el código necesario para hacer una fotografı́a, lo que se hace es invocar a una aplicación que ya realice de por si dicha tarea y libere al programador de tener que implementarla. Este proceso es totalmente transparente al usuario. Debido a que el sistema ejecuta cada aplicación en un proceso diferente, no existe una comunicación directa con las otras aplicaciones. Por ello, para hacer uso de la cámara, la aplicación deberá comunicárselo al sistema y éste se encargará de escoger la aplicación disponible para dicha tarea. Concretamente, el sistema difundirá este evento y la aplicación que esté a la espera de tal evento responderá ofreciendo sus funcionalidades. Esta predisposición de las aplicaciones a reaccionar ante eventos se implementa mediante el uso de Broadcast Receivers. Este componente principal de una aplicación Android no precisa de interfaz gráfica y en caso de necesitar notificar un evento por pantalla, por ejemplo un SMS recibido, puede hacer uso de la API Notification Manager, vista anteriormente. 29 5 Fundamentos teóricos 5.2. Seguridad en Android En esta sección se analizarán los principales mecanismos que implementa Google para securizar Android. Éstos conforman el llamado modelo de seguridad de Android, en el cual se establece el conjunto de medidas necesarias para proteger las zonas más crı́ticas y propensas a ser atacadas: sistema de ficheros, memoria, zonas restringidas al sistema, etc. Por otro lado, una vez vista la seguridad nativa de Android, se mostrarán las insuficiencias que sufre dicho modelo y las extensiones propuestas que han aportado investigadores a fin de paliar las brechas de seguridad existentes y hacer este sistema más robusto. 5.2.1. Modelo de seguridad Tal y como se acaba de comentar, el modelo de seguridad de Android son las medidas de protección implementadas de serie en cada versión de este sistema. A continuación, se detallarán los aspectos más relevantes de este modelo, como son la filosofı́a de seguridad, el control de acceso a recursos y a memoria, las comunicaciones internas, entre otros. 5.2.1.1. Sandboxing Tal y como se ha mencionado anteriormente, Android crea un nuevo proceso que inicializa una instancia de la máquina virtual Dalvik con el fin de ejecutar una aplicación. Este entorno creado para cada aplicación, conocido como Sandbox [6], tiene como finalidad proporcionar aislamiento entre aplicaciones. Como resultado, una aplicación no puede acceder a datos ni código de otras. Este aislamiento se complementa con el sistema de seguridad que Android adoptó de Linux; los identificadores únicos. Cada aplicación, en el momento de su instalación recibe un identificador único (UID) para poder ser diferenciada de otras aplicaciones. De este modo, se pueden aplicar restricciones de acceso con mayor facilidad. El objetivo de este diseño es proporcionar un entorno estable, seguro y reducido para que el impacto de la ejecución de una aplicación al resto del sistema sea el menor posible. Es por esto que las Sandboxes son usadas con regularidad para escanear aplicaciones en busca de malware y prevenir ası́ la infección a otras aplicaciones. 30 5 Fundamentos teóricos 5.2.1.2. Gestión de permisos Debido a que las aplicaciones se ejecutan en una Sandbox, y por tanto sólo pueden acceder a sus propios ficheros y a recursos globales del sistema, Google tuvo que implementar un mecanismo que permitiera a las aplicaciones, de forma segura y controlada, tener una serie de privilegios a fin de poder proporcionar a los usuarios funcionalidades más avanzadas. De esta necesidad surgieron los derechos de acceso, conocidos como permisos. El pilar sobre el cual se sustenta la seguridad de una aplicación radica en los permisos, los cuales restringen las operaciones que se pueden llevar a cabo, como por ejemplo, el acceso a Internet, al uso de la cámara, etc. Por defecto, una aplicación no tiene ningún permiso asociado que permita realizar acciones perjudiciales al usuario o a los datos del sistema. Es por eso que, para dotar a una aplicación de funcionalidades más complejas, los desarrolladores necesitan declarar los permisos mı́nimamente necesarios en el fichero AndroidManifest.xml. En el momento de la instalación, Android consulta este fichero y muestra por pantalla todos y cada uno de los permisos que serán concedidos a la aplicación. En cuanto el usuario da su aprobación, la instalación sigue su curso y se asignan los permisos de manera irrevocable y sin la necesidad de una confirmación adicional en el momento de la ejecución. Existen cuatro categorı́as para clasificar los permisos: Normal : en esta categorı́a se agrupan los permisos que proporcionan a las aplicaciones acceso a caracterı́sticas aisladas, las cuales tienen un riesgo mı́nimo para otras aplicaciones, el sistema o el usuario. No requieren de una aprobación explı́cita, aunque el usuario siempre tiene la posibilidad de ver cuáles son. Dangerous: estos permisos otorgan acceso a las aplicaciones a datos privados del usuario o proporcionan un control sobre el dispositivo que puede impactar negativamente sobre el sistema. Requieren permiso explı́cito por parte del usuario. Signature: este permiso sólo se concede si la aplicación solicitada está firmada con el mismo certificado que la aplicación que declara el permiso. SignatureOrSystem: la otorgación de este tipo de permiso sigue la misma norma que el tipo Signature y además se atribuye a aplicaciones del sistema. 31 5 Fundamentos teóricos El hecho de depositar gran parte de la seguridad de Android en el uso de los permisos ha sido un tema discutido en la comunidad tecnológica [7] debido a que éstos, en última instancia, requieren de la intervención humana. Aunque es un hecho necesario, a fin de que los usuarios tengan potestad sobre su privacidad, la metodologı́a usada por Android es cuestionada. Otras alternativas han sido propuestas para mejorar la seguridad, como por ejemplo especificar con mayor detalle las acciones que podrı́an realizarse detrás de cada permiso, o bien requerir el consentimiento del usuario en el momento de la ejecución en lugar de hacerlo únicamente durante la instalación; permitiendo ası́ una mejor asociación e interpretación del motivo por el cual se requiere cierto permiso. 5.2.1.3. Acceso a memoria Desde los inicios de Android, la memoria del sistema ha sido un importante punto de interés a atacar. Esto es debido a que las técnicas usadas para corromper la memoria permiten llevar a cabo una escalada de privilegios, lo cual se traduce en la posibilidad de ejecutar comandos sin restricciones. La corrupción de memoria ocurre cuando el contenido de la memoria de una aplicación es modificado debido a errores de programación. Cuando la aplicación accede a este contenido deja de funcionar. Este hecho puede ser aprovechado por atacantes para inyectar código en esa región de memoria y reconducir ese error ejecutando los comandos que permitan al atacante crear un impacto en el sistema. Para llevar a cabo esta corrupción existen múltiples técnicas que permiten el desbordamiento del buffer de la memoria (Buffer Overflow). En cada versión de Android se han ido añadiendo diferentes mecanismos de protección para mitigar los efectos que estas técnicas iban produciendo. Las incorporaciones más destacadas que han tenido lugar desde las primeras versiones de Android son: ProPolice, NX, ASLR [8]. ProPolice se incorporó a partir de la versión 1.5. Su funcionamiento se basa en el uso de ’canarios’ para evitar ataques de desbordamiento del buffer. Los ’canarios’ consisten en un conjunto de valores situados en ciertas zonas de la memoria cuyo valor se comprueba para detectar ası́ si ha habido un desbordamiento. 32 5 Fundamentos teóricos NX (No eXecute) es un mecanismo incluido a partir de la versión 2.3 con el objetivo de prevenir la ejecución de código en memoria (heap y pila). Consiste en un bit que permite marcar ciertas áreas de la memoria para que en caso de ser accedidas se impida su ejecución. ASLR (Address Space Layout Randomization) fue creado en la versión 4.0 para paliar los nuevos vectores de ataque de corrupción de memoria. Debido a que el éxito de esta corrupción radica en el conocimiento que tiene el atacante sobre la localización del ejecutable en la memoria, el ASLR asigna posiciones de memoria de manera aleatoria; impidiendo que el atacante conozca la ubicación exacta. Estas medidas de seguridad, de forma aislada, son insuficientes para proteger el acceso indebido a memoria. Esto se debe a que a raı́z de la aparición de NX se aplicaron otras técnicas de ataque, como por ejemplo Return-Oriented Programming, que eluden la protección de NX o heap spraying que evitan el efecto de ASLR. En consecuencia, para garantizar una buena protección de la memoria es necesario usar una combinación de ambas (NX y ASLR), ya que se complementan mutuamente. 5.2.1.4. Protección de datos El contenido privado de un usario es el bien más preciado y por tanto deben aplicarse medidas de protección que eviten tener que depositar toda confianza únicamente en el aislamiento que proporciona una Sandbox, ya que éste no es suficiente, y garanticen la confidencialidad e integridad de los datos. Android proporciona mecanismos para proteger la información de un dispositivo y de las comunicaciones que se realicen con el exterior. Por un lado, proporciona un control de acceso general que puede aplicarse por medio de un PIN numérico, patrones e incluso en los dispositivos más actuales reconocimiento de huella dactilar. No obstante, cuando un atacante tiene acceso fı́sico a un dispositivo, estos métodos no suponen un gran contratiempo [9] para acabar accediendo a los datos. Por otro lado, Android permite a los desarrolladores implementar aplicaciones que permitan el cifrado de datos. Para ello, les ofrece diversos algoritmos criptográficos que pueden aplicarse de una forma cómoda y sin requerir altos conocimientos de criptografı́a. Este cifrado, aplicado con una configuración correcta, securiza los datos almacenados y las comunicaciones que se realicen con un servidor externo. 33 5 Fundamentos teóricos Sin embargo, en este último caso, Android facilita aún más esta tarea debido a que aconseja utilizar el protocolo HTTPS, sin tener que hacer configuraciones extras. Además, en caso de querer establecer un túnel, Android recomienda usar la clase HttpsURLConnection o SSLSocket; desalentando al desarrollador a implementar su propio protocolo. No obstante, si éste se viera forzado a hacerlo, al menos deberı́a asegurarse de usar un algoritmo criptográfico como AES o RSA y descartar la posibilidad de crear uno propio. La clase Cipher de Android proporciona llamadas a funciones que permiten aplicar los algoritmos de cifrado de una forma limpia y cómoda, tal y como se verá más adelante. 5.2.1.5. Signatura de código Toda aplicación en Android está contenida en un archivo .apk, el cual incluye tanto los ficheros de código como otros recursos (imágenes, audio, etc.). Este .apk debe contener una firma digital en el momento de la instalación, de lo contrario Android denegará este proceso impidiendo la ejecución de la aplicación en el dispositivo. Este rechazo a aplicaciones que no incluyen dicha firma también se aplica en la polı́tica que tiene Google Play (tienda oficial de aplicaciones) a la hora de permitir la publicación de la aplicación. Mediante la signatura de código (firma digital) se consigue identificar el autor de una aplicación ası́ como también facilitar las actualizaciones que ésta requiera. Además, permite que dos o más aplicaciones de un mismo desarrollador puedan interactuar con mayor facilidad. Las aplicaciones pueden estar firmadas por una entidad externa o auto-firmadas. En este último caso, Android permite la firma mediante el uso de certificados generados por los propios desarrolladores, sin necesidad de participaciones externas. Esta firma se realiza mediante un proceso criptográfico que hace uso de certificados digitales. 5.2.1.6. Binder Debido a que por razones de seguridad y estabilidad los procesos deben estar aislados y tener su propio espacio de direcciones en la memoria es necesario un mecanismo que permita la comunicación entre ellos (Inter-Process Communication). Tal y como se ha mencionado anteriormente, Binder [10] es el mecanismo que usa Android para permitir dicha comunicación. 34 5 Fundamentos teóricos Binder surge como una alternativa a otros mecanismos de comunicación empleados en sistemas basados en el kernel de Linux, como son signals, semáforos, pipes, etc., aportando funcionalidades adaptadas al sistema Android. La manera en la que Binder gestiona la comunicación entre procesos se observa en la siguiente figura. Figura 5.6: Comunicación entre procesos mediante Binder Tal y como se muestra, cuando el proceso A quiere comunicarse con el B necesita hacer uso de un cliente Binder para que emplee el método transact(), el cual contendrá la referencia del objeto destino, el identificador del comando a ejecutar (por ejemplo BINDER WRITE READ) y un buffer con datos a enviar. Toda esta información se transmite al driver de Binder en el kernel de Linux. Éste añade información que permite identificar al proceso A y la envı́a al B para que éste decida si permite que se realicen las acciones del primero. La seguridad de este mecanismo radica en el hecho de que es el kernel quien identifica al proceso A e impide que éste pueda falsear maliciosamente su identidad; previniendo ası́ una escalada de privilegios. 5.2.1.7. SEAndroid SEAndroid [12] es un mecanismo de control de acceso que deriva de SELinux. Éste, a su vez, se creó como alternativa al modelo de seguridad que incorporaban los sistemas Unix. 35 5 Fundamentos teóricos En Unix, y por extensión en sistemas basados en el kernel de Linux, la polı́tica de seguridad se regı́a por el Discretionary Access Control (DAC). Éste es un mecanismo, basado en permisos, mediante el cual el usuario puede establecer una polı́tica de seguridad para permitir o denegar el acceso a un recurso del cual es propietario, por ejemplo controlar quién puede escribir o leer un fichero que haya creado. Una de las caracterı́sticas de DAC es que el usuario puede transferir la propiedad que tiene sobre un recurso y determinar el acceso de otros usuarios. Esto puede dar lugar a situaciones en las que los usuarios establezcan permisos inseguros a recursos. Para dar solución a este problema, se creó una nueva extensión de seguridad: SELinux (SecurityEnhanced Linux). SELinux incorpora un mecanismo de control de acceso diferente a DAC. En concreto, su polı́tica de seguridad está basada en el Mandatory Access Control (MAC), en el cual es el sistema, en lugar del usuario, el que establece los permisos necesarios de acceso sobre un recurso. De tal forma que los usuarios no pueden tener un impacto, accidental o malintencionado, sobre los recursos del sistema. Este factor de seguridad previene que el usuario realice una escalada de privilegios. Debido a que SELinux se integró en el kernel de Linux y Android está basado en dicho kernel, serı́a lógico pensar que podrı́a funcionar en este último. No obstante, tal y como se ha visto anteriormente, Android incorpora sus propias modificaciones en el kernel, lo cual hace necesario adaptar SELinux; motivo por el que se creó SEAndroid (SecurityEnhanced Android). Una de las principales adaptaciones que se tuvieron que realizar sobre SELinux fue el soporte a la comunicación entre procesos mediante Binder. Además, se tuvieron que añadir librerı́as necesarias como la libselinux para conseguir una completa interacción. Por otro lado, un factor interesante de seguridad que se añadió a SEAndroid fue Middleware MAC. Éste consiste en un control de acceso a nivel de Framework y, por tanto, separado de la implementación MAC que se realiza a nivel de kernel. Su finalidad es imponer un conjunto de restricciones que complementen las polı́ticas por las cuales se rige MAC. 36 5 Fundamentos teóricos 5.2.2. Extensiones de seguridad Tal y como se ha observado, el epicentro de la seguridad en Android consiste en el aislamiento de las aplicaciones, la signatura de código y el control de acceso mediante permisos y polı́ticas. Estas incorporaciones nativas de seguridad no son suficientes para garantizar un entorno seguro al usuario, el cual es el último responsable de permitir la instalación de una aplicación. A parte del impacto que puedan tener la decisiones erróneas de un usuario, existen ciertas vulnerabilidades en Android que son aprovechadas por atacantes y por el malware que crean. Uno de los principales objetivos de éstos es evadir todas las restricciones de acceso y control que impone Android, es decir, hacer una escalada de privilegios hasta conseguir realizar acciones con total autoridad en el sistema. En este sentido, Android no proporciona los suficientes mecanismos de protección para evitar dicha toma de control. Para llevar a cabo una escalada de privilegios existen dos técnicas diferentes: Confused deputy y Colluding. La primera, menos usada, hace referencia a situaciones en las cuales una aplicación maliciosa emplea métodos de engaño, aprovechando vulnerabilidades en funciones que se encargan de importar archivos, para confundir a otras aplicaciones con mayores privilegios. Por otro lado, la segunda técnica consiste en aprovechar la transitividad de permisos entre aplicaciones. Por ejemplo, un desarrollador puede implementar una aplicación que requiera acceso a INTERNET y otra con el permiso READ SMS, de tal modo que puedan combinar sus funcionalidades para permitir la lectura de los mensajes del dispositivo desde el exterior. Dicha combinación podrı́a resultar sospechosa y ser detectada, mediante extensiones de seguridad, como potencialmente peligrosa. Por este motivo, aprovechando la facilidad de comunicación entre aplicaciones que comparten firma de un mismo desarrollador, se distribuyen los permisos para conseguir privilegios que no son permitidos y realizar ası́ una escalada de privilegios. Otro aspecto difı́cil de controlar en Android es el uso que hacen las aplicaciones sobre los datos privados de un usuario. Éstas pueden esconder sus verdaderas intencionalidades detrás de permisos que parecen necesarios para la aplicación y estar obteniendo información privada sin el conocimiento del usuario. Este hecho se conoce como fuga de información. 37 5 Fundamentos teóricos Por los motivos anteriormente mencionados, entre otros, se han realizado investigaciones para incorporar nuevos mecanismos de protección al modelo de seguridad de Android, alguno de los cuales, como por ejemplo SEAndroid, se han incorporado de forma nativa en recientes versiones. En la figura 5.7 se muestra una recopilación de las extensiones de seguridad más populares separadas por la temática a la que atañen. Algunas de ellas serán analizadas en los siguientes apartados. Figura 5.7: Extensiones de seguridad 5.2.2.1. Kirin Kirin [13] es una extensión de seguridad que tiene como finalidad impedir la instalación de aplicaciones sospechosas de tener un comportamiento malicioso. Debido a que para los usuarios es difı́cil conocer el alcance real de los permisos que aceptan pueden estar dando consentimiento a las aplicaciones para que actúen a su libre albedrı́o. Es aquı́ donde interviene Kirin, no permitiendo la instalación de aplicaciones con algunos permisos que considera dañinos. Kirin utiliza reglas de seguridad predefinidas para detectar posibles combinaciones peligrosas de permisos en una misma aplicación. 38 5 Fundamentos teóricos No obstante, sólo lleva a cabo este proceso de forma individual, es decir, analiza una aplicación pero no es capaz de detectar una posible fuga de información a causa de la combinación de permisos entre aplicaciones. Algunos ejemplos de reglas representativas son: 1. Una aplicación no puede tener el permiso SET DEBUG APP 2. Una aplicación no puede tener el permiso RECORD AUDIO y INTERNET 3. Una aplicación no puede tener el permiso SEND SMS y WRITE SMS Existe una extensión opcional que, una vez se ha analizado una aplicación, muestra al usuario una lista detallada de todos los permisos que podrı́an tener un impacto en el sistema. De este modo, el usuario es consciente de lo que puede implicar aceptarlos y ası́ decide si proceder con la instalación o no. 5.2.2.2. AdDroid Otra herramienta de protección de software malicioso (malware) es AdDroid [14]. A diferencia de Kirin, AdDroid se focaliza en un ámbito concreto: las librerı́as de publicidad. Cuando una agencia de publicidad quiere dar a conocer su producto a un amplio público, la forma más fácil de hacerlo es contactar con los desarrolladores de las aplicaciones más descargadas. Éstos incorporarán en su código las librerı́as de publicidad que les serán otorgadas, las cuales proporcionan APIs que permiten la ubicación de dicha publicidad dentro de la aplicación y gestionan la interacción con el usuario cuando pulsa sobre ésta. El proceso de comunicación de estas librerı́as con el exterior queda ilustrado en la siguiente figura: Figura 5.8: Comunicación entre librerı́as de publicidad y Android 39 5 Fundamentos teóricos Tal y como puede observarse, las librerı́as de publicidad se comunican con la aplicación y ésta es la que accede, mediante el uso de Binder, a recursos y servicios del sistema. Por tanto, de este comportamiento se deduce que dichas librerı́as gozarán de los mismos privilegios que tenga la aplicación. Esto se produce debido a que Android es incapaz de diferenciar qué componente de la aplicación es el que realiza la petición, lo cual supone un agujero de seguridad potencialmente peligroso. Con la finalidad de regular las comunicaciones en Android que se realizan debido a la incorporación de librerı́as de publicidad, se crearon diversas herramientas, entre las cuales destaca AdDroid. Esta extensión de seguridad establece los permisos necesarios mı́nimos para que una aplicación que requiera publicidad pueda mostrarla de forma segura al usuario. Esto se realiza mediante el uso de una librerı́a y un servicio de AdDroid, los cuales se comunican de forma segura sin hacer uso de librerı́as de terceros. El servicio de AdDroid es el encargado de gestionar la conexión con la publicidad y aportar abstracción a este proceso entre la aplicación y la agencia, como se muestra en la figura 5.9. Figura 5.9: Comunicación entre librerı́as de publicidad y Android usando AdDroid 40 5 Fundamentos teóricos 5.2.2.3. XManDroid A parte del malware existen otro tipo de amenazas, como la escalada de privilegios, tal y como se ha descrito anteriormente, que no son prevenidas por Android. Es por este motivo por el cual surgen extensiones como XManDroid, QUIRE, IPC Inspection, etc. En este apartado se analizará XManDroid [15], el cual protege ante situaciones que conducen a una escalada de privilegios, ya sea mediante la técnica de Colluding o Confused deputy. XManDroid (eXtended Monitoring on Android) es una extensión de seguridad que se encarga de monitorizar y analizar, en tiempo de ejecución, las comunicaciones que se establecen entre las aplicaciones. Su finalidad es detectar las combinaciones de permisos potencialmente peligrosas que resultan de dichas comunicaciones. El funcionamiento interno se rige entorno a una polı́tica de seguridad basada en reglas predeterminadas. Consiste en comprobar que los permisos del emisor en la comunicación no suponen un riesgo para el usuario y el sistema cuando se combinan con los permisos del receptor. Dicha polı́tica de seguridad es parecida a la que implementa Kirin para prevenir la instalación de aplicaciones maliciosas, pero en lugar de hacerlo de forma individual actúa sobre la interacción entre aplicaciones; permitiendo ası́ que un conjunto aislado de permisos no pueda combinarse para proporcionar mayores privilegios de los concedidos. Algunos ejemplos de estas reglas predefinidas para identificar comunicaciones peligrosas son: 1. Una aplicación que tiene permiso para leer SMS del usuario no puede comunicarse con otra aplicación que pueda conectarse a Internet. 2. Una aplicación que reaccione ante una llamada entrante y tenga el permiso de grabar audio no puede comunicarse con una aplicación que pueda conectarse a Internet. 3. Una aplicación que puede obtener la información de localización no puede comunicarse con una aplicación que pueda conectarse a Internet. 41 5 Fundamentos teóricos 5.2.2.4. ASF Debido a que la escalada de privilegios puede darse en los diferentes módulos (niveles) que componen el sistema operativo Android, diversas extensiones de seguridad se crearon para ofrecer una protección multinivel. Una de ellas es la ya mencionada SEAndroid, la cual fue incorporada posteriormente como protección nativa del sistema. A parte de SEAndroid, una importante contribución en la securización de Android es la extensión ASF [18] (Android Security Framework). Actualmente, las soluciones de seguridad creadas para reforzar la insuficiente protección que ofrece Android se aplican de dos formas distintas. La primera consiste en el desarrollo de software que se incorpora a modo de parche en el módulo del sistema que se ve afectado y la segunda se basa en integrar, de forma nativa, dicho software en nuevas versiones de Android. Ambas situaciones, a pesar de proporcionar remedio a las carencias del sistema, presentan inconvenientes relacionados con la total adaptación de las extensiones, la dificultad que supone un correcto mantenimiento y actualización, etc. Debido a este contexto se creó ASF, el cual se propone como la solución que permite integrar, tanto a nivel de kernel como de aplicación, cualquier extensión de seguridad ofreciendo, por un lado, una completa adaptación y compatibilidad con el sistema y demás extensiones, y por otro lado, un conjunto de APIs para que los desarrolladores de extensiones de seguridad puedan integrar sus implementaciones con mayor facilidad y abstracción. La arquitectura de seguridad de Android, tal y como se ha ido desgranando a lo largo del proyecto, se ve reflejada en la figura 5.10. Como puede observarse, una aplicación puede realizar llamadas a sistema para comunicarse con el kernel a fin de poder acceder, por ejemplo, a la SDCard. Para ello, hará uso de un conjunto de APIs que, después de pasar los controles de acceso DAC y MAC, tramitará la petición del usuario. Por otro lado, una aplicación puede hacer uso del mecanismo de comunicación entre procesos (Binder) para acceder a los servicios del sistema que estén dentro de su alcance. 42 5 Fundamentos teóricos Figura 5.10: Arquitectura de seguridad de Android Tomando como base el esquema anterior, ASF se integra completamente en cada uno de los diferentes módulos, tal y como se observa en la figura 5.11. Las incorporaciones que se muestran marcadas en color azul son funciones dedicadas a proteger un recurso en concreto del módulo sobre el cual actúan. Dichas funciones tienen comunicación entre ellas para garantizar un flujo de seguridad ininterrumpido. Por otro lado, los módulos de seguridad, mostrados de color verde, son los encargados de la toma de decisiones seguras en base a un conjunto de polı́ticas establecidas. Figura 5.11: Arquitectura de seguridad implantada por ASF 43 5 Fundamentos teóricos 5.2.2.5. TaintDroid Las extensiones de seguridad descritas hasta el momento están enfocadas a proteger al usuario de software malicioso capaz de comprometer el sistema. No obstante, el uso que hacen las aplicaciones con los datos privados de los usuarios no entra en el alcance de protección. Por este motivo se desarrollaron herramientas como TaintDroid [15]. TaintDroid se propone como solución de seguridad al insuficiente control que proporciona Android a los recursos (fotografı́as, documentos, etc.) particulares de los usuarios. Su funcionamiento se basa en realizar un seguimiento a cada recurso para que sea posible monitorizar el flujo de datos entre aplicaciones. El análisis que realiza TaintDroid de múltiples recursos, potencialmente sensibles, simultáneamente es en tiempo real para proporcionar un feedback instantáneo al usuario. De este modo, éste último será consciente del uso concreto, y posiblemente malicioso o poco lı́cito, que está haciendo una aplicación sobre un recurso determinado. Esto es posible gracias al sistema de etiquetado de recursos de TaintDroid, el cual permite hacer un seguimiento a través de los distintos módulos del sistema, tal y como se muestra en la siguiente figura. Figura 5.12: Seguimiento multinivel de recursos de TaintDroid Como se observa, TaintDroid no sólo rastrea y registra movimientos de ficheros sino que también permite etiquetar métodos que hacen uso de librerı́as, variables de programación (int, float, etc.) y mensajes transmitidos a través de Binder. Un estudio [19] realizado con TaintDroid sobre las aplicaciones más descargadas de Google Play reveló que dos terceras partes de éstas hacen un uso inapropiado de recursos del usuario y sistema mediante el uso de permisos aparentemente inofensivos. 44 5 Fundamentos teóricos Por ejemplo, se detectó que en múltiples aplicaciones se enviaba el identificador único del dispositivo y número de teléfono a un servidor externo. 5.3. Inseguridad de la información Hoy en dı́a, el avance tecnológico ha conseguido facilitar de tal modo la vida de las personas que prácticamente no se contempla seguir usando métodos rudimentarios del pasado. Las potentes funcionalidades de los nuevos dispositivos que han salido al salido al mercado en esta última década han cambiado la forma en la cual las personas organizan su tiempo, sus actividades y su información. Estos dispositivos, a diferencia de los ordenadores convencionales, tienen la caracterı́stica de ser ligeros y ofrecer cómodas prestaciones para un uso diario y continuado. Cada vez más disponen de mayor capacidad para almacenar gran cantidad de contenido multimedia, documentos de texto y en general cualquier información que se pueda representar en bytes. Los cibercriminales son conscientes de este auge tecnológico y en consecuencia se han modernizado adaptando su forma de actuar. Mediante el uso de las nuevas tecnologı́as es posible obtener información de los usuarios de un sistema sin que apenas lleguen a saberlo. Dicha información engloba todo tipo de contenido sensible que puede ser almacenado en un smartphone, tablet, portátil, etc. Android se ha convertido en un extendido sistema operativo móvil y este hecho no ha pasado desapercibido para los cibercriminales, los cuales han invertido en conocimiento para poder actuar con éxito sobre dicha plataforma. Utilizan multitud de métodos distintos que de forma genérica pueden agruparse en ataques a la tecnologı́a y ataques a los usuarios. A menudo es necesario una combinación de ambos para lograr su objetivo. En cuanto a los ataques a la tecnologı́a, en este caso concreto Android, el modus operandi consiste en buscar vulnerabilidades conocidas que tenga la plataforma e intentar explotarlas sobre un dispositivo en concreto. Este método puede ser bastante efectivo contra aquellos usuarios que dispongan de una versión obsoleta o no soportada por los desarrolladores de Android. En caso de que esto no fuera fructuoso, el cibercriminal podrı́a analizar las comunicaciones externas del dispositivo a fin de encontrar cifrados y/o protocolos débiles, lo cual le permitirı́a interceptar el tráfico (Man in the middle). 45 5 Fundamentos teóricos Esta tarea serı́a más exitosa aún si el usuario interactúa con aplicaciones que envı́en las credenciales en texto plano, es decir, sin cifrar. Otros ataques más avanzados sobre Android consistirı́an en encontrar vulnerabilidades no conocidas (0 days) para aplicaciones que utiliza el sistema. A modo de ejemplo, si se consiguiera encontrar un bug en Adobe Reader que permitiera explotar otras vulnerabilidades y obtener acceso privilegiado sobre el sistema, los usuarios que abrieran un archivo .pdf malicioso serı́an infectados. No obstante, este tipo de ataque requiere de altos conocimientos técnicos para desarrollarlo. Si los métodos anteriores, entre otros posibles no mencionados, no permitieran la substracción de la información deseada se deberı́an buscar opciones alternativas que requieran la colaboración (in)consciente del usuario. Por tanto, el escenario de ataque planteado en un principio cambia: si no se puede entrar desde fuera que sea el usuario quien abra desde dentro. Aquı́ es donde entra el conjunto de ataques dirigidos a los usuarios, los cuales pueden entregar el control de su sistema sin saberlo. El conjunto de técnicas para llevarlos a cabo se conoce como ingenierı́a social, la cual se detalla en la siguiente sección debido a su alta implicación con la finalidad del proyecto. Una vez aplicada con éxito sobre el usuario, los atacantes ya han conseguido evadir la restricción de acceso que les impedı́a absoluta libertad y pueden hacer uso de malware que permita robar información, espiar comunicaciones, mantener conexión constante entre vı́ctima y atacante, propagarse a fin de infectar otros contactos, cifrar los datos del usuario para una posterior extorsión, destruir el sistema de ficheros, etc. Debido a la inmensidad de técnicas existentes contra sistemas y usuarios, ası́ como también el amplio abanico de software malicioso que puede ser usado, el foco de este proyecto se ha fijado en proporcionar una implementación práctica que proporcione protección al usuario para evitar que sea vı́ctima de un tipo concreto de ingenierı́a social: el Shoulder Surfing. 5.3.1. Ingenierı́a social La ingenierı́a social engloba un conjunto de técnicas que se basan, de forma genérica, en la manipulación y engaño de las personas con la finalidad de evadir los sistemas de seguridad y obtener información sensible y confidencial. 46 5 Fundamentos teóricos Es decir, es el arte de persuadir a los usuarios para que lleven a cabo acciones que tengan un impacto negativo en su privacidad o en la de la organización en la cual trabajen. Por otro lado, la ingenierı́a social también incluye métodos en los cuales no se requiere de la interacción con el usuario para obtener la información deseada, lo cual hace que la substracción de datos sea sigilosa e inadvertida ante éste. El éxito de todas estas técnicas no radica en los avanzados conocimientos técnicos del atacante sino en sus habilidades sociales para ganarse la confianza de los usuarios de un sistema sin que éstos sospechen de sus verdaderos propósitos. A menudo se recurre a la ingenierı́a social cuando otros tipos de ataques, de carácter técnico, no consiguen vulnerar el sistema atacado o bien obtener la información necesaria para hacerlo. Por más que los desarrolladores de software optimicen sus sistemas y solucionen las vulnerabilidades que tienen sus productos, la confidencialidad e integración de los datos sensibles almacenados en ellos dependerá de la administración y gestión de los usuarios sobre dicho software. Por este motivo es por el cual las técnicas de ingenierı́a social cobran gran importancia y fijan su objetivo en el usuario; el eslabón más débil de la cadena. Dos de éstas técnicas han afectado a un alto porcentaje de usuarios en Android: Drive by download : este método se basa en la descarga de apps maliciosas de forma automática cuando el usuario visita una web, la cual puede estar diseñada para tal finalidad o simplemente haber sido vı́ctima de la intrusión de un cibercriminal. Estas aplicaciones presentan un nombre inofensivo para engañar al usuario e incitarlo a abrirlas sin preocupación. La simple descarga por sı́ sola no compromete el sistema sino que requiere de un usuario confiado y curioso que la instale. Phishing : esta técnica es un clásico para engañar a un usuario independientemente del sistema operativo que esté usando. No obstante, desde la aparición de los nuevos dispositivos móviles se ha incrementado el uso de Phishing. Esta técnica consiste en enviar un email a la vı́ctima en nombre, por ejemplo, de su entidad bancaria y proporcionarle un enlace para que ingrese a su supuesta cuenta. El éxito de engañar al usuario se incrementa si éste usa un sistema operativo como Android, el cual, a fin de proporcionar mejor experiencia al usuario, oculta la URL accedida. Por otro lado, haciendo uso de algunos componentes disponibles en el desarrollo de una aplicación es posible incrustar una web maliciosa sin ni siquiera presentar la URL al usuario, con lo cual éste puede llegar a confiar en el sitio web simplemente por ver una interfaz gráfica idéntica a la de su entidad bancaria. 47 5 Fundamentos teóricos Éstas dos técnicas tan sólo son una pequeña representación de los distintos vectores de ataque destinados a comprometer la seguridad de Android. A continuación, se comentarán con más profundidad dos técnicas incluidas dentro de la ingenierı́a social que están más estrechamente relacionadas con la aplicación que se ha desarrollado en este proyecto. La primera, Shoulder Surfing, es la técnica a la que se quiere neutralizar con la implementación práctica de este trabajo. La segunda, Tapjacking, es la manera de utilizar maliciosamente la funcionalidad que en este caso se ha aplicado para proteger al usuario. 5.3.1.1. Shoulder Surfing Shoulder Surfing es una de las técnicas más fáciles de llevar a cabo ya que no requiere tener conocimiento técnico alguno. Como se ha mencionado con anterioridad, este método consiste en observar, con el mayor grado de disimulo posible, las acciones que está realizando otro usuario con su dispositivo. Hay situaciones en las cuales es inevitable usar un smartphone sin que las personas que están alrededor se percaten de cuál es el PIN del usuario, patrón, qué comenta por Whatsapp, qué imagen abre, etc. Esta proximidad hace que sea mucho más fácil la substracción de información, no obstante, desde una cierta lejanı́a también es posible predecir dónde está pulsando el usuario para introducir el PIN de desbloqueo. Este hecho puede conseguirse, por ejemplo, haciendo uso de las recientes gafas de realidad aumentada de Google u otro dispositivo capaz de grabar y ampliar la imagen con nitidez. Por otro lado, existen situaciones en las cuales las personas de alrededor no son desconocidos sino todo lo contrario. En estos casos puede resultar incómodo decirle a un amigo, compañero de trabajo, jefe, etcétera, que desvı́e momentáneamente la vista del dispositivo para que no vean la introducción de una contraseña o PIN. Entonces suele darse un momento de confianza forzada que conlleva a mostrar información sensible. Sea cual sea la situación, el resultado acaba siendo la perdida de privacidad por parte del usuario. A fin de solucionar dicho suceso, el desarrollo práctico de este proyecto aportará una medida de protección adicional que permitirá mantener la privacidad del usuario e impedirá que el simple hecho de mirar disimuladamente el dispositivo de otro usuario sea una tarea totalmente exitosa. 48 5 Fundamentos teóricos 5.3.1.2. Tapjacking Otra técnica usada para engañar al usuario y obtener información de éste es Tapjacking. A diferencia del Shoulder Surfing, esta técnica requiere de la interacción del usuario para que se realice correctamente. Su funcionamiento consiste en mostrar al usuario una interfaz que parezca una aplicación interactiva pero en realidad no es más que una ventana que deja pasar los taps a través de ella permitiendo que el usuario esté realizando acciones sin saberlo. Por ejemplo, el usuario puede ver en un primer plano una pantalla opaca con un texto que le indique ’Pincha el globo’ y un globo que vaya apareciendo en distintas partes de la pantalla. A cada pulsación sobre el supuesto globo, el usuario inconscientemente puede estar seleccionando opciones de configuración que puedan comprometer su seguridad, como por ejemplo habilitar la instalación de aplicaciones procedentes de fuentes no seguras. Figura 5.13: Tapjacking Una variante de esta técnica consiste en sobreponer una pantalla y asignarle la propiedad de invisibilidad. De este modo el usuario verá a través de ella pensando que la aplicación en primer plano con la que está interactuando es la que puede ver en pantalla. No obstante, todos los taps que introduzca serán recogidos en primer lugar por la pantalla transparente y luego se transferirán a la pantalla que se encuentra justo detrás de ésta. 49 5 Fundamentos teóricos Este caso se muestra gráficamente en la siguiente figura, donde se observa como las credenciales introducidas en una aplicación de una entidad bancaria podrı́an ser interceptadas y enviadas a un servidor externo. Figura 5.14: Tapjacking con pantalla transparente Para ello tan sólo es necesario implementar un servicio que esté a la escucha de los taps que introduce el usuario y almacene las coordenadas de cada uno de ellos a fin de mapearlas posteriormente con las teclas pulsadas. Como se puede observar en el siguiente código, los componentes View y WindowManager permiten crear una ventana a la cual se le indica que debe estar atenta a las pulsaciones que se produzcan sobre el dispositivo (34). Código 5.1: Código principal para implementar tapjacking 50 5 Fundamentos teóricos Acto seguido, a dicha ventana se le asignan un conjunto de flags para que tenga las propiedades deseadas. El primero le indica que debe situarse por encima de otras aplicaciones (38), el segundo le asigna la propiedad de escuchar los eventos (pulsaciones) que sucedan tanto dentro como fuera de la ventana (39) y el último le atribuye la propiedad de ser transparente al usuario (40). No obstante, Google se percató de este tipo de ataque y actualizo sus librerı́as de tal modo que las versiones con una API level mayor o igual a 14, lo que corresponde a versiones de Android 4.0 en adelante, ya no son vulnerables a este tipo de ataque. Por otro lado, los desarrolladores pueden implementar en sus aplicaciones el atributo android:filterTouchesWhenObscured=’true’ para impedir que sus aplicaciones reciban los taps cuando otra aplicación se sobrepone. De este modo el usuario podrá percatarse de que algo fuera de lo normal está ocurriendo. 51 6. Desarrollo del proyecto 6.1. Descripción de la aplicación Tal y como se ha descrito anteriormente, ésta aplicación tiene como objetivo aportar un grado más de seguridad a los usuarios que requieran de proteger datos sensibles en su dispositivo móvil. Para ello, la aplicación cuenta con una interfaz que proporciona al usuario un conjunto de funcionalidades para personalizar la protección que quiera llevar a cabo. Dicha interfaz se muestra en las siguientes figuras, donde se pueden diferenciar los dos paneles principales. Figura 6.1: Panel Configuración Figura 6.2: Panel Protección Como puede observarse, el diseño ha sido implementado de tal forma que el usuario tenga una visión rápida y concisa de qué puede hacer con esta aplicación. 52 6 Desarrollo del proyecto Es por eso que se ha optado por dividirla en sólo dos paneles; el de Configuración, el cual permite gestionar el comportamiento de la aplicación, y el de Protección, que muestra los recursos que pueden ser protegidos. Entrando un poco más en detalle, el panel Configuración proporciona los siguientes cinco ı́tems: Estado de la protección: esta entrada permite iniciar y detener la protección que ofrece la aplicación. De este modo, cuando el usuario se encuentre en un lugar en el cual crea que está lo suficientemente seguro como para no necesitar ningún bloqueo podrá desactivar dicha protección con tan sólo dos taps; sin necesidad de navegar a través de múltiples menús. Además, tendrá la opción de hacerlo durante un tiempo determinado (30min, 1h, 4h, 8h o hasta próximo reinicio), lo cual hará que se reactive la protección pasado ese tiempo sin necesidad de volver al panel Configuración. Establecer PIN: este ı́tem permite configurar el PIN que protegerá a las aplicaciones que haya elegido el usuario cuando éstas sean lanzadas. El bloqueo con PIN es el primer factor que debe afrontar el usuario para entrar a una aplicación restringida. Establecer taps invisibles: esta opción es la pieza angular de la aplicación. Proporciona al usuario la posibilidad de añadir un segundo factor de autenticación una vez ha introducido correctamente el PIN. Para ello le permite establecer el número de taps y la posición de éstos en la pantalla. Este segundo factor también se puede deshabilitar y dejar sólo el bloqueo con PIN por defecto. Entrenamiento: esta entrada proporciona al usuario un lugar en el cual practicar su precisión para acertar sus taps. Esta funcionalidad se ha implementado porque una vez se configura el patrón con dichos taps; los cuales son mostrados por pantalla al usuario, ya no los volverá a ver debido a que la pantalla transparente que los recoge no muestra información sobre la posición pulsada. Historial: en esta opción se mostrará al usuario el listado de aplicaciones protegidas junto con el número de aciertos y fallos que se han realizado para cada una de ellas. Además, la fecha y hora del último acceso también quedarán reflejadas. De este modo el usuario podrá saber si se ha realizado algún intento de espionaje sobre su dispositivo durante el tiempo que se ha ausentado de éste. 53 6 Desarrollo del proyecto En cuanto al panel Protección, como puede observarse en la figura anterior, hay cuatro tipos de recursos que pueden ser protegidos con la aplicación. El recurso principal, para el cual ha sido diseñada esta app, es el conjunto de aplicaciones que hay en sistema. Complementariamente se han añadido el conjunto de imágenes, vı́deos y archivos del usuario en el dispositivo. La protección de éstos tres últimos funciona diferente a la protección de aplicaciones debido a razones técnicas que se explicarán más adelante. 6.2. Procedimiento El funcionamiento principal de la aplicación se realiza en un segundo plano, es decir, sin necesidad de interactuar con la interfaz gráfica. Esto se consigue mediante el uso de un servicio que está activo todo el tiempo. La finalidad de este servicio es detectar las aplicaciones lanzadas y aplicar el bloqueo a aquellas que se han seleccionado para protegerlas. Para ello, lo ideal serı́a que el servicio estuviera en un estado de reposo y una vez se lanzara dicha aplicación se despertara para actuar. Sin embargo, cuando una aplicación se lanza, el sistema no envı́a información al resto de las aplicaciones sobre este hecho, lo cual hace que no sea factible implementar un broadcast receiver para este evento en el servicio. Por tanto, es necesario implementar un método de espera activa. Éste consiste en consultar repetidamente si ha ocurrido tal evento en lugar de esperar un aviso por parte de éste. La contrapartida de este método es el consumo de baterı́a, pero actualmente es la única opción que ofrece Android. Una vez detectada la aplicación, el siguiente paso serı́a guardar el nombre de ésta, impedir que se abra, lanzar la aplicación de bloqueo y en caso de que se introdujese correctamente el PIN volver a lanzar la aplicación protegida sin pedir esta vez el PIN. No obstante, una aplicación no puede detener a otra a no ser que tenga el permiso de root y el dispositivo esté rooteado. Sólo está permitido detener activities que compartan el mismo UID, es decir, dentro de una misma aplicación. 54 6 Desarrollo del proyecto Esto obliga a aceptar que dicha aplicación se abrirá sı́ o sı́ y es entonces cuando el servicio en segundo plano debe lanzar la app de bloqueo para que se posicione justo encima e impida ver el contenido de la protegida. Este escenario provoca que se cree una situación difı́cil de controlar. Ésta se produce entre el lanzamiento de la aplicación a proteger y la espera activa del servicio que consulta si debe o no activar la protección. Por ejemplo, si el servicio comprueba cada dos segundos cuál es la aplicación que está en primer plano y justo después el usuario lanza la que se tiene que proteger, el tiempo hasta que el servicio vuelva a hacer la consulta será tiempo en el cual se previsualizará el contenido de la app protegida. El problema se puede resolver reduciendo el tiempo de consulta del servicio pero esto tiene un impacto en el consumo de energı́a. Una vez se ha lanzado la protección con bloqueo, el siguiente paso es recoger el PIN introducido y validar el acceso. En caso de que sea correcto, el servicio comprobará si el usuario habilitó el segundo factor de autenticación y en caso afirmativo lanzará una pantalla transparente. Ésta se encargará de recoger los taps que introduzca el usuario y comprobar que lo haya hecho en la posición correcta (con un margen de error también elegido por el usuario). Si este proceso lo realiza satisfactoriamente, la pantalla transparente desaparecerá como si nada hubiera pasado, es decir, no mostrará ningún mensaje de acierto al usuario y le permitirá interactuar con la aplicación protegida. En caso contrario, el servicio volverá a lanzar la pantalla de bloqueo con PIN simulando un comportamiento inesperado de la aplicación pero sin informar de la existencia de un segundo factor invisible que ha sido fallido. Todo este procedimiento tiene como finalidad proteger con discreción, de tal modo que un observador no reciba ningún tipo de información sobre lo que realmente está ocurriendo. 6.3. Diagrama de flujo En esta sección se detallará gráficamente, mediante un diagrama de flujo, todo el procedimiento explicado en la sección anterior. Pero antes se mostrará el diagrama que hubiera sido ideal para optimizar el uso de la baterı́a pero que no ha sido posible implementar por las cuestiones técnicas ya comentadas. 55 6 Desarrollo del proyecto El diagrama de flujo ideal sobre el cual se parte y se adapta a las condiciones de Android puede observarse en la siguiente figura. Figura 6.3: Diagrama de flujo ideal El inicio de todo el proceso radica en que el sistema operativo comunica al servicio que la aplicación que se quiere proteger ha recibido una petición de lanzamiento (A). Entonces, el servicio cierra la aplicación (B) antes de que llegue a mostrarse por pantalla y en su lugar abre la aplicación de bloqueo (C). El resto del procedimiento (D, E, F, G) corresponde a la validación del PIN y de los taps posteriores. Debido a que los tres primeros pasos marcados en rojo no pueden implementarse de la forma mostrada se han reemplazado por la espera activa del servicio, la cual chequea constantemente si se ha abierto alguna de las aplicaciones que el usuario ha marcado como protegidas. Ésta se muestra en la siguiente figura. Figura 6.4: Espera activa del servicio 56 6 Desarrollo del proyecto Por otro lado, y debido a la restricción que impide cerrar otras apps, hay una nueva situación a contemplar que no se da en el diagrama ideal y sı́ en el real. Ésta se produce durante la comprobación del PIN, ya que es un estado en el cual se espera un input por parte del usuario y no realiza ninguna otra acción hasta que no se envı́e dicho PIN a validar. En este punto, un usuario malintencionado puede aprovechar que la aplicación a proteger no ha sido cerrada y retomarla porque todavı́a está en la pila de tareas recientemente abiertas. En la siguiente figura se muestra dicha situación, en la cual la aplicación a proteger en este caso es la calculadora. Figura 6.5: Pila de tareas recientemente abiertas Esta lista de tareas recientes se obtiene pulsando el botón Home de los dispositivos con sistema operativo Android y, como se puede ver, resulta bastante sencillo evadir la protección que proporciona Double Lock tan sólo seleccionando la aplicación calculadora en esta lista. Para paliar este bypass se ha introducido otra espera activa que consulta constantemente si el usuario está intentando cambiar de aplicación y en caso afirmativo volverı́a a lanzar el bloqueo. A continuación, se muestra la parte del diagrama de flujo que representa tal acción. 57 6 Desarrollo del proyecto Figura 6.6: Comprobación de cambio de aplicación En el siguiente diagrama de flujo se puede observar el procedimiento completo que seguirá el servicio, el cual es resultado de la combinación de las distintas partes mostradas anteriormente. Figura 6.7: Diagrama de flujo final 6.4. Funcionalidades A continuación, se analizará cada funcionalidad desde la perspectiva de un desarrollador, es decir, se mostrará el código y las decisiones tomadas en cada situación. Debido a que la aplicación consta de 38 clases Java y 36 ficheros XML, haciendo un total aproximado de 10.800 lı́neas de código, se seleccionará un extracto representativo de las clases más relevantes. 58 6 Desarrollo del proyecto 6.4.1. Estado de la protección Tal y como se ha mencionado anteriormente, la aplicación Double Lock cuenta con una funcionalidad que permite el inicio y la detención del servicio que corre en segundo plano. El acceso a ésta se ha ubicado en la primera entrada del menú Configuración a fin de proporcionar comodidad y rapidez al usuario. Por otra parte, se permite deshabilitar la protección temporalmente haciendo que el usuario no necesite volver a acceder para habilitarla de nuevo. Para ello se proporciona la siguiente interfaz gráfica al usuario, la cual le permite realizar este proceso con tan sólo dos taps. Figura 6.9: Protección deshabilitada Figura 6.8: Opciones disponibles El código necesario para implementar dicha funcionalidad se muestra en el código 6.1. Solamente requiere consultar el estado actual (101-102) guardado en el espacio de memoria que dispone cada aplicación, conocido como SharedPreferences, y hacer uso del widget AlertDialog para mostrar las opciones preestablecidas. Una vez el usuario elige la opción que quiere, la función pararServicioTemporalmente (113) es llamada con los parámetros deseados (30 minutos, 1 hora, 4 horas, 8 horas o hasta reinicio). 59 6 Desarrollo del proyecto Código 6.1: Opciones para deshabilitar la protección Cuando dicha función se ejecuta, lo primero que hace es establecer una alarma (199-201) que levantará de nuevo la protección cuando haya pasado el tiempo elegido (205,209). Código 6.2: Configuración de la alarma Finalmente, se para el servicio que está en ejecución haciendo uso del método stopService. Como se observa en el código 6.3, en función de la versión de Android del dispositivo se ejecutará una función u otra. Esta decisión técnica se explicará más adelante. Código 6.3: Parada del servicio 60 6 Desarrollo del proyecto La configuración de la alarma, con la elección correcta de sus parámetros, permite reducir el consumo de baterı́a debido a que el sistema avisará a la aplicación una vez haya transcurrido el tiempo, mediante los broadcast receivers explicados en secciones anteriores, en lugar de ser la aplicación quien pregunte si es el momento indicado o no. La siguiente figura muestra el código para levantar el servicio (23-24) cuando salte la alarma. Código 6.4: Ejecución de la alarma 6.4.2. Establecer PIN El primer factor de protección que aparece cuando se lanza una aplicación protegida es el bloqueo mediante PIN. Éste se configura en la Activity de la figura 6.10, y los parámetros que requiere son: el PIN actual, el nuevo PIN, la repetición de éste, y un número de contacto para restablecer el PIN en caso de olvido. Figura 6.11: Ventana de bloqueo Figura 6.10: Establecer PIN 61 6 Desarrollo del proyecto En un primer diseño de esta sección se optó por restablecer el PIN mediante el envı́o de un email a la cuenta del usuario. No obstante, esta solución requiere del permiso Internet que ofrece Android, y tal y como se ha explicado anteriormente, existen técnicas maliciosas que combinan este permiso junto con otros para llevar a cabo acciones que pueden tener un impacto totalmente negativo en la confidencialidad de los usuarios. Por tanto, a fin de proporcionar mayor confianza a éstos del uso de Double Lock se ha descartado usar Internet. En base a este hecho, la aplicación enviará en su lugar un SMS al número de teléfono que se haya introducido. Serı́a preferible que éste fuera el de una persona de total confianza. Si se optara por poner el mismo número del dispositivo actual, el SMS se previsualizarı́a en el mismo y no aportarı́a ningún tipo de protección. También se puede elegir la opción de no introducir ninguno si el usuario cree estar convencido de no olvidar el PIN. En las siguientes figuras se muestra la ventana de bloqueo de la aplicación principal (Double Lock) junto con la funcionalidad que restablece el PIN. A diferencia de la ventana de bloqueo anterior, ésta incorpora un texto clickable por si el usuario olvida su código. La decisión de ponerlo sólo en la aplicación principal tiene como objetivo dificultar el envı́o involuntario de SMS. Figura 6.12: Bloqueo principal Figura 6.13: Restablecer PIN 62 6 Desarrollo del proyecto Mediante el siguiente código se recogen los parámetros introducidos por el usuario, se validan (72) y se procede a almacenarlos en SharedPreferences (75,79). No obstante, en esta ocasión se hace uso de una librerı́a externa (SecurePreferences) para almacenar el PIN cifrado con AES (Advanced Encryption Standard) y reforzar ası́ la protección. Código 6.5: Configuración del PIN La función comprueba() es la encargada de revisar los parámetros introducidos y devolver error en caso de una mala configuración. La parte relevante a destacar es el uso de la ya mencionada librerı́a SecurePreferences (97,98), la cual permite trabajar de forma cómoda y segura con los datos de SharedPreferences. Código 6.6: Uso de SecurePreferences 6.4.3. Establecer taps invisibles En este apartado el usuario tendrá la opción de fortalecer su protección mediante la activación de los taps invisibles. Una vez lo haga se activará la otra opción que aparece en la figura 6.14, deshabilitada en un principio, y que proporciona una solución para evitar la previsualización del contenido durante la introducción de los taps. 63 6 Desarrollo del proyecto Para ello permite elegir una imagen de la galerı́a y establecerla como la Activity que recogerá dichos taps. De este modo, una vez se introduce correctamente el PIN, en lugar de previsualizar el contenido de la aplicación protegida se mostrará dicha imagen. Es decir, no habrá ninguna transparencia y por tanto un observador podrá identificar que existe otro factor de protección. Sin embargo, se gana en privacidad. Figura 6.14: Taps con transparencia Figura 6.15: Taps sin transparencia Cuando el usuario ha elegido sus preferencias, el siguiente paso es empezar a registrar las posiciones en pantalla donde pulsa. Esta acción se representa mediante un cı́rculo verde por cada pulsación. Paralelamente se muestra un cronómetro que indica el tiempo que tarda el usuario en introducir los taps. Este tiempo será el que esperará la Activity transparente antes de comprobar los inputs recibidos. Transcurrido ese tiempo y en caso de haber un acierto inferior al 100 % aparecerá de nuevo la ventana de bloqueo impidiendo el acceso a la aplicación protegida. 64 6 Desarrollo del proyecto Para finalizar el proceso, el usuario deberá pulsar el botón Stop y elegir entre repetirlo de nuevo o bien avanzar y guardar los taps en la memoria de la aplicación. Figura 6.16: Introducción de taps I Figura 6.17: Introducción de taps II Tal y como se muestra en las siguientes figuras, el diámetro puede ser ajustado dependiendo de la precisión de acierto que quiera el usuario. Figura 6.19: Modificación del radio II Figura 6.18: Modificación del radio I 65 6 Desarrollo del proyecto Al pulsar el botón Siguiente se mostrará un mensaje informando del establecimiento correcto de los taps y preguntando al usuario si desea practicarlos o bien volver al menú principal. La primera opción se detallará en la siguiente sección. Figura 6.20: Taps establecidos El código de todo este proceso involucra diversas clases Java. Por tanto, para no hacer tan ardua la lectura al lector, se mostrará la implementación de un número reducido de funciones; las cuales harán de hilo conductor para explicar técnicamente las figuras anteriores. La primera de ellas, como se observa en el código 6.7, es la encargada de detectar las coordenadas de los diferentes taps. Para ello se hace uso del método onTouch que proporciona Android, el cual permite de forma cómoda recoger dichos valores (89,90). Esta información se almacena en una clase Punto, creada con anterioridad, junto con el tiempo transcurrido hasta ese momento (98,99). Por otro lado, la representación gráfica de estos puntos se hace mediante el método onDraw y la declaración de un objeto Canvas. A este último se le aplica un conjunto de propiedades que darán formato a los puntos (48-51) y posteriormente se usa su método drawCircle (54,58,63) para mostrarlos por pantalla. 66 6 Desarrollo del proyecto Código 6.7: Recogida de taps del usuario Código 6.8: Representación gráfica de los taps Una vez haya introducido los taps que desea y quiera seguir adelante deberá pulsar el botón Siguiente. En él se implementa el código necesario para recopilar dichos taps (148), el tiempo total transcurrido (149) y el radio (150) elegido para determinar la zona de acierto válida. Estos valores se almacenan en SharedPreferences (153-157) y acto seguido se invoca a la Activity Finalizar (159,160). 67 6 Desarrollo del proyecto Código 6.9: Almacenamiento de los taps 6.4.4. Entrenamiento Con la finalidad de proporcionar al usuario un mejor recuerdo sobre los taps que ha configurado, la funcionalidad Entrenamiento le permite introducirlos y evaluar su precisión. Como se muestra en las siguientes figuras, primero aparece una pantalla con un temporizador iniciado en tres segundos que le indica cuando debe empezar a introducir los taps. Esto permite al usuario estar preparado e introducirlos dentro del tiempo correcto. Figura 6.22: Taps de entrenamiento Figura 6.21: Pantalla introductoria 68 6 Desarrollo del proyecto A diferencia de la sección anterior, esta vez no se muestra el botón Stop sino que automáticamente se cierra la pantalla transparente después del tiempo ya establecido. Acto seguido, se muestra gráficamente las zonas consideradas válidas y los resultados numéricos: número de taps correctos y tiempo total. Figura 6.23: Visualización gráfica I Figura 6.24: Resultados I Figura 6.25: Visualización gráfica II Figura 6.26: Resultados II 69 6 Desarrollo del proyecto El código para implementar esta funcionalidad es bastante parecido al mostrado en la sección anterior. No obstante, en esta ocasión se debe determinar si los taps marcados en rojo se encuentran dentro de las circunferencias verdes y con su correcto orden de introducción. Para tal finalidad se ha implementado el método evalua que se aprecia en la siguiente figura. Su primera comprobación es que el número de taps introducidos sea el mismo que el almacenado (86-89). En caso de ser el mismo se pasa a verificar si cada uno de ellos es correcto o no mediante las coordenadas cartesianas (92-94). Finalmente, la función devuelve True si ha habido un acierto absoluto y el tiempo del último tap se encuentra dentro del tiempo establecido. Código 6.10: Evaluación de los taps introducidos 6.4.5. Historial La entrada Historial del menú Configuración es la encargada de recopilar la información de uso de la aplicación Double Lock en el sistema. Proporciona un registro para que el usuario tenga los datos concretos sobre el acceso a una aplicación protegida. Éste incluye el número de accesos correctos, fallidos y fecha del último acceso. De este modo, si el usuario tiene a alguien en su entorno que conoce el PIN e intenta espiar sin ser detectado, la aplicación lo reflejará en el historial; dejando al descubierto dicha vulneración de la intimidad. Tal y como se observará a continuación, en el historial aparecen las aplicaciones que actualmente están protegidas. Si el usuario desprotege alguna de éstas, su entrada en el historial desaparecerá pero seguirá conservando sus contadores. 70 6 Desarrollo del proyecto Por otro lado, si decide reiniciar dichos contadores podrá hacerlo de forma individual pulsando encima de cada aplicación, o bien pulsar el icono de la papelera para reiniciarlos todos. Figura 6.27: Historial de accesos Figura 6.28: Reinicio de contadores Para implementar dicha funcionalidad se ha usado un ListView para mostrar las aplicaciones y una base de datos para recoger los valores de cada una de ellas. En el siguiente código se puede observar cómo se selecciona la plantilla gráfica (fichero layout asociado) (273) que contiene el aspecto genérico que tendrá cada entrada. Código 6.11: Gestión de cada entrada del historial 71 6 Desarrollo del proyecto Seguidamente, se trata de manera individual cada ı́tem recogiendo su nombre e icono (277-280) y asignándolos a la posición de la interfaz que les corresponde. Finalmente, se instancian los campos que mostrarán los valores almacenados (283-285) y se llama a la función openHistId (287) pasándole el nombre de la aplicación a buscar en la base de datos. Como se aprecia en el código 6.12, esta función inicia una conexión con la base de datos (336), la cual ha sido creada en otra clase Java, y consulta el método creado getHistId para obtener y asignar la información de los accesos a su posición concreta dentro la interfaz. Código 6.12: Obtención de valores de la base de datos 6.4.6. Protección de aplicaciones Una vez analizadas las funcionalidades del panel Configuración, a continuación se explicarán las del panel Protección. Para empezar se detallará la funcionalidad principal de la aplicación: la protección de otras aplicaciones. Tal y como se muestra en la siguiente imagen, las aplicaciones instaladas en el sistema se muestran ordenadas alfabéticamente junto con su icono asociado. Para proteger cualesquiera de ellas, el usuario deberá pulsar encima de la que desee y podrá observar un candado verde indicando que esa aplicación se ha marcado a proteger. Para cancelar la protección bastará con que vuelva a pulsar sobre la misma. 72 6 Desarrollo del proyecto Figura 6.29: Aplicaciones a proteger Para obtener el listado de las aplicaciones instaladas se ha creado la clase LoadApplications que se observa a continuación. En ella, el proceso de búsqueda de las aplicaciones (130) se ha implementado dentro del método doInBackground de la clase AsyncTask. Éste permite realizar tareas en un segundo plano a la vez que muestra por pantalla, por ejemplo, un mensaje (139), acompañado de una rueda de progreso, para informar al usuario que se todavı́a continua el proceso. La decisión de hacerlo en segundo plano se ha tomado debido a que el tiempo que tardaba la aplicación en listar los resultados de su búsqueda oscilaba entre los tres y seis segundos, lo cual daba una primera sensación de no haber encontrado nada o de estar a punto de bloquearse. Esta sensación desaparece al mostrar el mensaje informativo sobre el estado actual dentro del método onPreExecute. Código 6.13: Realización de la búsqueda en segundo plano 73 6 Desarrollo del proyecto El código anterior realiza una llamada al método buscaLauncher que se muestra en el código 6.14, el cual consulta todas las aplicaciones que en su AndroidManifest.xml hay declarada la propiedad Launcher; que permite a una aplicación poder ser lanzada por el usuario. Código 6.14: Búsqueda de aplicaciones en el sistema Cuando se ha pulsado encima de una aplicación con la finalidad de protegerla, esta información debe almacenarse en la memoria reservada de Double Lock para que el servicio que se encarga de lanzar el bloqueo pueda acceder a consultarla en cualquier momento. Este sencillo proceso puede verse en la siguiente imagen, donde primero se intenta cargar el listado de aplicaciones protegidas (261,262), en caso de existir, luego se añade la nueva aplicación a proteger (264-268) y acto seguido se almacena de nuevo esta información (270-272). Código 6.15: Guardar aplicaciones protegidas 74 6 Desarrollo del proyecto 6.4.7. Protección de contenido privado Complementariamente a la protección de aplicaciones se ha decidido ofrecer la capacidad al usuario de proteger su contenido privado, entendiendo por éste imágenes, vı́deos y archivos. La utilización del método de protección que se ha empleado para las aplicaciones es ineficaz en el caso de este contenido. Esto es ası́ debido a que es posible acceder a éste evitando el factor de protección. Por ejemplo, un usuario malintencionado que tuviera acceso momentáneo al dispositivo de otro podrı́a usar el explorador de archivos para acceder a dicho contenido y enviarlo por correo. Por otro lado, otras aplicaciones instaladas con el permiso de lectura del almacenamiento interno y/o externo serı́an capaces de conseguir dicho material sin ningún inconveniente. Por tanto, para proteger el contenido del usuario se deben buscar otros métodos. Uno de ellos podrı́a consistir en renombrar los archivos poniéndoles un punto delante para ocultarlos a otras aplicaciones y prevenir que puedan ser abiertos. Sin embargo, el contenido sigue estando en el mismo lugar y visible a través de un explorador de archivos. Otro método consiste en mover los archivos que se quieren proteger a la memoria interna de la aplicación de protección. No obstante, esto sólo previene el acceso de otras aplicaciones a dicho contenido pero no lo protege del acceso manual mediante un explorador de archivos. Además, tiene como problema añadido que la memoria interna suele ser de menor capacidad que la externa y por tanto no tendrı́a capacidad suficiente de proteger una gran cantidad archivos. Debido a las vulnerabilidades que presentan estos métodos se ha optado por cifrar directamente el archivo en el mismo lugar donde está almacenado en memoria y sólo poder visualizar el contenido mediante la aplicación Double Lock. De este modo, a pesar de que a través de un explorador se pudiera acceder al material protegido y enviarlo por Internet o Bluetooth, éste seguirı́a estando inaccesible. Para cada uno de los tres tipos de contenido se ha creado una interfaz gráfica y se ha dotado de funcionalidades diferentes aunque comparten gran parte del proceso de cifrado. Tal y como se muestra en las siguientes capturas, la interfaz para proteger imágenes presenta tres opciones: descifrar, cifrar y añadir imágenes. 75 6 Desarrollo del proyecto Figura 6.31: Selección de imágenes de la galerı́a Figura 6.30: Interfaz para proteger imágenes Una vez se pulsa el botón verde para cifrarlas ya no podrán ser mostradas en la pantalla de protección debido a que no se guarda ninguna miniatura para ofrecer mayor protección. Por este motivo se muestra un candado amarillo en el centro de la pantalla. Figura 6.32: Imágenes cifradas Figura 6.33: Desproteger imagen 76 6 Desarrollo del proyecto Cuando el usuario descifra las imágenes pulsando el botón rojo aparecerán de nuevo las miniaturas de éstas. Si entonces decide pulsar sobre alguna de ellas se le mostrará una ventana emergente que le preguntará si la quiere quitar de la lista de imágenes a proteger. El segundo tipo de contenido que permite cifrar la aplicación son los vı́deos. La interfaz gráfica es la misma que la mostrada en las capturas anteriores, tan sólo cambia el hecho de que la galerı́a permitirá elegir únicamente vı́deos. Finalmente, si el usuario quiere cifrar cualquier tipo de archivo en su dispositivo (documentos de texto, archivos comprimidos, etc.), podrá hacerlo mediante el ı́tem Archivos del menú Protección. Para ello se le proporciona la misma vista de un explorador de archivos, la cual muestra todas las carpetas y ficheros existentes. En estas capturas de ejemplo aparece un listado de ficheros de texto que pueden ser cifrados si el usuario pulsa sobre ellos. Figura 6.34: Lista de archivos Figura 6.35: Archivo cifrado Y el resultado de cifrar el archivo anterior mediante AES256 es el siguiente: Figura 6.36: Contenido del archivo cifrado 77 6 Desarrollo del proyecto En cuanto a la implementación que hay detrás de estas funcionalidades se mostrará a continuación la parte más representativa del proceso de selección del contenido, cifrado y descifrado. Para la selección del contenido de la galerı́a tanto para imágenes como vı́deos es necesario declarar un elemento especı́fico en Android al cual se le asocia una acción que debe llevarse a cabo. Este elemento se conoce como Intent (464) y necesita en este caso dos parámetros. El primero es la acción requerida (465) y el segundo es el destino donde se realizará tal acción (466). Finalmente, se manda a ejecutar este Intent (467). Código 6.16: Selección de contenido de la galerı́a La respuesta obtenida de la acción anterior se recoge en el siguiente código, donde se observa que se comprueba que el resultado sea correcto y el código recibido sea el especificado anteriormente (473). Acto seguido, se recoge el contenido seleccionado (474), en este caso una imagen, y se obtiene la ruta para almacenarla y tener la imagen localizada para el proceso de cifrado y descifrado (475-477). Código 6.17: Contenido guardado para cifrar Una vez se ha seleccionado el contenido ya puede ser cifrado. Para ello se llama a la función encryptFile donde se tratará una a una las imágenes a cifrar. El primer paso es pasar a Bitmap la imagen a partir de su ruta (75). A continuación, se detecta la extensión (77,78) y en función de un formato u otro se decide la compresión a aplicar (82,87). 78 6 Desarrollo del proyecto Debido a que esta compresión de la clase Bitmap sólo puede aplicarse a imágenes con extensiones .jpeg y .png se ha añadido un caso base en el switch para tratar otro tipo de extensiones que pueda mostrar la galerı́a. En este caso base (91) no se usa compresión y directamente se llama a la función cifrar (96). Código 6.18: Cifrado del contenido I En cuanto a la función cifrar, Google proporciona la clase Cipher para que el desarrollador pueda crear fácilmente una instancia de ésta (129) especificando el algoritmo de cifrado, el modo de operación y el tipo de padding. A partir de aquı́ se inicializa el cifrado (131) y se aplica a la imagen (133). Código 6.19: Cifrado del contenido II 79 6 Desarrollo del proyecto El proceso de descifrado hace uso de la misma clase Cipher pero en la inicialización esta vez se habilita la opción DECRYPT MODE (151), se descifra el contenido (152) y se crea un buffer de bytes para ir leyendo la imagen descifrada. Código 6.20: Descifrado del contenido Finalmente, se llama a otra función que no figura en las capturas y se guarda la imagen en el mismo sitio donde estaba. Tanto para las imágenes como vı́deos y archivos la clase usada es la ya mencionada Cipher y las implementaciones sólo se diferencian en pequeñas funcionalidades. 6.4.8. Servicio Por último, se describirá en esta sección el componente que lleva a cabo la protección con un segundo factor de autenticación. Se trata del servicio que está en segundo plano escuchando los eventos que suceden en el dispositivo. Su funcionamiento consiste en consultar constantemente si debe proteger o no la aplicación que hay en primer plano. Para ello primero comprueba si la protección está habilitada (80-82), consulta cuál es la aplicación que acaba de abrir el usuario (83) y si es una de las marcadas a proteger (85) se hace una llamada a las funciones lanzarBloqueoPin y compruebaPin. 80 6 Desarrollo del proyecto Código 6.21: Consulta de la aplicación en primer plano La primera de ellas simplemente se encarga de preparar el entorno para lanzar la interfaz gráfica que muestra la pantalla de bloqueo. Por otro lado, la segunda se encarga de estar a la espera de la introducción del PIN por parte del usuario con la finalidad de concederle o denegarle el acceso. El código de esta última se muestra en la siguiente figura. Código 6.22: Comprobación del número PIN Como se puede observar, la función compruebaPin se espera hasta que el PIN introducido por el usuario sea correcto (197). Para prevenir realizar miles de acciones innecesarias se ha aplicado un tiempo de un segundo en el cual no se hace literalmente nada (190). Acto seguido, se consulta en SharedPreferences si el usuario ya ha hecho tal acción y cuál es el resultado de ésta. Por otro lado, también se comprueba si ha decidido cambiar de aplicación para evitar que esta función se quede en un bucle infinito (196-199). Finalmente, en caso de que el PIN sea correcto, se llama a un conjunto de funciones para recoger y validar los taps (en caso de estar habilitados) y se actualiza la base de datos que lleva el control de accesos. 81 6 Desarrollo del proyecto 6.4.9. Tutorial Con la finalidad de proporcionar la información necesaria al usuario para hacer un uso correcto de la aplicación se ha elaborado un videotutorial que cubra todas las funcionalidades. De este modo el usuario sabrá de una forma rápida y cómoda cómo funciona cada una de las partes de la aplicación y el orden lógico que debe seguir para configurarla correctamente. Como se aprecia en las siguientes figuras, el videotutorial está alamacenado en Youtube y se proporciona la URL para acceder a él. Esto se debe a que la aplicación no tiene el permiso de Internet a fin de proporcionar más confianza al usuario, tal y como ya se ha mencionado anteriormente. Por otro lado, la posibilidad de incluirlo dentro de la aplicación se ha descartado por el tamaño de almacenaje que requerirı́a. Figura 6.37: Tutorial Figura 6.38: Link del tutorial 82 7. Gestión económica 7.1. Consideraciones iniciales En las siguientes secciones se analizarán los costes derivados del desarrollo del proyecto. Debido a que se trata de un proyecto universitario, las estimaciones se han realizado teniendo en cuenta que los costes asociados a cada tarea y rol están sujetos a la condición de becario del autor del trabajo. No obstante, con la finalidad de dotar los cálculos de realismo profesional, se ha añadido la estimación de costes contemplando el desarrollo del proyecto en un entorno laboral. Por tanto, se considerarán dos escenarios: el primero, en adelante Escenario A, contemplará el contexto estudiantil, mientras que el segundo, Escenario B, considerará un entorno profesional. 7.2. Identificación y estimación de costes El presupuesto necesario para la realización del proyecto viene determinado por los factores que tienen un impacto económico directo o indirecto en él. En consecuencia, el primer paso para la elaboración de un presupuesto es identificar dichos factores y estimar sus costes. En este proyecto se distinguen tres factores: humano, hardware y software, los cuales serán analizados y clasificados según su intervención. Por otro lado, también se detallará la partida de contingencia y los imprevistos que se han tenido en cuenta. 83 7 Gestión económica 7.2.1. Costes directos En esta sección se muestran los costes correspondientes a las tareas del diagrama de Gantt ası́ como los asociados al material imprescindible para realizar el proyecto. El factor con impacto económico que interviene en la realización de las tareas es el humano. Por tanto, como puede observarse en la siguiente tabla, el coste total viene determinado por el salario/hora correspondiente a la categorı́a profesional de cada rol. Tabla 7.1: Costes recursos humanos A continuación, se muestran los costes asociados a cada actividad teniendo en cuenta los datos de la tabla anterior. Tabla 7.2: Costes directos por actividad 84 7 Gestión económica Por otro lado, los costes asociados al material usado son los siguientes: Amortización hardware: el portátil Fujitsu LifeBook usado durante todo el proyecto se adquirió en 2011 y el dispositivo móvil Samsung Galaxy S3 es de 2012, por tanto, se consideran recursos amortizados. Software: el software usado, tanto el especı́fico para programar como el propio sistema, es libre y no se ha pagado por él. Tabla 7.3: Costes directos de material 7.2.2. Costes indirectos Los costes indirectos asociados al proyecto pueden ser parcialmente calculados debido a que la información sobre el alquiler, consumo de agua, electricidad, etc., no es de fácil acceso para un becario. Por tanto, los principales costes que se tendrán en cuenta son: Transporte: los desplazamientos se han realizado haciendo uso del transporte público. El coste asociado es el de dos tarjetas trimestrales de metro. Impresiones en papel: el proyecto se imprimirá para proporcionar una copia del mismo a cada miembro del tribunal. Si se estima una extensión de 90 hojas por copia serán necesarias 270 impresiones. Tabla 7.4: Costes indirectos 85 7 Gestión económica 7.2.3. Contingencia Otro aspecto a tener en cuenta en el presupuesto es la partida de contingencia. En este proyecto se destinará a ésta un 15 % de la suma de costes directos e indirectos. Tabla 7.5: Costes contingencia 7.2.4. Imprevistos Tal y como se ha mencionado en secciones anteriores, la planificación temporal se realizó teniendo en cuenta una serie de imprevistos, los cuales tienen sus costes asociados: Retraso de 7 dı́as: debido a que la parte más sensible de sufrir una desviación temporal es la de programación, el salario necesario para dichas labores se tendrá en cuenta suponiendo una jornada de 15h diarias de un programador durante siete dı́as. Averı́a del hardware: debido a que la empresa donde se realiza el proyecto está totalmente ligada al mundo informático hay una gran disposición de equipos de repuesto en caso de averı́a, tanto móviles como portátiles. Tabla 7.6: Costes imprevistos 7.2.5. Presupuesto En este proyecto no se han tenido en cuenta los beneficios que se podrı́an generar mediante la incorporación de módulos de publicidad en la aplicación, ya que se entiende que es de carácter universitario. Por otro lado, no se contempla una subida de salario a lo largo del desarrollo del proyecto. 86 7 Gestión económica En la siguiente figura se muestra el presupuesto final para cada uno de los escenarios. Tabla 7.7: Presupuesto 7.3. Control de gestión Con la finalidad de controlar la evolución del proyecto se realizará una imputación de horas al final de la semana. De este modo, cada rol registrará la dedicación realizada y sabrá las horas que dispone para realizar las tareas que tiene asociadas. Mediante este control será posible detectar si las horas dedicadas a cada tarea sobrepasan el presupuesto estimado o no. En caso afirmativo se identificarán las causas que han producido el desajuste presupuestario y se tendrán en cuenta en las tareas siguientes para reducir la diferencia de costes. Si finalmente el coste real supera al presupuestado se aplicará la partida de imprevistos y contingencia para cubrir la diferencia. Los indicadores utilizados para controlar la gestión de desviaciones son los siguientes: Desvı́o de mano de obra en precio = (coste std – coste real) * consumo de horas real Desvı́o en la realización de una tarea en precio = (coste std – coste real) * consumo horas real Desvı́o total en la realización de tareas = coste total std tarea – coste total real tarea Desvı́o total costes fijos = coste total fijo presupuestado – coste total fijo real 87 8. Sostenibilidad y compromiso social 8.1. Valoración de la sostenibilidad El estudio realizado sobre la sostenibilidad de este proyecto se muestra resumido en la siguiente tabla y se detalla en las siguientes secciones. Tabla 8.1: Valoración sostenibilidad La alta puntuación total obtenida, 25 puntos, hace que este proyecto sea viable para ser desarrollado y tenga en general un impacto positivo en los tres ámbitos que se detallarán a continuación: económico, social y ambiental. 8.2. Económica Para determinar la viabilidad económica de un proyecto es preciso conocer todos los factores que pueden suponer costes en él. Esto se ha tenido en cuenta en secciones anteriores y en consecuencia se ha elaborado un presupuesto. Observando los resultados obtenidos en éste se puede ver que los costes principales hacen referencia al factor humano. Por otro lado, el hecho de usar dispositivos relativamente antiguos pero funcionales ha servido para reducir el presupuesto. Del mismo modo, el uso de software libre ha permitido el ahorro de licencias comerciales. A parte de ahorrar con estas medidas se debe tener en cuenta que el producto desarrollado, aún y ser distribuido de forma gratuita en el mercado de Google, podrı́a contar con módulos de publicidad para generar ingresos. Este hecho harı́a que el coste presupuestado del proyecto fuera viable en caso de querer hacerlo competitivo. 88 8 Sostenibilidad y compromiso social No obstante, el principal punto negativo de este proceso es la competencia existente en el mercado, la cual ocupa altas posiciones en las listas oficiales de descargas. Debido a que el tiempo dedicado a cada tarea es proporcional a su importancia no se considera que se podrı́a reducir la duración de cierta tarea para desarrollar el proyecto en un menor tiempo. No obstante, la contratación de un programador con experiencia en Android reducirı́a los tiempos de auto-aprendizaje y programación, pero en el ámbito universitario del proyecto esto no aplica. También, la colaboración con otro proyecto relacionado agilizarı́a todo el desarrollo pero este escenario tampoco se contempla. En consecuencia, la viabilidad económica para este proyecto se considera que tiene una valoración de 9. 8.3. Social La expansión del sistema Android en los últimos años ha sido de una enorme magnitud, tal y como ya se ha comentado. Tanto es ası́ que se ha convertido en el sistema más usado en la actualidad. Este hecho ha propiciado que los usuarios encuentren en este sistema un lugar en el cual almacenar información privada y confidencial. A causa del uso diario y constante que se hace de los dispositivos móviles, una gran cantidad de situaciones adversas pueden tener un impacto en la confidencialidad de los usuarios. Por ejemplo, la contraseña de bloqueo de un documento protegido de un ejecutivo podrı́a ser vista por otra persona en el transporte público, lugar de trabajo, etc. En consecuencia, existe una necesidad real de mejorar la protección ante ciertas situaciones y este es el aspecto que intenta cubrir este proyecto. Sin embargo, como punto negativo se encuentra el hecho de que la aplicación desarrollada contempla proteger eficazmente un escenario concreto. Éste es el que se produce cuando una persona pierde de vista su dispositivo durante un intervalo de tiempo relativamente corto. Si un atacante roba el dispositivo cuenta con un amplio arsenal de técnicas en Internet para acabar consiguiendo los datos que desea. Debido a que esta aplicación está destinada a ofrecer una protección adicional a usuarios de Android, un gran colectivo que requiera mejorar su seguridad puede beneficiarse de ella. 89 8 Sostenibilidad y compromiso social Los usuarios de otros sistemas operativos que hay en el mercado no se verán afectados ni positiva ni negativamente por la aparición de esta aplicación. Teniendo en cuenta estos hechos se valora la sostenibilidad social con un 7. 8.4. Ambiental De los recursos mencionados anteriormente, el principal que puede generar un impacto ambiental es el hardware, pero al tratarse únicamente de un portátil y un móvil su consumo no aumenta la huella ecológica pero tampoco se puede considerar que contribuya a reducirla. Del uso de la aplicación tampoco se espera que tenga ningún impacto en dicha huella ecológica. Por otro lado, estos dispositivos seguirán siendo usados en la empresa una vez concluya este proyecto, con lo cual su vida útil se exprimirá al máximo. Por estos motivos se puntúa la sostenibilidad ambiental con un 9. 90 9. Conclusiones Android es un potente sistema operativo con multitud de funcionalidades que son de gran utilidad en el dı́a a dı́a de los usuarios. Está dotado de la última tecnologı́a y su evolución es notable con el paso de las versiones. No obstante, y a pesar de estar respaldado por una de las compañı́as más potentes de hoy en dı́a, Google, este sistema está lejos de rozar la perfección. Como se ha podido ver en la parte teórica, el modelo de seguridad sobre el cual se basa Android requiere de un refuerzo considerable para proporcionar mayor protección al usuario, ya que las medidas implantadas actualmente no ponen freno a bastantes situaciones destinadas a comprometer su privacidad. Es cierto que cada nueva versión da un paso hacia adelante y cubre vulnerabilidades existentes pero los cibercriminales también actualizan sus métodos. Por este motivo, es necesario que investigaciones externas contribuyan a mejorarlo paliando situaciones que éste no contempla. Como se ha podido ver, existen potentes extensiones de seguridad que están disponibles y algunas otras ya han sido incorporadas de forma nativa en las nuevas versiones. Aún y ası́ siempre existen vulnerabilidades que pueden ser aprovechadas para sustraer información confidencial de un usuario, el cual es el principal punto de entrada para tomar el control de un sistema. De nada sirve disponer de aplicaciones de protección con una algoritmia perfecta si al final la seguridad radica en el uso que haga un usuario de su dispositivo. Por lo tanto, hay que crear tecnologı́a que facilite su protección. En relación a este último aspecto, se ha demostrado que la aplicación desarrollada en este proyecto proporciona un nivel más de protección que pasa desapercibido ante terceras personas y permite al usuario autenticarse de forma cómoda y sin necesidad de focalizar toda su atención en el momento de la autenticación. En consecuencia, se ha cumplido el objetivo de reforzar la privacidad de un usuario dificultando la sustracción de información mediante Shoulder Surfing. 91 Bibliografı́a [1] Smartphone-Os-Market-Share @ Www.Idc.Com. URL http://www.idc.com/ prodserv/smartphone-os-market-share.jsp. [2] Hadeel Tariq Al-Rayes. Studying Main Differences between Android & Linux Operating Systems. International Journal of Electrical and Computer Sciences, 12(5): 46–49, 2012. [3] Dave MacLean Sayed Hashimi, Satya Komatineni. Pro Android 3. URL https: //books.google.es/books?id=RuN0jb4YASwC{&}pg=PA6. [4] Android API levels. URL http://developer.android.com/intl/es/guide/ topics/manifest/uses-sdk-element.html{#}ApiLevels. [5] Activity life cycle. URL http://developer.android.com/intl/es/reference/ android/app/Activity.html. [6] Sebastian Neuner, Victor Van Der Veen, and Martina Lindorfer. Enter Sandbox: Android Sandbox Comparison. 3rd IEEE Mobile Security Technologies Workshop, 2014. [7] P. Wijesekera, A. Baokar, A. Hosseini, S. Egelman, D. Wagner, and K. Beznosov. Android permissions remystified: A field study on contextual integrity. PrivacyCon, 14 January 2016, 2016. URL https://www.ftc.gov/system/files/documents/ public{_}comments/2015/09/00013-97595.pdf. [8] Asim S. Yuksel, Abdul H. Zaim, and Muhammed A. Aydin. A Comprehensive Analysis of Android Security and Proposed Solutions. International Jour- nal of Computer Network and Information Security, 6(12):9–20, 2014. 20749090. doi: 10.5815/ijcnis.2014.12.02. ISSN URL http://www.mecs-press.org/ ijcnis/ijcnis-v6-n12/v6n12-2.html. [9] Nikolay Elenkov. Android Security Internals. 2014. ISBN 9781593275815. doi: 10.1016/S1353-4858(15)30046-5. 92 Bibliography 9 Bibliografı́a [10] Jim Huang. Android IPC Mechanism. pages 1–82, 2012. URL papers3: //publication/uuid/0426FD04-B1DA-49CF-941B-BE85092B6322. [11] forum.xda-developers.com. URL http://forum.xda-developers.com/ showthread.php?t=2620456. [12] Joshua J. Drake, Pau Oliva Fora, Zach Lanier, Collin Mulliner, Stephen a. Ridley, and Georg Wicherski. Android Hacker’s handbook. 2014. ISBN 9781118608647. [13] Parvez Faruki, Ammar Bharmal, Vijay Laxmi, Vijay Ganmoor, Manoj Singh Gaur, Mauro Conti, and Muttukrishnan Rajarajan. Android Security: A Survey of Issues, Malware Penetration, and Defenses. IEEE Communications Surveys & Tutorials, (2):998–1022. ISSN 1553-877X. doi: 10.1109/COMST.2014.2386139. [14] Bahman Rashidi and Carol Fung. A Survey of Android Security Threats and Defenses. (Enero):3–35, 2015. ISSN 20935382. [15] Asim S. Yuksel, Abdul H. Zaim, and Muhammed A. Aydin. A Comprehensive Analysis of Android Security and Proposed Solutions. International Jour- nal of Computer Network and Information Security, 6(12):9–20, 2014. 20749090. doi: 10.5815/ijcnis.2014.12.02. ISSN URL http://www.mecs-press.org/ ijcnis/ijcnis-v6-n12/v6n12-2.html. [16] Daniel W K Tse, X Liu, Hong Kong, Christopher Nusaputra, Hong Kong, B Hu, Hong Kong, Y Wang, Hong Kong, M W Xing, and Hong Kong. Strategies in improving android security. 26, 2013. [17] John Viega and Bret Michael. Mobile Device Security. IEEE Security & Privacy Magazine, 8(2):99–101, 2010. ISSN 1540-7993. doi: 10.1109/MSP.2010.76. [18] Michael Backes, Sven Bugiel, Sebastian Gerling, and Philipp von Styp-Rekowsky. Android Security Framework: Extensible Multi-Layered Access Control on Android. Acsac 2014, 2014. doi: 10.1145/2664243.2664265. URL https://www.infsec. cs.uni-saarland.de/{~}bugiel/publications/pdfs/bugiel14-acsac1.pdf$\ delimiter"026E30F$npapers3://publication/doi/10.1145/2664243.2664265. [19] William Enck, Landon P Cox, Peter Gilbert, and Patrick Mcdaniel. TaintDroid : An Information-Flow Tracking System for Realtime Privacy Monitoring on Smartphones. [20] Android history. URL http://www.androidcentral.com/android-history. 93