Grado en Ingeniería Informática Informatikako Ingeniaritzako gradua Proyecto fin de grado Gradu amaierako proiektua Metodología para el análisis y la detección de aplicaciones maliciosas en el sistema operativo Android. Jorge Lekuona Ocio Director: Borja Sanz Urquijo Bilbao, Junio de 2021 Resumen A día de hoy el uso que se le da a los dispositivos móviles es una herramienta tanto de trabajo como de ocio ampliamente utilizada, es un instrumento que llevamos a diario encima y es una gran fuente de información, en dicho dispositivo guardamos desde mensajes privados hasta imágenes de cualquier índole, además no solo contiene información vulnerable, sino que realizamos tareas delicadas como consultar nuestra cuenta bancaria o realizar pagos con el mismo. Todo lo anteriormente mencionado ha convertido a los teléfonos en un objetivo de alto valor para los crackers o hackers malintencionados. Los usuarios tendemos a instalar aplicaciones sin consultar su autenticidad sin comprobar que dicha aplicación pida permisos de más o simplemente aunque los solicite sin necesitarlos, la instalamos igualmente, lo que hace a nuestros dispositivos vulnerables. El objetivo de este proyecto es el desarrollo de una metodología que permita avanzar en el estudio sobre las diferentes técnicas para el análisis y detección de aplicaciones maliciosas en el sistema operativo Android. De esta forma, se conseguirá aumentar la seguridad y concienciar sobre los grandes riesgos que conlleva la instalación de apps maliciosas. Para ello, descargaremos múltiples aplicaciones y observaremos cuáles son maliciosas y sus características principales. Además estudiaremos las diferentes metodologías que hay que llevar a cabo para la detección de dichas aplicaciones maliciosas y cómo aplicarlas. Este proceso se realizará en seis pasos. El primero será la búsqueda tanto de aplicaciones benignas como de malware. Posteriormente, en un segundo paso se investigarán las diferentes características de cada aplicación. El tercero consistirá en la extracción de las características encontradas en el anterior paso; el cuarto consistirá en el análisis de las características extraídas. Este análisis se realizará mediante herramientas de aprendizaje automático, en el quinto paso se evaluarán los resultados obtenidos del análisis y en el sexto paso se combinarán las características con mejores resultados para su posterior análisis y evaluación. Aplicando esta metodología, se ha descubierto que las características con mayor tasa de aciertos a la hora de diferenciar el malware del software benigno son los Permisos y las Acciones, aunque combinandolos el porcentaje de aciertos no se ve casi afectado, aunque con la combinación de varias características, en este caso 17 sí que se observa una notoria mejora. Descriptores Ciberseguridad, Android, Malware, Python, Sklearn, IA III Índice general 1. Introducción 1 2. Objetivos y alcance 3 2.1. Objetivos Generales…………………………………………………………….3 2.2. Objetivos específicos…………………………………………………………... 3 2.3. Alcance…………………………………………………………………………...4 2.4. Herramientas utilizadas………………………………………………………... 4 2.4.1. 2.4.2. 2.4.3. Herramientas de Android…………………………………………….. 5 2.4.1.1. Android……………………………………………………….. 5 2.4.1.2. Smali………………………………………………………….. 6 Herramientas genéricas……………………………………………… 8 2.4.2.1. Python……………………………………………………...… 8 2.4.2.2. Shell de Unix………………………………………………….8 2.4.2.3. ApkTool………………………………………………………..9 2.4.2.4. Numpy………………………………………………………... 9 2.4.2.5. Pandas……………………………………………………….. 10 Bibliotecas de AI………………………………………………………. 10 2.4.3.1. 3. Estado de la técnica 3.1. 3.2. SKLearn……………………………………………………….10 11 Tipos de malware………………………………………………………………. 11 3.1.1. Troyanos……………………………………………………………….. 13 3.1.2. Keyloggers…………………………………………………………….. 15 3.1.3. Ransomware…………………………………………………………...16 3.1.4. Spyware y Stalkerware………………………………………………..17 3.1.5. Adware…………………………………………………………………. 17 Tipos de análisis………………………………………………………………... 18 3.2.1. Estático………………………………………………………………… 18 3.2.2. Dinámico………………………………………………………………..18 3.2.3. Híbrido…………………………………………………………………..19 V 3.3. Explicacion de tecnicas IA…………………………………………………….. 19 3.3.1. 3.3.2. Modelos Lineales……………………………………………………... 19 3.3.1.1. Ridge Classifier……………………………………………… 19 3.3.1.2. Logistic Regression…………………………………………. 20 3.3.1.3. SGD Classifier……………………………………………..…21 Nearest Neighbors……………………………………………….…… 22 3.3.2.1. 3.3.3. Naive Bayes……………………………………………………....……23 3.3.3.1. 3.3.4. 3.3.6. 3.3.5.1. AdaBoost Classifier……………………………………….… 24 3.3.5.2. Gradient Boosting Classifier……………………………..… 25 Multi-Layer Perceptron……………………………………………..… 25 MLP Classifier……………………………………………..… 25 Metodología Desarrollada 27 4.1. CRISP-DM Based………………………………………………………….……27 4.2. Conjunción de características…………………………………………….……28 4.3. Características extraídas………………………………………………….……28 4.3.1. VI Decision Tree Classifier…………………………………..… 24 Ensemble Methods…………………………………………………….24 3.3.6.1. 4. Gaussian Naive Bayes………………………………………23 Decision Trees…………………………………………………………23 3.3.4.1. 3.3.5. KNeighors Classifier………………………………………… 22 AndroidManifest……………………………………………………..…30 4.3.1.1. Paquete…………………………………………………….… 30 4.3.1.2. Activity…………………………………………………...…… 30 4.3.1.3. Service…………………………………………………...……31 4.3.1.4. Content Providers…………………………………………… 32 4.3.1.5. Broadcast Receivers…………………………………...…… 33 4.3.1.6. Intent Actions e Intent Filter Categories……………...…… 34 4.3.1.7. Permisos…………………………………………………...… 34 4.3.1.8. Exports…………………………………………………..……35 4.3.1.9. Backups…………………………………………………….…36 4.3.1.10. Meta Data…………………………………………………..…36 4.3.1.11. Uses Features…………………………………………..…… 36 4.3.2. 4.4. 5. Datos de la aplicación……………………………………………...… 37 Caso de Uso…………………………………………...…………………..…… 37 4.4.1. Decompilar…………………………………...…………………...……37 4.4.2. Extraer Características……………………...………………..……… 38 4.4.3. Generar listados……………………...……………………….…….…43 4.4.4. Generar Dataset……………………...………………………….….…45 4.4.5. Análisis………………………………………...………………….…… 47 Resultados 51 5.1. 5.2. Métricas…………………………………………...………………………..…… 51 5.1.1. Accuracy Score………………………...………………………………51 5.1.2. Balanced Accuracy Score……………...……………………….…… 51 5.1.3. Precision Score………………………...…………………………...… 52 5.1.4. Average Precision Score……………...………………………………52 5.1.5. Brier Score Loss………………………...…………………………..…53 5.1.6. F1 Score………………………...………………………………...……53 5.1.7. Recall Score……………………...……………………………….……54 5.1.8. ROC AUC Score………………...……………………………….…… 54 Resultados obtenidos………………...…………………………………………54 5.2.1. Permisos………………...……………………………………..……… 54 5.2.2. Todos los permisos posibles………………………………….………56 5.2.3. Acciones………………...………………………………………...……57 5.2.4. Servicios………………...………………………………………...……58 5.2.5. Categorías……………...………………………………………...…… 59 5.2.6. Permisos y acciones…...……………………………………..……… 61 5.2.7. Todos los valores………...…………………………………………… 62 VII 5.3. 6. Comparativa con los diferentes Papers anteriores……………………….… 63 Planificación, presupuesto y estructura del proyecto 65 6.1. Planificación……………………………………………………………..……… 65 6.2. Presupuesto…………………………………………………………..………… 66 6.3. Estructura del proyecto……………………………………………....…………67 7. Trabajo futuro 69 8. Conclusiones 71 8.1. 9. VIII Análisis de los aspectos éticos del proyecto……………………...………… 71 8.1.1. Consecuencias…………………………………………...…………… 71 8.1.2. Metodos de investigacion………………………………….………… 72 8.1.3. Procedimientos de decisión………………………………..…………72 8.1.4. Costes…………………………………………………………..……....72 Agradecimientos 73 Índice de figuras Figura 1: Malware en Android a lo largo de los años (fuente AVTEST) Figura 2: Nuevo malware en Android 2019-2021 (fuente AVTEST) Figura 3: Capas dentro de un sistema Android Figura 4: Método en Smali abstracto Figura 5: Método en Smali Figura 6: Llamada a un método en Smali abstracto Figura 7: Opcodes en Smali Figura 8: Ejecución de ApkTool Figura 9: Cantidad de ataques a dispositivos móviles en 2019 y 2020 Figura 10: Cantidad de ataques a dispositivos móviles de 2017 a 2020 Figura 11: Cantidad de ataques a dispositivos móviles por tipo de malware Figura 12: Cantidad de ataques de troyanos tipo ransom de 2018 a 2020 Figura 13: Cantidad de ataques de troyanos Banker de 2017 a 2020 Figura 14: Cantidad de ataques de Adware de 2018 a 2020 Figura 15: Fórmula modelos lineales Figura 16: Función de costo 1 Figura 17: Problema de optimización Figura 18: Función de costo 2 Figura 19: Fórmula Gaussian Naive Bayes Figura 20: Diagrama CRISP-DM Figura 21: Diagrama CRISP-DM Based Figura 22: Formato paquete Figura 23: Paquete en AndroidManifest Figura 24: Activity en AndroidManifest Figura 25: Formato service Figura 26: Service en AndroidManifest Figura 27: Formato Content Providers IX Figura 28: Content Providers en AndroidManifest Figura 29: Broadcast Receiver en AndroidManifest Figura 30: Intent filter en AndroidManifest Figura 31: Categoría en AndroidManifest Figura 32: Permisos en AndroidManifest Figura 33: Exports en AndroidManifest Figura 34: Backups en AndroidManifest Figura 35: meta-data en AndroidManifest Figura 36: uses-feature en AndroidManifest Figura 37: Comando Decompilar Figura 38: Script Decompilar Figura 39: Ejecución del script para Decompilar Figura 40: Ejecución del script para Extraer las características Figura 41: Script para Extraer las características Figura 42: Ejemplo de características a buscar en AndroidManifest Figura 43: Ejemplo de características a buscar fuera de AndroidManifest Figura 44: Resultado de carpeta de cada aplicación Figura 45: Ejemplo de “.txt” generado Figura 46: Comando ejecutar generador de listados Figura 47: Ejemplo código generador de listados Figura 48: Ejemplo ejecución generador de listado Figura 49: Comando ejecutar generador de Datasets Figura 50: Ejemplo código generador de Dataset Figura 51: Ejemplo código generador de Datasets para datos no asignados en los listados Figura 52: Ejemplo código de análisis Figura 53: Función exactitud Figura 54: Función Balanced Accuracy Figura 55: Función Precision Figura 56: Función Precision y Recuperación X Figura 57: Gráfica de Recuperación y precisión Figura 58: Función F1 Figura 59: Función Recuperación Figura 60: Tabla resultados Paper PERMISSION ANALYSIS FOR ANDROID MALWARE DETECTION Figura 61: Tabla resultados Paper Puma, Universidad de Deusto XI Índice de Tablas Tabla 1: Ejemplo listados Tabla 2: Resultado permisos Tabla 3: Resultado todos los permisos posibles Tabla 4: Resultado acciones Tabla 5: Resultado servicios Tabla 6: Resultado categorías Tabla 7: Resultado permisos y acciones Tabla 8: Resultado todos los valores Tabla 9: Reparto de horas Tabla 10: Datos del sistema usado XIII PROYECTO FIN DE GRADO Capítulo 1 Introducción Este proyecto de fin de grado nace debido al afán por la búsqueda de soluciones ante el aumento constante de malware en dispositivos móviles, y más en concreto en el sistema operativo Android. Estos dispositivos son usados desde para el ocio, como ver videos o películas, hasta para el trabajo diario como mirar el correo, leer documentos importantes, pasando por realizar tareas que requieren privacidad y seguridad como ver los datos bancarios o realizar pagos. El problema surge cuando, pensando que no hay malware alguno en dispositivos móviles, los usuarios instalan aplicaciones de fuentes desconocidas sin prestar atención a los permisos que estas piden y sin verificar sus fuentes, por otra parte, hay veces que estas aplicaciones se encuentran disponibles en fuentes fiables como la “PlayStore” de Android o la “AppStore” de iOS y los usuarios más cautos las descargan debido a la confianza que depositan en las plataformas oficiales de los distintos sistemas. Figura 1: Malware en Android a lo largo de los años [1]. 1 1.INTRODUCCIÓN Figura 2: Nuevo malware en Android 2019-2021 [1]. Estas aplicaciones maliciosas son capaces de robar información sensible, espiar la actividad del dispositivo, tomar el control del mismo, eliminar archivos, bloquear la información y pedir rescates, recoger datos como la ubicación del dispositivo, imagenes de las cámaras del mismo, las conversaciones que se están manteniendo cerca del dispositivo, insertar anuncios en el sistema, etc. La falta de una concienciación sobre estos peligros ha ayudado a que los ataques hayan aumentado drásticamente y se ha generado una industria a su alrededor, este malware cada vez es más sofisticado y ágil, siendo de esta manera más efectivo y capaz de atacar a una gran cantidad de usuarios en poco tiempo y sin ser descubiertos [2][3]. Esta evolución lleva a que los antivirus cada vez tengan más problemas para detectar dicho software. Para poder evitar estos ataques, es necesaria tanto la concienciación de los usuarios sobre los peligros invisibles del uso indebido de la tecnología, como la creación de nuevos métodos y software para la prevención y detección de dicho malware. Como soporte a dicha detección, en este Proyecto de Fin de Grado se creará una metodología para el análisis estático de las aplicaciones, así como una búsqueda de un grupo de características distintivas para mejorar la detección de malware en Android. Además se analizarán los diferentes algoritmos de aprendizaje automático en busca del óptimo para el análisis de aplicaciones Android. 2 PROYECTO FIN DE GRADO Capítulo 2 Objetivos y alcance Este capítulo presenta el objetivo general de este Proyecto de Fin de Grado (PFG) así como los objetivos específicos ligados al mismo. Además se expone el alcance del propio Proyecto y las herramientas conceptuales y conocimientos necesarios para el desarrollo del mismo. 2.1 Objetivos Generales El objetivo principal de este PFG es el análisis de las diferentes cualidades de las aplicaciones Android, para ello se analizará principalmente los diferentes elementos del AndroidManifest, archivo donde se declaran las diferentes funcionalidades de la aplicación, como ejemplos de dichas características serían los permisos, los servicios, los proveedores de contenido o las actividades. Además se compararán los diferentes algoritmos de clasificación y se buscará el algoritmo o algoritmos que mejor evalúen las aplicaciones. Con esta evaluación se busca una mejora a lo largo del proceso de análisis estático de aplicaciones Android. No solo se busca el algoritmo de clasificación óptimo, sino que también se busca un conjunto de características cuya combinación lleve a un análisis con una gran tasa de aciertos. Tras el análisis de las herramientas y las características se deberán comparar los resultados de este proyecto con otros realizados con anterioridad en el ámbito del análisis de malware en aplicaciones Android en busca de mejoras o de diferencias entre las características encontradas y analizadas. 2.2 Objetivos específicos En este apartado se procederá a dividir el proyecto en sus diferentes objetivos para poder obtener el resultado deseado. A continuación de describe cada uno de los pasos a seguir para la realización de los diferentes objetivos para conseguir el objetivo mencionado en el apartado objetivos generales. Primero se deberá investigar acerca de la estructura y funcionamiento de las aplicaciones Android. Se analizará tanto la estructura de las carpetas, la forma en la que estas están estructuradas y cómo están organizados los archivos, como, la estructura de los propios archivos, pero más en profundidad el fichero “AndroidManifest.xml”. Una vez se haya analizado la estructura tanto de las aplicaciones Android como sus contenidos, se procederá a diseñar una metodología para la extracción, análisis y evaluación de dichas características. Cuando se haya analizado la estructura de las aplicaciones Android y se haya creado una metodología, se extraerán tanto las características seleccionadas dentro del AndroidManifest y como características fuera de este, es decir, se extraerán características no contenidas por 3 2. OBJETIVOS Y ALCANCE dicho AndroidManifest como por ejemplo la cantidad de imágenes y videos. Generando de esta manera un dataset con las características extraídas. Inicialmente se extraerán las características por separado, generando de esta manera múltiples conjuntos de datos, una vez se verifique la validez de las características se generará un conjunto de datos que contenga múltiples características. Con ese conjunto de datos se procederá a entrenar herramientas de aprendizaje automático para la detección de las aplicaciones maliciosas, dichas herramientas serán comparadas y se buscará la herramienta más adecuada para el análisis, es decir la herramienta con mayor tasa de aciertos. Además se buscarán las características más distintivas y se realizarán combinaciones para buscar una mejor tasa de aciertos. Una vez se haya realizado el proceso se habrá desarrollado una metodología para el análisis estático del malware en Android y se habrá obtenido un conjunto de características y un algoritmo de aprendizaje automático óptimos. Con estos resultados se realizará una comparación con Papers realizados anteriormente por otros individuos y otras instituciones para verificar que se haya obtenido una mejora o que se haya descubierto algún dato novedoso. 2.3 Alcance El alcance de este proyecto es llegar a entrenar diferentes máquinas de aprendizaje automático con las diferentes características estáticas de las aplicaciones contenidas en dicho dataset. El alcance de este proyecto consta de dos objetivos principales, el primero es desarrollar una metodología efectiva a la hora de realizar un análisis estático, el segundo es encontrar nuevas características útiles en la detección de malware en Android. El segundo objetivo se realizará a través de la metodología desarrollada y tratará de analizar los diferentes algoritmos de aprendizaje automático y obtener el algoritmo o algoritmos óptimos para la detección de malware en Android. Además se buscará un conjunto de características con las que se pueda obtener una gran tasa de aciertos. El proceso consta de tres pasos principales, el primero será extraer las diferentes características por separado, el segundo consistirá en entrenar máquinas de aprendizaje automático para la detección de las aplicaciones maliciosas, el tercer y último paso será el de extraer las métricas de precisión de los clasificadores. Con los resultados obtenidos se realizará el proceso otra vez para combinar las características con mayor precisión y comprobar si la tasa de acierto aumenta. Una vez obtenidos los resultados deseados se realizará una comparación de dichos resultados con los resultados obtenidos en otros papers por otros investigadores. Se intentará obtener mejores resultados y descubrir nuevas características representativas del malware. 2.4 Herramientas utilizadas A continuación se procederá a detallar y a analizar cada una de las herramientas utilizadas para la realización de este PFG. Dichas herramientas se dividirán en las herramientas propias de android, las herramientas genéricas y las bibliotecas de AI 4 PROYECTO FIN DE GRADO 2.4.1 Herramientas de Android 2.4.1.1 Android En este proyecto se procederá a realizar un análisis de aplicaciones maliciosas que afecten este sistema operativo, es primordial conocerlo en profundidad. Por lo que en este apartado se analizarán los diferentes componentes del mismo y su funcionamiento básico. Android es un sistema operativo enfocado a dispositivos móviles basado en el núcleo del sistema operativo Linux, además de otros sistemas de código abierto. Este SO fue diseñado específicamente para dispositivos táctiles como tablets, smartphones, relojes inteligentes, o vehículos que implementan Android Auto. Este sistema operativo fue originalmente desarrollado por Android Inc. y adquirido por Google, el SO fue presentado por Google junto con la fundación Open Handset Alliance para poder mantener un formato de código abierto. El código fuente principal de Android es de código fuente abierto (open source) licenciado bajo la Licencia Apache principalmente. Contiene una arquitectura dividida en cinco apartados diferentes, el primero y más profundo sería el núcleo Linux, este núcleo se encarga de la gestión de la memoria, de la gestión de procesos, de la pila de red, del modelo de controladores y de la seguridad, además de los servicios mencionados se encarga de hacer de capa de abstracción entre hardware y software. El segundo componente es el Runtime de Android, el cual incluye un conjunto de bibliotecas que proporcionan la mayoría de las funciones disponibles en las bibliotecas base del lenguaje de programación Java, cada aplicación Android corre su propio proceso y su propia instancia de la máquina virtual Dalvik, la cual es una herramienta que provee de múltiples máquinas virtuales optimizadas para ejecutarse de una forma eficiente, esta máquina está basada en registros y corre clases compiladas por el compilador de Java. El tercero son las bibliotecas, las cuales son un conjunto de herramientas escritas en C y C++. Estas bibliotecas son usadas por los diferentes componentes del sistema y son proporcionadas a los desarrolladores a través del marco de trabajo de aplicaciones. Este marco de trabajo de aplicaciones es el cuarto elemento de la arquitectura del sistema Android, es el elemento encargado de simplificar la reutilización de componentes a través de la provisión de las bibliotecas a los desarrolladores además de proveer las capacidades publicadas por una aplicación a las demás. La quinta y última capa es la capa de aplicación, dependiendo la distribución algunas aplicaciones estarán previamente instaladas, todas las aplicaciones están escritas en el lenguaje Java [4]. 5 2. OBJETIVOS Y ALCANCE Figura 3: Capas dentro de un sistema Android [5]. 2.4.1.2 Smali Es una herramienta que permite descompilar los ejecutables de Android y convertirlos a un lenguaje intermedio que facilita su entendimiento. Con este lenguaje se puede descompilar, modificar y volver a compilar una aplicación. El lenguaje es similar a código ensamblador. Las aplicaciones Android son programadas en el lenguaje de programación java, cuando el código java es compilado este se transforma en ficheros binarios cuya extensión es .class. A la hora de crear una aplicación android no solo generamos los ficheros .class, sino que una vez generados dichos archivos se volverán a compilar para generar un único archivo con extensión .dex, dicho archivo contiene todas las clases existentes en la aplicación [6]. Estos ficheros .dex no se pueden volver a descompilar directamente a java debido a que los archivos .dex son casi ilegibles. A pesar de esto existen herramientas para convertir dichos archivos .dex a lenguaje java como dex2jar. Pero esto tiene varios problemas como que no siempre es posible generar un fichero .jar o que aunque el código java nos permita comprender la aplicación, no podremos volver a compilar la misma [7]. La sintaxis de smali es la siguiente: ● 6 Registros: Se guardan los datos de forma temporal. Todos los registros son de 32 bits, aunque podremos almacenar datos de 64 bits utilizando dos registros con los tipos primitivos Long o Double. PROYECTO FIN DE GRADO ● ● Tipos: ○ Primitivos: Los tipos primitivos son V (Void), Z (Boolean), B (Byte), S (Short), C (Char), I (Integer), J (Long), F (Float) y D (Double). Estos valores primitivos serán representados por una letra mayúscula anteriormente mencionada. ○ Objetos: Son declarados de la siguiente forma LPackage/Name/ObjectName;. La primera L indica que es una variable de tipo objeto, Package/Name es la ubicación del objeto, ObjectName es el nombre del mismo. ○ Vectores: Se representan mediante "[", por ejemplo [I siendo equivalente a int[], o [[I siendo equivalente a [][]. La dimensión máxima de un vector es de 255. Métodos: Los métodos son declarados de forma similar a java: .method modificador nombre Método(ParámetrosEntrada)ParámetrosSalida . Código .end method Figura 4: Método en Smali abstracto Donde el modificador indica si el método es public, protected o private. Los parámetros de entrada son escritos de forma contigua sin separadores. Los Parámetros de salida son el resultado que devuelve el método.Como ejemplo de la clase main de una clase Java: .method public static main([Ljava/lang/String;)V . Código .end method Figura 5: Método en Smali Los métodos se llaman de la siguiente forma: LObjeto -> método(ParámetrosEntrada)V Figura 6: Llamada a un método en Smali abstracto Donde L indica que es una variable, Objeto es el nombre que asignaremos al Objeto que recoja los datos del método, método es el nombre del mismo, los Parámetros de entrada son los que el método recibe y V es la respuesta del mismo. ● Opcodes: Los códigos operacionales son las operaciones que realiza Dalvik con los registros y componen la lógica del programa. Son representados por dos dígitos hexadecimales desde 00 hasta FF aunque algunos no son usados, por ejemplo los representados desde E3 hasta ED o desde FC hasta FF. Como ejemplo está 00 que significa nop (No operar), por lo que en un archivo smali se mostraría nop o en el caso del 01 sería move vx, vy donde se mueve el contenido de vy a vx. Ejemplo en smali: .class public LHelloWorld; .super Ljava/lang/Object; 7 2. OBJETIVOS Y ALCANCE .method public static main([Ljava/lang/String;)V .registers 2 sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; const-string v1, "Hello World!" invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V return-void .end method Figura 7: Opcodes en Smali [8]. 2.4.2 Herramientas genéricas 2.4.2.1 Python Es un lenguaje de programación interpretado, es decir, no es directamente ejecutado por el hardware de la máquina, es ejecutado por una máquina virtual. El eje central sobre el que se desarrolló este lenguaje es la legibilidad de su código y soporta tanto la programación orientada a objetos como la programación imperativa y la programación funcional pero en menor medida. Por lo que es un lenguaje muy extendido en el ámbito de la informática, en este caso se usará tanto para generar los Datasets, como para aplicar aprendizaje automático sobre los conjuntos de datos generados [9]. Entre sus elementos principales se encuentran: ● Comentarios: Estos se muestran de dos formas, usando “# Comentario ” para los comentarios de una línea y usando “ ‘‘’ comentario ‘’’ ” para los comentarios largos. ● Variables: Se definen de forma dinámica, esto indica que no se tiene que especificar el tipo en primera instancia, habilitando de esta manera la posibilidad de indicar distintos valores posteriormente, además se puede asignar un tipo distinto al que contenía con anterioridad. La asignación de una variable se realizaría de la siguiente manera “x = 1” o “x = “python”. Tener en cuenta que también existen nombres reservados como and, or, else, etc. ● Tipos de datos: Los tipos de datos pueden ser de dos tipos, mutables, variables cuyo valor puede cambiar en tiempo de ejecución, por ejemplo (list o set) e inmutables, variables cuyo valor no puede cambiar en tiempo de ejecución, por ejemplo (str o tuple). Los diferentes tipos son los siguientes: str, unicode, list, tuple, set, frozenset, dict, int, long, float, complex, bool. 2.4.2.2 Shell de Unix Es el intérprete de comandos usado en linux, se usa para, mediante instrucciones comunicarse con el núcleo del sistema y ejecutar las diferentes órdenes del usuario. Más en concreto usaremos zsh, el shell predeterminado de kali linux 2020.4 [10]. Entre sus principales características encontramos que es capaz de completar las líneas de comandos y ayudar a los usuarios a escribir tanto los comandos como sus opciones, puede 8 PROYECTO FIN DE GRADO compartir el historial entre todas las shells en ejecución, tiene distintos tipos de compatibilidad pudiendo de esta forma fingir ser otras shells distintas, muestra los avisos en la ejecución, etc. Sus principales comandos son ls, echo, touch, mkdir, grep, man, pwd, cd, mv, rmdir, locate, less, compgen, cat, head, tail, chmod, exit. 2.4.2.3 ApkTool ApkTool es una herramienta para realizar ingeniería inversa a aplicaciones Android. Es capaz de descodificar un archivo .apk casi hasta su forma original. También es capaz de reconstruir una aplicación decodificada después de realizar cambios. Cuando decodifica una aplicación genera la siguiente estructura [11]: ● Carpeta original: Contiene tanto el AndroidManifest.xml original y la carpeta META-INF original. ● assets: Contiene los recursos de la aplicación como videos, imágenes, audios y ficheros HTML, XML etc. ● res: Contiene los archivos adicionales de la aplicación y el contenido estático de la aplicación. ● Smali: Contiene el código de la aplicación. Dicho código está escrito en Smali. ● lib: Contiene las librerías usadas por la aplicación, siempre y cuando no sean descargadas en ejecución. ● unknown: Contiene ficheros que no son de uso común en la mayoría de aplicaciones. ● AndroidManifest.xml: El archivo AndroidManifest.xml ubicado en la raíz de la aplicación es legible por el usuario y es el que contiene toda la información general de la aplicación. El comando usado para decodificar la aplicación es el siguiente: $ apktool d NombreAplicación.apk Figura 8: Ejecución de ApkTool 2.4.2.4 Numpy Esta herramienta se ha usado porque es una biblioteca que permite crear vectores y matrices multidimensionales de gran tamaño para Python. Se ha usado para la creación de vectores a partir de los datos del Dataset para ser usados por los algoritmos de aprendizaje automático [12]. 9 2. OBJETIVOS Y ALCANCE 2.4.2.5 Pandas Pandas es una biblioteca de software libre usada para la manipulación y análisis de datos en Python, ofrece desde estructuras de datos hasta herramientas para manipular tablas numéricas. Esta herramienta se usará para importar los conjuntos de datos junto con Numpy [13]. 2.4.3 Bibliotecas de AI 2.4.3.1 SKLearn Scikit-learn es una biblioteca de aprendizaje automático, su objetivo es desarrollar técnicas que aprendan, es una biblioteca de software libre y se aplica sobre el lenguaje Python. Entre sus librerías están NumPy, Pandas, SciPy, Matplotlib, Ipython y SymPy. Gracias a esta librería podremos usar los algoritmos y validaciones necesarios para analizar las aplicaciones [14]. 10 PROYECTO FIN DE GRADO Capítulo 3 Estado de la técnica 3.1 Tipos de malware En este apartado del PFG analizaremos los principales tipos de malware existentes en Android, el malware para esta plataforma comenzó a desarrollarse en el 2010, en sus inicios las primeras aplicaciones maliciosas creadas fueron troyanos. Más adelante el malware fue comercializado en la dark web y se crearon kits que permitían una fácil distribución y generación del mismo, un ejemplo conocido es el MazelTov Toolkit, un kit creado en 2005 que permite la generación y distribución de malware para dispositivos android [15]. En el año 2020 Kaspersky mobile ha detectado más de 5 millones y medio de paquetes de instalación maliciosos, más de 156.000 troyanos bancarios y más de 20.000 troyanos de tipo ransomware. En la mayoría de los casos de ciberataques los criminales usan técnicas de ingeniería social, engañando al usuario para la instalación del malware. El año pasado los ciberataques crecieron de forma exponencial debido al COVID-19 y al confinamiento de la mayor parte de la población. Los cibercriminales han aprovechado para crear aplicaciones maliciosas con el formato de aplicaciones que ayudan a la detección del coronavirus o que informan sobre el estado del mismo en la zona del dispositivo [16]. Figura 9: Cantidad de ataques a dispositivos móviles en 2019 y 2020 [16]. Otro software, aunque no malicioso, si es similar al malware es el adware. Este software, no ha crecido a lo largo de la pandemia, sino que su uso se ha mantenido estable, aunque sí se han creado nuevas variantes que dificultan reconocer de qué aplicación provienen los anuncios que el adware genera. 11 3. ESTADO DE LA TÉCNICA Las zonas más afectadas por ataques maliciosos a dispositivos móviles son Irán, Algeria, Bangladesh, India, Marruecos, Nigeria, Arabia Saudita, Malasia, Kenya, Indonesia, Brasil, Argentina, Méjico, Chile y China (SecureList Kaspersky, 2020) [16]. En cuanto a los ataques provocados por malware a las distintas plataformas móviles podemos observar que la cantidad de dispositivos Android atacados creció notablemente el año pasado. Figura 10: Cantidad de ataques a dispositivos móviles Android de 2017 a 2020 Pasando al ataque producido por tipo de malware podemos observar que el malware más común es el AdWare, seguido por las RiskTools y los troyanos con función Dropper. Figura 11: Cantidad de ataques a dispositivos móviles por tipo de malware Entre los permisos que estas aplicaciones maliciosas requieren, los más comunes son los siguientes [17]: ● 12 AUTHENTICATE_ACCOUNTS: Es uno de los permisos más críticos, permite a la aplicación autenticar información de alto valor como contraseñas, este permiso, pedido por una aplicación desconocida muestra indicios de un gran riesgo [18]. PROYECTO FIN DE GRADO ● READ_LOGS: Es un permiso muy solicitado por aplicaciones de terceros de procedencia dudosa, este permiso permite a la aplicación acceder a los archivos de log. En dicho log puede incluirse las pulsaciones de teclas, por lo que en el caso de enviar dichos datos al creador de la aplicación, este podría obtener los usuarios y contraseñas de la víctima. ● READ_CONTACTS: Permite a la aplicación leer la información de los contactos del dispositivo en el que esta se instala, una vez obtenidos estos contactos, puede usarlos para enviar archivos maliciosos a dichos contactos a nombre de la víctima o simplemente ir recopilando información de esta [18]. ● READ_CALENDAR/WRITE_CALENDAR: Estos dos permisos, dependiendo el caso pueden ser insignificantes o de gran importancia ya que permiten a la aplicación leer los datos y crear nuevos eventos en el calendario. ● READ_HISTORY_BOOKMARKS/BOOKMARKS: Permite a la aplicación leer las búsquedas producidas en el dispositivo, puede ser un permiso necesario para aplicaciones que realicen copias de seguridad en el dispositivo pero hay que tener cuidado ya que el historial de búsqueda se comparte entre todos los dispositivos que compartan cuenta de google introducida en el navegador. ● WRITE_SECURE_SETTINGS: Permite a la aplicación tanto leer como escribir los ajustes del sistema, en el caso de sistemas rooteados hay que tener una precaución extra porque tendrá más libertad para realizar ajustes sobre el sistema. ● PROCESS_OUTGOING_CALLS/PHONE_CALLS: El primero permite a la aplicación monitorear las llamadas salientes y el segundo permite tanto monitorizar cómo grabar y procesar dichas llamadas. Estos permisos sólo deben administrarse en el caso de que la aplicación instalada sea VoIP. ● SEND_SMS: En los inicios de Android esta característica permitía a las aplicaciones enviar mensajes SMS a números premium obligando a los usuarios realizar grandes pagos, hoy en día aunque esa función está restringida, aunque hay que tener cuidado porque hay ciertas compañías que siguen cobrando por la emisión y recibo de SMS. ● READ_SOCIAL_STREAM: Permite a la aplicación leer la información obtenida de las feeds de las redes sociales [19]. A continuación se describen los principales tipos de malware encontrados en Android: 3.1.1 Troyanos Un caballo de troya o troyano es un tipo de software maligno camuflado como software benigno o legítimo empleado para acceder a los sistemas de los usuarios. Este software es distribuido a través de algún tipo de ingeniería social engañando a los usuarios para que instalen el mismo. Una vez se instala y ejecuta es capaz de espiar, robar datos, instalar otro software malicioso, tomar imágenes y videos de la cámara, bloquear los datos u obtener la ubicación del dispositivo entre otros. Los diferentes tipos son los siguientes [20][21]: 13 3. ESTADO DE LA TÉCNICA ● SMS: Es capaz de enviar mensajes desde el dispositivo móvil a teléfonos de pago, generando de esta manera que el usuario tenga que realizar pagos a esos propietarios. ● Spy: Son capaces de espiar el uso del dispositivo mediante capturas de pantalla, obtener aplicaciones en ejecución, obtener pulsaciones en pantalla, obtener los datos de la cámara u obtener la ubicación del mismo. ● Mailfinder: Recopila las direcciones de correo electrónico del teléfono móvil. ● Ransom: Bloquea el acceso al usuario a sus archivos y el acceso a ciertas partes del sistema operativo, una vez bloqueados estos apartados, el acceso solo será restablecido una vez sea pagado el rescate solicitado. Figura 12: Cantidad de ataques de troyanos tipo ransom de 2018 a 2020 [16]. 14 ● IM: Roba los datos de inicio de sesión y contraseñas del dispositivo. ● FakeAV: Simula la actividad de los antivirus y es capaz de extorsionar al usuario advirtiéndole sobre falsas amenazas y haciéndole pagar por su eliminación. ● Dropper: Se usa como pasarela para la instalación de otro software malicioso evitando la detección por el antivirus de dicho software malicioso. ● Downloader: Descargan e instalan nuevas versiones del malware anteriormente instalado en el dispositivo. ● DDoS: Realiza ataques de denegación de servicio a una dirección, estos ataques usan el dispositivo afectado como elemento de ataque hacia una dirección IP indicada. ● Banker: Roba los datos bancarios de los distintos sistemas de banca online, de tarjetas de credito y debito y los sistemas de pago electrónico al usuario que ha instalado el troyano. PROYECTO FIN DE GRADO Figura 13: Cantidad de ataques de troyanos Banker de 2017 a 2020 [16]. ● Rootkit: Oculta objetos o actividades en el sistema y su principal objetivo es dificultar la detección de programas maliciosos al sistema para ampliar el periodo en el que el software malicioso pasa inadvertido. ● Exploit: Hace de pasarela para la instalación de otro software malicioso aprovechando una vulnerabilidad del sistema operativo o de alguna de las aplicaciones instaladas. ● Backdoor: Proporciona el control del dispositivo al atacante. A través de este troyano el atacante es capaz de ejecutar comandos, recibir, enviar y eliminar datos del sistema. Son usados comúnmente para crear botnets con fines maliciosos. 3.1.2 Keyloggers Es un software encargado de registrar las pulsaciones en pantalla del usuario y transmitirlas al atacante. Suele ser un programa daemon, es decir, un software ejecutado en segundo plano e invisible para el usuario. Su uso común es el de recoger usuarios y contraseñas de las diferentes aplicaciones, datos bancarios u otro tipo de información bancaria y transmitirla al atacante[22]. A lo largo de los últimos 10 años las compañías de ciberseguridad han detectado un incremento de keyloggers, además el 80% de los keyloggers son indetectables para los antivirus y firewalls [16]. Las aplicaciones keylogger más conocidas son [23]: ● Hoverwatch: Es uno de los mejores, recoge las pulsaciones de mensajes de texto y las pulsaciones en búsquedas online. Además es capaz de detectar cuando se cambia la SIM del teléfono y rastrea las llamadas entrantes y salientes. Es invisible para el usuario pero tiene que ser instalada accediendo físicamente al dispositivo. ● FlexiSpy: Recoge información básica sobre el teléfono, rastrea llamadas, pulsaciones, el atacante es capaz de leer emails, WhatsApp, SMS y obtener la ubicación del dispositivo. Puede activar el micrófono y escuchar conversaciones, no es detectado por el dispositivo. ● mSpy: Lee mensajes, recoge el historial de búsqueda del navegador, obtiene la ubicación GPS del dispositivo y monitoriza el uso tanto de los distintos navegadores como de las aplicaciones como WhatsApp, Instagram, etc. 15 3. ESTADO DE LA TÉCNICA ● HighsterMobile: Captura SMS enviados, monitorea llamadas, recoge las imagenes, videos y audios de la galería, recoge la ubicación y recoge los mensajes de redes sociales como WhatsApp o Snapchat. ● iKeyMonitor: Disponible tanto para iOS como para Android, es capaz de monitorizar llamadas, ubicaciones GPS, información del portapapeles, realizar capturas de pantalla de las webs visitadas, recopilar información de SMS, mensajes de voz, imágenes, videos y pulsaciones en los inicios de sesión. 3.1.3 Ransomware Es un malware muy común en ordenadores aunque los sistemas operativos móviles no quedan exentos de estos ataques, a través de estos ataques los ficheros del sistema quedan encriptados y en ocasiones la pantalla se bloquea, para desbloquear el dispositivo el atacante pide un rescate y en el caso de no pagarse el dispositivo quedará permanentemente bloqueado o se borraran todos los archivos. Aunque el ransomware es conocido desde hace bastante tiempo, como WannaCry, y ha causado grandes pérdidas a diferentes organizaciones a lo largo del tiempo, en el caso de los dispositivos móviles todavía es una tecnología bastante joven, el ransomware para dispositivos móviles comenzó a producirse en el 2014 y es mucho más raro que se produzcan ataques a estos dispositivos. Esto se puede deber a que el formateo del dispositivo es mucho más sencillo y conlleva menos pérdidas de información [24]. A día de hoy el sector más afectado es el sector público, aunque tras la oleada de ataques recibidos hace unos años muchas organizaciones han puesto en marcha medidas para impedir dichos ataques. Además se han investigado técnicas para desencriptar los dispositivos por los ransomware más comunes y sus distintas variantes. En el año 2019 el ransomware GrandCrab, uno de los mayores Ransomware como servicio (RaaS) anunció su final. El grupo creador de este RaaS obtuvo dos billones de dólares vendiendo su software personalizado. En 2020 otra compañía de RaaS anunció su retirada tras atacar a millones de organizaciones tanto públicas como privadas [24]. Un gran ejemplo de ransomware dedicado para Android es “Black Rose Lucy”, detectado por primera vez en 2018, era un Malware como servicio, en ese momento era una botnet enfocada a hacer de pasarela para la instalación de otro tipo de malware en los dispositivos Android. En 2020 reapareció con nuevas características aplicadas al ransomware habilitando la pérdida de control sobre el dispositivo al usuario y permitiendo a los atacantes realizar cambios sobre el sistema e instalar nuevo malware. Actualmente han sido encontradas más de 80 variantes distribuidas a través de internet y la Deep Web [24]. Una vez descargado Lucy encripta todos los ficheros del dispositivo infectado y muestra un mensaje haciéndose pasar por el FBI y acusa al usuario de tener contenido pornográfico en el dispositivo. El mensaje también informa de que el dispositivo ha sido bloqueado y que los detalles del usuario han sido subidos a la base de datos del FBI y pide que la víctima realice un pago de 500 dólares para desbloquear el dispositivo [24]. Para poder realizar dichas acciones la víctima sólo debe dar permisos en la instalación a Lucy. En la ventana donde se muestran los permisos que se van a dar a la aplicación el usuario dará, 16 PROYECTO FIN DE GRADO en la mayoría de los casos sin darse cuenta, permiso para que dicha aplicación realice acciones que realizaría el usuario sin consentimiento de éste, es decir realizará acciones automáticamente. La aplicación mostrará un mensaje preguntando al usuario si quiere activar la optimización de vídeo en streaming, una vez esté, pulse “OK”, el usuario habrá dado permiso al malware para usar los servicios de accesibilidad y Lucy obtendrá privilegios administrativos. 3.1.4 Spyware y Stalkerware El spyware es uno de los malware más comunes en dispositivos móviles. Permite a los atacantes monitorizar y grabar información sobre la actividad del dispositivo móvil. Es capaz de recopilar tanto información del dispositivo en sí como de las aplicaciones instaladas en el mismo. La gran diferencia entre Stalkeware y Spyware es que el primero es más invasivo e intrusivo que el segundo. Dependiendo de si el dispositivo está rooteado el Spyware o el Stalkeware tendrá más facilidades para activar el micrófono o la cámara de forma remota, realizar capturas de pantalla, ver la actividad de aplicaciones de terceros como WhatsApp o Instagram, interceptar, redirigir y grabar llamadas, etc. Aunque hay acciones que puede realizar sin que el dispositivo esté rooteado, por ejemplo, ver la galería del dispositivo, las páginas web visitadas, los SMS enviados y recibidos, la ubicación del dispositivo o el historial de llamadas [25]. Uno de los Spyware actuales más controvertidos y conocidos para Android es System Update/Zimperium, el cual es uno de los malware actuales más sofisticados, una vez se instala una aplicación infectada descargada desde una fuente externa a Google Play Store, la aplicación lanza una notificación simulando ser una actualización del sistema operativo. Una vez se pulsa este desplegable y confirma la actualización el malware obtendrá acceso total al dispositivo. Este spyware tendrá acceso a los contactos, historial de llamadas, acceso a la cámara, SMS, mensajes de WhatsApp, ver el historial de navegación, obtener la ubicación, etc [26]. 3.1.5 Adware Aunque el uso de adware a lo largo de los años ha ido decayendo, el año 2020 esta decaida sufrió un receso debido a la pandemia. Figura 14: Cantidad de ataques de Adware de 2018 a 2020 [16] 17 3. ESTADO DE LA TÉCNICA El funcionamiento del Adware es el siguiente, inicialmente la víctima instala una aplicación maliciosa, una vez instalada, pueden ocurrir dos cosas, en el caso de que el usuario tenga suerte, los anuncios se mostrarán bajo la tarea de la aplicación, es decir será fácil identificar qué aplicación los genera, en el caso contrario, los anuncios se mostrarán a pantalla completa aunque la aplicación permanezca cerrada en intervalos aleatorios [27]. 3.2 Tipos de análisis En este apartado analizaremos los distintos tipos de análisis tradicionales de aplicaciones Android. Entre ellos se encuentran el análisis estático, el dinámico y el híbrido. Estos tres análisis se diferencian en que el primero busca patrones dentro de las aplicaciones sin que estas sean ejecutadas, es decir, decodifica la aplicación y buscan características distintivas tanto dentro del código como en la estructura de los archivos. El segundo, el análisis dinámico, ejecuta la aplicación y busca patrones de comportamiento dentro de la misma, ya sea visualmente, por el tráfico de paquetes de red, por el consumo de recursos u otro tipo de característica. Finalmente el análisis híbrido, realiza un equilibrio entre las dos, busca características a través del análisis dinámico y genera un conjunto de datos con el que posteriormente realiza un análisis mediante aprendizaje automático [28]. 3.2.1 Estático Esta técnica trata de analizar aplicaciones en busca de indicios de maliciosidad sin ejecutar la aplicación en un dispositivo o emulador. Entre las ventajas de este método está que el costo computacional es bajo, es decir consume pocos recursos, otra ventaja es que el tiempo necesario para el análisis es menor que el necesario para el análisis dinámico. Como inconveniente se encuentra la ofuscación del código, haciendo que la búsqueda de patrones sea compleja. Dentro del análisis estático hay dos técnicas principales, la primera es la detección del mal uso y la segunda es la detección de anomalías [29]. La primera técnica, la detección del mal uso, también conocida como detección basada en firmas, trata de buscar coincidencias en la secuencia de instrucciones de la aplicación o en las políticas de esta. La segunda, la detección de anomalías se basa en el uso de algoritmos de aprendizaje automático para detectar los comportamientos maliciosos de una aplicación. Las características extraídas de la aplicación se utilizarán para entrenar un algoritmo de aprendizaje automático y predecir nuevo malware o malware desconocido. 3.2.2 Dinámico El análisis dinámico se basa en evaluar el malware mediante la ejecución de una aplicación en tiempo real mediante una máquina virtual o un dispositivo físico. Sus principales ventajas son que detecta la carga de código dinámico y puede registrar el comportamiento de la aplicación en tiempo de ejecución. No determina la cantidad de código ejecutado a lo largo de la ejecución, esto conlleva que existe la posibilidad de que el código malicioso no sea ejecutado durante la ejecución. Existe malware que es capaz de detectar cuando la aplicación se está ejecutando en una máquina virtual y reacciona ante ello no ejecutando código malicioso alguno. Otro de sus grandes problemas es que es más difícil de implementar debido a la carga computacional y que conlleva una mayor cantidad de tiempo a dedicar [29]. 18 PROYECTO FIN DE GRADO 3.2.3 Híbrido Es una combinación de análisis estático y dinámico. Integra los datos extraídos a lo largo del análisis dinámico en tiempo de ejecución con los algoritmos de análisis estático para detectar el comportamiento malicioso o la funcionalidad sospechosa. Se usan las características obtenidas a lo largo del análisis dinámico, es decir, la información recopilada a lo largo de la ejecución de la aplicación y se combina con las características estáticas. Esta combinación puede conllevar beneficios en cuanto a la precisión del análisis [29]. 3.3 Explicación de técnicas IA 3.3.1 Modelos Lineales Los siguientes son un conjunto de métodos destinados a la regresión en los que el valor objetivo está previsto que sea una combinación lineal de funciones. En términos matemáticos, si “y” es el valor predecido [30]: Figura 15: Fórmula modelos lineales [30]. Para realizar la clasificación mediante modelos lineales generalizados, haremos uso de la regresión logística. 3.3.1.1 Ridge Classifier La regresión de Ridge tiene una variante de clasificación denominada Ridge Classifier o Clasificador de Crestas. Este clasificador comienza convirtiendo objetivos binarios a {-1, 1} y a continuación trata el problema como una tarea de regresión, optimizando el objetivo de la misma forma que se ha mencionado anteriormente. La clase predicha corresponde al signo de la predicción de la regresión. Para la clasificación de multiclase, el problema es tratado como regresión de salida múltiple y la clase predicha corresponde a la salida con el valor más alto [31]. Podría ser cuestionable la utilización de la pérdida de Least Squares (Mínimos Cuadrados) penalizados para adaptarse a un modelo de clasificación en vez de a un modelo logístico más tradicional o pérdidas de bisagra (hinge losses). De todas formas, en lo que se refiere a la práctica, todos los modelos nombrados pueden conducir a similares puntuaciones de validación cruzada en términos de precisión. Entre tanto, la pérdida de mínimos cuadrados penalizada utilizada por el Ridge Classifier o Clasificador de Crestas, permite una elección muy diferente de solucionadores numéricos con perfiles de rendimiento computacional distintos. Puede ser significativamente más rápido que el Logistic Regression o Regresión Logística con un alto número de clases, ya que es capaz de calcular la matriz de proyección sólo una vez. 19 3. ESTADO DE LA TÉCNICA Los parámetros de regularización son los siguientes: RidgeCV implementa la regresión de cresta con validación cruzada integrada del parámetro alfa. El objeto funciona de la misma manera que GridSearchCV, excepto en que su valor predeterminado es Leave-One-Out Cross-Validation. Si se especifica el valor del atributo cv, se activará el uso de la validación cruzada con GridSearchCV, por ejemplo cv=10 para la validación cruzada de 10 veces, en lugar de Leave-One-Out Cross-Validation [32]. 3.3.1.2 Logistic Regression La regresión logística, a pesar de su nombre, en un modelo lineal para la clasificación en lugar de la regresión. La regresión logística también se conoce como, clasificación de máxima entropía (MaxEnt) o clasificador logarítmico-lineal. En este modelo, las probabilidades que describen los posibles resultados de un solo ensayo se modelan mediante una función logística. Hay que tener en cuenta que la regularización se aplica de forma predeterminada, lo que es común en el aprendizaje automático, pero no en las estadísticas. Otra ventaja de la regularización es que mejora la estabilidad numérica. Ninguna regularización equivale a establecer C en un valor muy alto [33]. En el caso multiclase, el algoritmo de entrenamiento utiliza el esquema de one-vs-rest (OvR) o “uno contra otro” si la opción “multi_class” se establece en “ovr”, y utiliza la pérdida de entropía cruzada si la opción de “multi_class” se establece como “multinominal”. Actualmente la opción “multinominal” es solo compatible con los solucionadores “lbfgs”, “sag”, “saga” y “newton-cg”. Este tipo de clase implementa la regresión logística regularizada utilizando la biblioteca “liblinear” y los solucionadores “lbfgs”, “sag”, “saga” y “newton-cg”. Los solucionadores “newton-cg”, “sag” y “lbfgs” solo admiten la regularización ℓ2 con formación primaria, o ninguna regularización. El solucionador “liblinear” soporta tanto la regularización ℓ1 como la ℓ2, con una formulación dual solo para la penalización ℓ2. La regularización de Elastic-Net solo es compatible con el solucionador de “saga” [34]. Como problema de optimización, la regresión logística penalizada de clase binaria ℓ2 minimiza la siguiente función de costo: Figura 16: Función de costo 1 [34]. Similarmente, ℓ1 la regresión logística regularizada resuelve el siguiente problema de optimización: Figura 17: Problema de optimización [34]. 20 PROYECTO FIN DE GRADO La regularización Elastic-Net es una combinación de ℓ1 y ℓ2 y minimiza la siguiente función de costo: Figura 18: Función de costo 2 [34]. Donde ρ controla la fuerza de regularización ℓ1 contra la regularización ℓ2 (corresponde al parámetro l1_ratio). En lo que se refiere a los solucionadores, el solucionador “sag” utiliza el descenso de gradiente medio estocástico (Stochastic Average Gradient). Es más rápido que otros solucionadores para conjuntos de datos grandes, cuando tanto el número de muestras, como el número de entidades son grandes. Por otro lado, el solucionador “saga” es una variante del “sag” que también admite la non-smooth (no suave) penalización=”l1”. Por lo tanto, este es el solucionador de elección para la regresión logística multinomial dispersa. También es el único solucionador que admite la penalización = "Elastic-Net". Por último, el "lbfgs" es un algoritmo de optimización que se aproxima al algoritmo de Broyden-Fletcher-Goldfarb-Shanno, que pertenece a los métodos cuasi-Newton. El solucionador "lbfgs" se recomienda para el uso de conjuntos de datos pequeños, pero para conjuntos de datos más grandes su rendimiento se ve afectado [34]. 3.3.1.3 SGD Classifier La clase SGD Classifier implementa una rutina de aprendizaje de descenso de gradiente estocástico simple que admite diferentes funciones de pérdida y penalizaciones para la clasificación. El gradiente de la pérdida se estima cada muestra a la vez y el modelo se actualiza a lo largo del camino con un programa de disminución de la fuerza (también conocido como tasa de aprendizaje). SGD permite el aprendizaje de minibatch (en línea / fuera del núcleo) a través del método de partial_fit. Para obtener los mejores resultados utilizando el programa de tasa de aprendizaje predeterminado, los datos deben tener una media cero y una varianza unitaria [35]. Esta implementación funciona con datos representados como matrices densas o dispersas de valores de punto flotante para las entidades. El modelo que se ajusta se puede controlar con el parámetro de pérdida; de forma predeterminada, se ajusta a una máquina de vectores de soporte lineal (SVM). El regularizador es una penalización añadida a la función de pérdida que reduce los parámetros del modelo hacia el vector cero utilizando la norma euclidiana al cuadrado ℓ2 o la norma absoluta ℓ1 o una combinación de ambos (Elastic-Net). Si la actualización del parámetro cruza 21 3. ESTADO DE LA TÉCNICA el valor 0.0 debido al regularizador, la actualización se trunca a 0.0 para permitir el aprendizaje de modelos dispersos y lograr la selección de características en línea. El SGD Classifier o Clasificador SGD admite la clasificación multiclase mediante la combinación de varios clasificadores binarios en un esquema “one vs all” (OVA) o “uno contra todos”. Para cada una de las K clases, entrene un clasificador binario que discrimina entre eso y todas las demás K−1 clases [36]. 3.3.2 Nearest Neighbors Los vecinos más cercanos no supervisados son la base de muchos otros métodos de aprendizaje, en particular el aprendizaje múltiple y el clustering espectral. El aprendizaje supervisado basado en vecinos viene en dos grupos: clasificación para datos con etiquetas discretas y regresión para datos con etiquetas continuas [37]. El principio detrás de los métodos de Nearest Neighbors o vecino más cercano es encontrar un número predefinido de muestras de entrenamiento más cercanas en distancia al nuevo punto y predecir la etiqueta a partir de estos. El número de muestras puede ser una constante definida por el usuario, o variar en función de la densidad local de puntos (aprendizaje de vecino basado en radio). La distancia puede, en general, ser cualquier medida métrica (la distancia euclidiana estándar es la opción más común). Los métodos basados en vecinos se conocen como métodos de aprendizaje automático no generalizados, ya que simplemente "recuerdan" todos sus datos de entrenamiento [37]. A pesar de su simplicidad, Nearest Neighbors o vecinos más cercanos ha sido exitoso en un gran número de problemas de regresión y clasificación, incluyendo los dígitos escritos a mano y las imágenes de satélite. Siendo un método no-paramétrico a menudo tiene éxito en situaciones de clasificación donde el límite de decisión es muy irregular. En la clasificación de Nearest Neighbors o vecinos más cercanos, se pueden diferenciar dos técnicas: Por un lado, el Radius Neighbors Classifier que implementa el aprendizaje basado en el número de vecinos dentro de un radio “r” fijo de cada punto de entrenamiento, donde “r” es un valor de punto flotante especificado por el usuario. En los casos en los que los datos no se muestran uniformemente, la clasificación de vecinos basada en radios en Radius Neighbors Classifier puede ser la mejor opción. Por otro lado nos encontramos con KNeighbors Classifier, esta es la técnica más utilizada y está pensada para datos uniformes. Esta técnica será analizada en el apartado contiguo. 3.3.2.1 KNeighbors Classifier KNeighbors Classifier es la técnica más común e implementa el aprendizaje basado en los vecinos más cercanos de cada punto de consulta, donde “k” es un valor entero especificado por el usuario. La elección óptima del valor “k” es altamente dependiente de los datos: en general, un mayor “k” suprime los efectos del ruido, pero hace que los límites de clasificación sean más regulares [38]. 22 PROYECTO FIN DE GRADO La clasificación básica de vecinos más cercanos utiliza ponderaciones uniformes: es decir, el valor asignado a un punto de consulta se calcula a partir de un voto por mayoría simple de los vecinos más cercanos. En algunas circunstancias, es mejor ponderar a los vecinos de tal manera que los vecinos más cercanos contribuyan más al ajuste. Esto se puede lograr a través de la palabra clave weights. El valor predeterminado, weights = “uniform”, asigna pesos uniformes a cada vecino. Weights = “distance” asigna pesos proporcionales a la inversa de la distancia desde el punto de consulta. Alternativamente, se puede proporcionar una función definida por el usuario de la distancia para calcular los pesos. 3.3.3 Naive Bayes Los métodos Naive Bayes son un conjunto de algoritmos revisados de aprendizaje basados en aplicar el teorema de Bayes con la suposición ingenua de la independencia condicional entre cada par de entidades dado el valor de la variable de clase. El teorema de Bayes establece una relación, dada la variable de clase y el vector de entidad dependiente a través de diversas fórmulas. A pesar de sus suposiciones aparentemente demasiado simplificadas, los clasificadores Bayes ingenuos han funcionado bastante bien en muchas situaciones del mundo real, famosamente la clasificación de documentos y el filtrado de spam. Requieren una pequeña cantidad de datos de entrenamiento para estimar los parámetros necesarios. Los algoritmos de aprendizaje y clasificadores Naive Bayes pueden ser extremadamente rápidos en comparación con métodos más sofisticados [39]. 3.3.3.1 Gaussian Naive Bayes El GaussianNB implementa el algoritmo Bayes ingenuo Gaussiano para la clasificación. Se supone que la probabilidad de las entidades es Gaussiana: Figura 19: Fórmula Gaussian Naive Bayes [39]. Los parámetros σy y μy se estiman utilizando la máxima verosimilitud. 3.3.4 Decision Trees Los árboles de decisión o Decision Trees (DTs) son un método de aprendizaje supervisado no paramétrico utilizado para la clasificación y la regresión. El objetivo es crear un modelo que prediga el valor de una variable de destino mediante el aprendizaje de reglas de decisión simples inferidas de las características de datos. Un árbol se puede ver como una aproximación constante por partes. Son simples para entender e interpretar, ya que se pueden visualizar, además, requieren una pequeña base de datos y tienen la capacidad de manejar problemas de salida múltiple. 23 3. ESTADO DE LA TÉCNICA Por el contrario, los árboles de decisión pueden ser inestables porque pequeñas variaciones en los datos pueden dar lugar a la generación de un árbol completamente diferente y los algoritmos de aprendizaje de árboles de decisión crean árboles sesgados si algunas clases dominan. Por lo tanto, se recomienda equilibrar el conjunto de datos antes de ajustarlo al árbol de decisión [40]. 3.3.4.1 Decision Tree Classifier Decision Tree Classifier es una clase capaz de realizar la clasificación multiclase en un conjunto de datos. Al igual que con otros clasificadores, Decision Tree Classifier toma como entrada dos matrices: una matriz X, dispersa o densa, de forma (n_samples, n_features) que contiene las muestras de entrenamiento, y una matriz Y de valores enteros, de forma (n_samples,), que contiene las etiquetas de clase para las muestras de entrenamiento. Después de ser ajustado, el modelo se puede utilizar para predecir la clase de muestras. En caso de que haya varias clases con la misma y más alta probabilidad, el clasificador predecirá la clase con el índice más bajo entre esas clases. Como alternativa a la salida de una clase específica, se puede predecir la probabilidad de cada clase, que es la fracción de muestras de entrenamiento de la clase en una hoja. Para terminar, Decision Tree Classifier es capaz de clasificación binaria (donde las etiquetas son [-1, 1]) y multiclase (donde las etiquetas son [0, ..., K-1]) [41]. 3.3.5 Ensemble Methods El objetivo de los conjuntos de métodos es combinar las predicciones de varios estimadores base construidos con un algoritmo de aprendizaje dado con el fin de mejorar la generalización sobre un solo estimador. Se suelen distinguir dos tipos de conjuntos de métodos: Por una parte, los métodos de promediación (averaging methods) que tienen como objetivo construir varios estimadores de forma independiente para luego promediar sus predicciones. En promedio, el estimador combinado suele ser mejor que cualquiera de los estimadores de base única porque su varianza se reduce. Por el contrario, en los métodos de impulso (boosting methods), los estimadores de base se construyen secuencialmente y se intenta reducir el sesgo del estimador combinado. La motivación es combinar varios modelos débiles para producir un conjunto poderoso [42]. 3.3.5.1 AdaBoost Classifier Un clasificador AdaBoost es un meta-clasificador que comienza ajustando un clasificador en el conjunto de datos original y, a continuación, ajusta copias adicionales del clasificador en el mismo conjunto de datos, pero donde los pesos de las instancias clasificadas incorrectamente se ajustan de modo que los clasificadores posteriores se centran más en casos difíciles [43]. 24 PROYECTO FIN DE GRADO 3.3.5.2 Gradient Boosting Classifier El Clasificador del Árbol de Gradiente admite la clasificación binaria y multiclase. Construye un modelo aditivo de una manera avanzada en cuanto a la etapa; permite la optimización de funciones de pérdida diferenciables arbitrarias. En cada etapa n_classes, los árboles de regresión se ajustan al gradiente negativo de la función de pérdida de desviación binomial o multinomial. La clasificación binaria es un caso especial en el que solo se induce un único árbol de regresión. 3.3.6 Multi-Layer Perceptron Multi-layer Perceptron (MLP) es un algoritmo de aprendizaje supervisado que aprende de una función f(⋅):Rm→Ro mediante el entrenamiento en un conjunto de datos, donde m es el número de dimensiones para la entrada y o es el número de dimensiones para la salida. Dado un conjunto de características X=x1,x2,...,xm y un objetivo Y, puede aprender un aproximador de función no lineal para clasificación o regresión. Es diferente de la regresión logística, en que entre la capa de entrada y la de salida, puede haber una o más capas no lineales, llamadas capas ocultas [44]. 3.3.6.1 MLP Classifier La clase MLP Classifier implementa un algoritmo Perceptron de varias capas (MLP) que entrena mediante Backpropagation [44]. MLP entrena en dos matrices: matriz X de tamaño (n_samples, n_features), que contiene las muestras de entrenamiento representadas como vectores de entidad de punto flotante, y la matriz y de tamaño (n_samples,), que contiene los valores de destino (etiquetas de clase) para las muestras de entrenamiento. Después del entrenamiento, el modelo puede predecir etiquetas para nuevas muestras. MLP puede ajustar un modelo no lineal a los datos de entrenamiento. clf.coefs contiene las matrices de peso que constituyen los parámetros del modelo. Actualmente, MLP Classifier sólo admite la función de pérdida de entropía cruzada, que permite las estimaciones de probabilidad mediante la ejecución del método de predict_proba. Más precisamente, MLP Classifier entrena usando alguna forma de descenso de gradiente y los gradientes se calculan usando Backpropagation. Para la clasificación, minimiza la función de pérdida de entropía cruzada, dando un vector de estimaciones de probabilidad P(y/x) por muestra x. MLP Classifier admite la clasificación multiclase aplicando Softmax como la función de salida. Además, el modelo admite la clasificación de varias etiquetas en la que una muestra puede pertenecer a más de una clase. Para cada clase, la salida sin procesar pasa a través de la función logística. Los valores mayores o iguales a 0,5 se redondean a 1, de lo contrario a 0. Para una salida predicha de una muestra, los índices donde el valor es 1 representan las clases asignadas de esa muestra [44]. 25 3. ESTADO DE LA TÉCNICA 26 PROYECTO FIN DE GRADO Capítulo 4 Metodología Desarrollada 4.1 CRISP-DM Based Para este Proyecto Fin de Grado se propone un esquema basado en CRISP-DM (Cross Industry Standard Process for Data Mining), este modelo es un modelo de estándar abierto usado para describir los enfoques comunes usados en minería de datos. CRISP-DM está dividido en seis fases principales, dichas fases se pueden permutar [45]. Figura 20: Diagrama CRISP-DM [46] Este PFG, utiliza como base dicho esquema CRISP-DM, pero con los pasos propios del análisis de una aplicación Android, es decir, en vez de entender los datos se entienden las características, en vez de modelar, se buscan nuevas características, se analizan y evalúan los datos extraídos y se vuelve a comenzar. Los pasos seguidos a lo largo de esta metodología son los siguientes: Figura 21: Diagrama CRISP-DM Based 27 4. METODOLOGÍA DESARROLLADA ● Búsqueda de nuevas muestras: Se buscan aplicaciones Android, tanto software benigno, como malware. Este software será el software a analizar para verificar la efectividad de las características extraídas. ● Búsqueda de nuevas características: Se analizan las distintas muestras en busca de características identificativas para su posterior análisis y evaluación. ● Extracción: Cuando se haya encontrado una nueva característica o se haya realizado una combinación de distintas características, dichas características serán extraídas a un Dataset con formato “.csv” ● Análisis: El Dataset extraído será aplicado a diferentes algoritmos de clasificación y posteriormente se analizará la efectividad de dichos clasificadores con las características extraídas. ● Evaluación de resultados: Los resultados obtenidos a partir del análisis serán evaluados y se verificará si son válidos para combinarlos con las características escogidas en sucesiones de fases anteriores. ● Combinación de características: En el caso de que los resultados sean válidos se combinarán con otros resultados positivos para obtener una cantidad de variables lo más completa posible, creando así un análisis estático efectivo. 4.2 Conjunción de características Una de las principales innovaciones de este PFG ante papers anteriores es la búsqueda de nuevas características interesantes a analizar para una búsqueda más efectiva de malware en software Android. Para ello, como se ha mencionado anteriormente se propone un análisis basado en CRISP-DM. Lo que se hace a través de esta metodología es la repetición del mismo proceso en busca de las mejores características a analizar en una aplicación Android. Una vez se realice el análisis de las diferentes características de forma individual, se realizará un análisis de la combinación de las diferentes características. Una vez se hayan combinado dichas características se realizará otro análisis para verificar que la combinación de dichas características aporta mejoría. Cuando se han encontrado combinaciones de características se volverán a buscar nuevas características a analizar y si son validas serán añadidas al conjunto y así sucesivamente. 4.3 Características extraídas En este apartado se analizarán las características extraídas de la aplicación, para ello primero se realizará un análisis de los contenidos de las aplicaciones Android y seguidamente se analizarán las diferentes características, tanto del AndroidManifest.xml, como de la aplicación en sí por separado. Para empezar es necesario saber que es un fichero “.apk”, un fichero “.apk” (Android Application Package) es un paquete usado en el sistema operativo Android. Es una variante del formato “.jar” de Java [47], es usado para empaquetar y distribuir software en Android. El uso 28 PROYECTO FIN DE GRADO es similar a otros paquetes como “.appx” en Windows o .deb en sistemas basados en Debian. Para crear una aplicación Android se deberá compilar un programa en un archivo “.apk” [48], el cual contendrá: ● ● Directorio META-INF: Es el contenedor de los archivos reconocidos, es interpretado por Java para configurar la aplicación, sus extensiones, clases y servicios [49][50]: ○ MANIFEST.MF: Archivo manifest, contiene los metadatos de la aplicación. Es decir describe el nombre, número de versión, licencia y los archivos que forman parte de la aplicación [51]. ○ CERT.RSA: Certificado de la aplicación con el que se firma la aplicación. Contiene el nombre de la organización o desarrollador que generó el APK y la clave pública utilizada para firmar los contenidos. ○ CERT.SF: Contiene un listado de todos los archivos junto con el resumen SHA-1 de los mismos. Directorio lib: Contiene el código compilado específico de la capa de software de un procesador: ○ armeabi: Código compilado para los procesadores basados en ARM. ○ armeabi-v7a: Código compilado para los procesadores ARMv7 y posteriores. ○ arm64-v8a: Código compilado para los procesadores ARMv8, arm64 y posteriores. ○ x86: Código compilado para procesadores x86. ○ x86_64: Código compilado para procesadores x86_64. ○ Mips: Código compilado para procesadores MIPS. ● Directorio res: Contiene los recursos no compilados en resources.arsc, es decir los archivos adicionales y el contenido estático usado por el código como bitmaps, definición de estructuras, ajustes de la UI, instrucciones de animación etc [52]. ● Directorio assets: Contiene los recursos de la aplicación. Es decir contiene ficheros como archivos de texto, XML, HTML, fuentes, audios, imágenes, videos o audios usados por la aplicación [53]. ● AndroidManifest.xml: Archivo de manifiesto adicional de Android. ● classes.dex: Clases compiladas en el formato .dex es legible tanto por una máquina virtual Dalvik como por Android Runtime [54][55]. ● resources.arsc: Contiene los recursos precompilados [56]. 29 4. METODOLOGÍA DESARROLLADA Un fichero “.apk” es un archivo “.zip” que contiene código java ensamblado. Si dicho archivo se extrae usando una herramienta que descomprima “.zip” se generará una carpeta con los assets de la aplicación, una carpeta con los metadatos de la misma, otra llamada res con los elementos de diseño de la misma, unos archivos .dex y .arsc y un archivo AndroidManifest.xml. Hay que tener en cuenta que los archivos contenidos, en el caso de ser extraídos por una herramienta no específica para aplicaciones Android “.apk”, serán difícilmente legibles o en ciertos casos completamente ilegibles, por esa razón se usan herramientas como ApkTool. 4.3.1 AndroidManifest 4.3.1.1 Paquete El paquete se usa como id para las diferentes llamadas a la aplicación, por ejemplo cuando se compila la aplicación las herramientas de compilación Android usan el paquete como espacio de nombres para la clase R.java [57]. Por ejemplo: com.aplicacion.R Figura 22: Formato paquete [51]. También es usado para resolver los nombres de clase declarados en el AndroidManifest.xml. El nombre del package debe coincidir con el nombre del paquete básico del proyecto, para que a la hora de importar los subpaquetes de la misma se le añada el sufijo al nombre del paquete. Una vez se compila y se genera el fichero .apk, el nombre del paquete será el ID de la aplicación, por lo que el valor del atributo Package debe ser único para garantizar que la aplicación pueda ser identificada por el dispositivo Android y por Google Play. Ejemplo del campo paquete en AndroidManifest.xml: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.aplicacion" android:versionCode="1" android:versionName="1.0" > ... </manifest> Figura 23: Paquete en AndroidManifest [51]. 4.3.1.2 Activity Una Activity es la representación de la realización de una acción por el usuario, casi todas las actividades interaccionan con los usuarios. Aunque dichas actividades normalmente son usadas como ventanas de pantalla completa, también pueden ser usadas para otros propósitos como ventanas flotantes, por ejemplo para el uso en multiventana de Android. El campo Activity dentro del AndroidManifest declara una actividad la cual implementa una parte de la UI de la aplicación, toda actividad debe estar representada por el identificador en el manifiesto. Las actividades que no estén nombradas en dicho manifiesto no serán visibles para el sistema por lo que nunca serán ejecutadas [58]. 30 PROYECTO FIN DE GRADO Este campo puede tener diferentes atributos como "android:banner", que proporciona un banner extendido para el componente asociado o "android:configChanges" que muestra una lista de todos los cambios que realizará dicha actividad a lo largo de la ejecución. Estas variables pueden contener a su vez diferentes parámetros, los cuales pueden ser tanto las definiciones mostradas como ="string" o ="integer" o bien pueden ser los parámetros de las diferentes variables como =["true" | "false"], =[ "hdr" | "wideColorGamut"], etc. <activity android:allowEmbedded=["true" | "false"] android:allowTaskReparenting=["true" | "false"] android:alwaysRetainTaskState=["true" | "false"] android:autoRemoveFromRecents=["true" | "false"] android:banner="drawable resource" android:clearTaskOnLaunch=["true" | "false"] android:colorMode=[ "hdr" | "wideColorGamut"] android:configChanges=["mcc", "mnc", "locale", "touchscreen", "keyboard", "keyboardHidden", "navigation", "screenLayout", "fontScale", "uiMode", "orientation", "density", "screenSize", "smallestScreenSize"]> . . . </activity> Figura 24: Activity en AndroidManifest [59]. 4.3.1.3 Service Un servicio es un componente que pretende mantener una operación de ejecución larga sin interactuar con el usuario, uno de sus posibles usos es para aportar funcionalidad a otras aplicaciones. Cada servicio debe tener un correspondiente en el AndroidManifest.xml para que pueda ser usado por el sistema, en caso contrario y al igual que las actividades, los servicios que no se muestren en el AndroidManifest.xml nunca serán ejecutados ni detectados por el sistema. Los servicios, al igual que otros objetos de aplicación, son ejecutados en el hilo principal del proceso host, lo que conlleva que si el servicio va a realizar operaciones de alta carga debe usar un hilo propio en el cual realice dicha operación. A diferencia de las actividades los servicios no requieren interfaz de usuario [60]. En el archivo AndroidManifest.xml los services deben ser declarados en el AndroidManifest de la siguiente manera: <service android:atributo="tipo" android:atributo=["opción" | "opción" | . . .] . . . > . . . </service> Figura 25: Formato service [61]. 31 4. METODOLOGÍA DESARROLLADA Ejemplo de código en AndroidManifest.xml: <service android:description="string resource" android:directBootAware=["true" | "false"] android:enabled=["true" | "false"] android:exported=["true" | "false"] android:foregroundServiceType=["camera" | "connectedDevice" | "dataSync" | "location" | "mediaPlayback" | "mediaProjection" | "microphone" | "phoneCall"] android:icon="drawable resource" android:isolatedProcess=["true" | "false"]> . . . </service> Figura 26: Service en AndroidManifest [61]. 4.3.1.4 Content providers Los "Content providers" son una de las principales estructuras usadas en las aplicaciones Android. Estos bloques encapsulan la información y la proveen a las diferentes aplicaciones a través del ContentResolver. El content provider solo es necesario si tienes que compartir información entre múltiples aplicaciones. Un ejemplo serían los contactos, la información de la aplicación Contactos es compartida en múltiples aplicaciones como WhatsApp o Telegram. Cuando una petición se realiza mediante el ContentResolver el sistema inspeccionará el privilegio de la URI proporcionada y transmitirá la petición al "Content provider" con los privilegios mencionados. El content provider es capáz de interpretar el resto de la URI a su elección. En el AndroidManifest.xml se declarará con la etiqueta “Provider” y al igual que con los Services y las Activities todo ContentProvider debe manifestarse en el AndroidManifest.xml. En el AndroidManifest de una aplicación sólo deben mostrarse los content providers propios de la aplicación, los que se usen en la aplicación pero sean de otra aplicación no deberán mencionarse [62][63]. El Sistema guardará las referencias de los "Content providers" de acuerdo con el string de privilegios, siendo este parte de la URI del proveedor. Por ejemplo si deseamos acceder a un proveedor de contenido que almacena información de contactos, llamaremos a el metodo ContentResolver.query(), este método recogerá una URI que identifica al proveedor como por ejemplo: content://com.proyecto.contactos/rn Figura 27: Formato Content Providers [62] El content es un esquema que identifica la URI como una URI de contenido que llama al proveedor de contenido. La autoridad "com.proyecto.contactos" identifica al propio proveedor. El sistema Android buscará a la autoridad en su propia lista de autoridades y el substring 32 PROYECTO FIN DE GRADO contactos/rn indica la ruta que usará el "Content provider" para recoger la información. En el elemento sólo debe mostrarse la autoridad, no los paths. Los content providers seguirán el mismo formato que los anteriores métodos. <provider android:authorities="list" android:directBootAware=["true" | "false"] android:enabled=["true" | "false"] android:exported=["true" | "false"] android:grantUriPermissions=["true" | "false"] android:icon="drawable resource" android:initOrder="integer" android:label="string resource" android:multiprocess=["true" | "false"] android:name="string" android:permission="string" android:process="string" android:readPermission="string" android:syncable=["true" | "false"] android:writePermission="string" > . . . </provider> Figura 28: Content Providers en AndroidManifest 4.3.1.5 Broadcast receivers Las aplicaciones pueden enviar o recibir mensajes de difusión tanto del propio sistema Android como de otras aplicaciones Android, estos mensajes se enviarán cuando suceda un evento de interés. Por ejemplo cuando el dispositivo se apaga o reinicia, cuando se pone en modo avión, cuando comienza a cargarse, etc. También estos mensajes de difusión pueden ser transmitidos por las diferentes aplicaciones para notificar sucesos de interés a otras aplicaciones. Una vez suceda algún evento de interés el sistema enviará un mensaje de difusión a todas las aplicaciones que estén registradas para recibir dicho tipo de mensaje [64][65]. El uso incorrecto de este módulo puede llegar a acarrear la ralentización del sistema o el uso inadecuado de la información del mismo. Estos mensajes de difusión pueden ser recibidos de dos formas, la primera es a través de receptores declarados en el archivo AndroidManifest.xml, la segunda es a través de los receptores con contexto registrado. En nuestro caso solamente analizaremos los que son registrados a través del AndroidManifest. Cuando un mensaje de difusión que es declarado en el AndroidManifest hace que una vez suceda un evento de interés se pueda ejecutar la aplicación a no ser que esta ya esté en ejecución. 33 4. METODOLOGÍA DESARROLLADA Los Broadcast Receiver son declarados en el manifest de la siguiente manera: <receiver android:name=".MyBroadcastReceiver" android:exported="true"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> <action android:name="android.intent.action.INPUT_METHOD_CHANGED" /> </intent-filter> </receiver> Figura 29: Broadcast Receiver en AndroidManifest [66] 4.3.1.6 Intent Filter Actions e Intent Filter Categories En este apartado comenzaremos definiendo los Intent Filters, seguidamente pasaremos a los Intent Filter Actions y finalizaremos con los Intent Filter Categories. Un Intent Filter especifica los tipos de intenciones a los que una actividad, servicio o broadcast puede responder, es decir, a qué broadcast puede responder y qué actividades y servicios puede realizar la aplicación [67]. Su formato es el siguiente: <intent-filter android:icon="drawable resource" android:label="string resource" android:priority="integer" > . . . </intent-filter> Figura 30: Intent filter en AndroidManifest [67] El elemento “<action />” añade una acción al "Intent filter", este puede contener una o más acciones, en el caso de que un <intent-filter> esté vacío, no aceptará ningún "Intent". La acción dentro del intent filter indica la acción que realizará el Intent, el valor contenido debe ser el del string de la acción, no el de la clase [68][69]. El atributo “<category />” indica la categoría a la que pertenece el elemento al que se le asigna el Intent. Este elemento solo tiene un atributo, el nombre. Este atributo se llama de la siguiente forma: <category android:name="android.intent.category.DEFAULT"/> Figura 31: Categoría en AndroidManifest [67] 4.3.1.7 Permisos Los permisos protegen a los usuarios restringiendo el acceso a las aplicaciones tanto sobre la información como sobre las acciones. Los tipos de permisos están divididos en cinco categorías [70]: 34 PROYECTO FIN DE GRADO ● Permisos de tiempo de instalación: Permiten a la aplicación un acceso limitado a la información restringida, además de ciertas acciones que afecten mínimamente al sistema y sus diferentes aplicaciones. Los permisos declarados como permisos de tiempo de instalación son automáticamente entregados a la aplicación. Dentro de estos permisos hay diferentes categorías, pero las principales son los permisos normales y los permisos de firmado. ● Permisos normales: Estos permisos posibilitan el acceso a las acciones e información que se encuentran fuera de la propia aplicación. Estos permisos representan un riesgo muy bajo para la privacidad de los usuarios. ● Permisos de firmado: Si una aplicación declara unos permisos de firmado que otra aplicación ha definido previamente y ambas están firmadas bajo el mismo certificado el sistema entrega estos permisos a la aplicación en tiempo de instalación. ● Permisos de ejecución: Estos permisos son llamados también permisos peligrosos y dan un acceso adicional a la información restringida y habilitan la posibilidad de que la aplicación realice acciones que afecten al sistema y otras aplicaciones. Para que la aplicación pueda hacer uso de estos permisos aparecerá un mensaje en pantalla solicitando los mismos. La mayoría de estos permisos dan acceso a información privada del usuario a la aplicación. ● Permisos especiales: Estos permisos corresponden a operaciones de la aplicación en particular. Solo pueden definirse por el fabricante de la plataforma o del dispositivo y son permisos que protegen el acceso a acciones muy avanzadas. Los permisos se solicitan en el AndroidManifest de la siguiente manera: <manifest ... > <uses-permission android:name="android.permission.SEND_SMS"/> ... </manifest> Figura 32: Permisos en AndroidManifest [71] 4.3.1.8 Exports Este atributo representa la posibilidad de otra aplicación para lanzar tanto un servicio como una actividad dentro de la aplicación. En el caso de que este valor no esté definido el sistema devolverá la excepción “ActivityNotFoundException”. En el caso de que el valor exported sea “true” cualquier aplicación que conozca el nombre de dicho atributo podrá acceder al elemento en cuestión. En caso contrario, siendo “false” limitará la exposición de dicho elemento ante otras aplicaciones. android:exported=["true" | "false"] Figura 33: Exports en AndroidManifest 35 4. METODOLOGÍA DESARROLLADA 4.3.1.9 Backups Este atributo permite que a la hora de realizar copias de seguridad se guarden los datos de la aplicación en dicha copia. Su valor de fábrica es “true”, en caso que no se quiera realizar esta acción debe especificarse asignando el valor en “false” [71]. android:allowBackup=["true" | "false"] Figura 34: Backups en AndroidManifest [71] 4.3.1.10 Meta Data Representa la opción adicional para almacenar información a la que se puede acceder desde todo el proyecto, es decir, se puede entregar un dato a otro apartado del proyecto habiéndose solicitado previamente [72]. Un ejemplo del código: <meta-data android:name="string" android:resource="resource specification" android:value="string" /> Figura 35: meta-data en AndroidManifest [73] 4.3.1.11 Uses Features Declara un componente hardware o software usado por la aplicación, el propósito de este elemento es el de informar a las entidades externas del conjunto de hardware y software de los que depende la aplicación. Por cada elemento usado debe añadirse un nuevo uses-feature [74]. Contiene también un elemento required para especificar si la aplicación puede funcionar sin ese elemento o no. <uses-feature android:name="string" android:required=["true" | "false"] android:glEsVersion="integer" /> Figura 36: uses-feature en AndroidManifest [74] Los elementos del uses-feature son únicamente informativos, es decir el sistema Android no verifica que los uses-features coincidan con el software o hardware disponible en el dispositivo. Esta característica solamente sirve para que servicios como Google Play adviertan sobre los posibles errores que se pueden producir en la ejecución de la aplicación. 36 PROYECTO FIN DE GRADO 4.3.2 Datos de la aplicación En este apartado se comentarán las características extraídas ajenas al AndroidManifest.xml. Entre las características extraídas se encuentran los iconos, imágenes, audios, videos y el tamaño de la aplicación. Primeramente se intentará encontrar una correlación entre las diferentes características, es decir comprobaremos si existe una cantidad distinta de imágenes, audios y videos entre las aplicaciones malware y las aplicaciones benignas. Por otra parte también se verificará que ambos tipo de aplicaciones tengan un tamaño similar, y en caso contrario se intentará detectar si existe algún tipo de similitud entre las aplicaciones malware entre sí y si existe algún tipo de diferencia entre el malware y el software benigno. 4.4 Caso de uso En este apartado se procederá a explicar el proceso seguido para poder analizar las diferentes aplicaciones. Para ello se usará tanto la shell de linux, para extraer las características a un “.txt”, como python, para generar un conjunto de datos y para realizar el análisis de las aplicaciones. La realización de este proyecto, en cuanto a código refiere, está basado en el proyecto “AndroidAppLyzer” de Arash Habibi Lashkari [98] aunque se ha modificado para extraer las características deseadas y dividir la totalidad de los datos de las aplicaciones en malware y software benigno. Además se ha usado el dataset de la universidad de New Brunswick [94][95] para obtener las aplicaciones, en este se encuentran muestras tanto de malware como de software benigno. 4.4.1 Decompilar Una vez tenemos el software dividido en dos ficheros, uno para el software benigno y otro para el malware, procederemos a descompilar las aplicaciones en dos carpetas, para ello usaremos un script escrito para bash y la herramienta ApkTool, descrita anteriormente. ./decompilar.sh Figura 37: Comando Decompilar #!/bin/bash IFS='/' echo -e " Decompilando malware ... " for DIRECTORIO in ../../0_Datos/apks/malware/*; do read -a strarr <<< "$DIRECTORIO" mkdir ../../0_Datos/analized/malware/${strarr[2]}"_Analizada"/ echo -e 37 4. METODOLOGÍA DESARROLLADA "-----------------------------------------------------------------" echo -e "APK: "${strarr[2]} echo -e " Usando apktool..." echo ../../0_Datos/apks/malware/${strarr[2]} apktool d ../../0_Datos/apks/malware/${strarr[2]} -o ../../0_Datos/analized/malware/${strarr[2]}"_Analizada"/ -f done echo -e " Decompilando aplicaciones benignas ... " for DIRECTORIO in ../../0_Datos/apks/benign/*; do read -a strarr <<< "$DIRECTORIO" mkdir ../../0_Datos/analized/benign/${strarr[2]}"_Analizada"/ echo -e "-----------------------------------------------------------------" echo -e "APK: "${strarr[2]} echo -e " Usando apktool..." echo apks/benign/${strarr[2]} apktool d ../../0_Datos/apks/benign/${strarr[2]} -o ../../0_Datos/analized/benign/${strarr[2]}"_Analizada"/ -f done Figura 38: Script Decompilar Figura 39: Ejecución del script para Decompilar 4.4.2 Extraer Características Una vez descompiladas todas las aplicaciones, procederemos a extraer las diferentes características a un .txt con un script de Linux para bash. ./0_Extraer_Caracteristicas.sh Figura 40: Ejecución del script para Extraer las características 38 PROYECTO FIN DE GRADO Para realizar este PFG se han extraído múltiples características, pero en el ejemplo inferior se muestra como se extraerán las acciones existentes en cada aplicación. La extracción se realizará en dos bucles, el primero para el malware y el segundo para el software benigno. #!/bin/bash IFS='/' for DIRECTORIO in ../../../0_Datos/analized/malware/*; do read -a strarr <<< "$DIRECTORIO" echo -e " Extrayendo acciones del AndroiManifest" echo -e "DIRECTORIO" $DIRECTORIO echo -e "strarr" ${strarr[6]} echo -e " Acciones: " >> ../../../0_Datos/analized/malware/${strarr[6]}/Acciones.txt grep -oP 'action.*".*"' ../../../0_Datos/analized/malware/${strarr[6]}/AndroidManifest.xml -u >> ../../../0_Datos/analized/malware/${strarr[6]}/Acciones.txt echo -e " " >> ../../../0_Datos/analized/malware/${strarr[6]}/Acciones.txt done for DIRECTORIO in ../../../0_Datos/analized/benign/*; do read -a strarr <<< "$DIRECTORIO" echo -e "DIRECTORIO" $DIRECTORIO echo -e " Extrayendo acciones del AndroiManifest" echo -e "strarr" ${strarr[6]} echo -e " Acciones: " >> ../../../0_Datos/analized/benign/${strarr[6]}/Acciones.txt grep -oP 'action.*".*"' ../../../0_Datos/analized/benign/${strarr[6]}/AndroidManifest.xml -u >> ../../../0_Datos/analized/benign/${strarr[6]}/Acciones.txt echo -e " " >> ../../../0_Datos/analized/benign/${strarr[6]}/Acciones.txt done | sort | sort Figura 41: Script para Extraer las características En la figura inferior se muestra el código para extraer las diferentes características. Las que están relacionadas con el AndroidManifest se buscarán de forma similar, simplemente se intentará encontrar una coincidencia dentro del código del AndroidManifest. grep -oP 'package=.*" ' ../../0_Datos/analized/malware/${strarr[5]}/AndroidManifest.xml | sort -u >> ../../0_Datos/analized/malware/${strarr[5]}/caracteristicas1.txt grep -oP 'activity.*" ' ../../0_Datos/analized/malware/${strarr[5]}/AndroidManifest.xml | sort -u >> ../../0_Datos/analized/malware/${strarr[5]}/caracteristicas1.txt grep -oP 'service .*"' ../../0_Datos/analized/malware/${strarr[5]}/AndroidManifest.xml | sort -u 39 4. METODOLOGÍA DESARROLLADA >> ../../0_Datos/analized/malware/${strarr[5]}/caracteristicas1.txt grep -oP 'provider .*"' ../../0_Datos/analized/malware/${strarr[5]}/AndroidManifest.xml | sort -u >> ../../0_Datos/analized/malware/${strarr[5]}/caracteristicas1.txt grep -oP 'receiver .*"' ../../0_Datos/analized/malware/${strarr[5]}/AndroidManifest.xml | sort -u >> ../../0_Datos/analized/malware/${strarr[5]}/caracteristicas1.txt grep -oP 'action.*".*"' ../../0_Datos/analized/malware/${strarr[5]}/AndroidManifest.xml | sort -u >> ../../0_Datos/analized/malware/${strarr[5]}/caracteristicas1.txt grep -oP 'category.*"' ../../0_Datos/analized/malware/${strarr[5]}/AndroidManifest.xml | sort -u >> ../../0_Datos/analized/malware/${strarr[5]}/caracteristicas1.txt grep -oP 'permission.*"' ../../0_Datos/analized/malware/${strarr[5]}/AndroidManifest.xml | sort -u >> ../../0_Datos/analized/malware/${strarr[5]}/caracteristicas1.txt grep -oP 'exported="true".*"' ../../0_Datos/analized/malware/${strarr[5]}/AndroidManifest.xml | sort -u >> ../../0_Datos/analized/malware/${strarr[5]}/caracteristicas1.txt grep -oP 'allowBackup.*" ' ../../0_Datos/analized/malware/${strarr[5]}/And roidManifest.xml | sort -u >> ../../0_Datos/analized/malware/${strarr[5]}/caracteristicas1.txt grep -oP 'meta-data.*"' ../../0_Datos/analized/malware/${strarr[5]}/AndroidManifest.xml | sort -u >> ../../0_Datos/analized/malware/${strarr[5]}/caracteristicas1.txt grep -oP 'uses-features.*"' ../../0_Datos/analized/malware/${strarr[5]}/AndroidManifest.xml | sort -u >> ../../0_Datos/analized/malware/${strarr[5]}/caracteristicas1.txt Figura 42: Ejemplo de características a buscar en AndroidManifest En cambio para extraer la cantidad de imágenes, iconos, videos, audios y el tamaño se realizará de forma diferente, en el caso del tamaño de la aplicación se realizará con el comando “cut”, se ha optado por este comando debido a que en el caso de que este código sea usado en otro sistema Unix sea posible su ejecución, comandos como “stat” son específicos de GNU/Linux, lo que imposibilita su uso es otros sistemas Unix. Para extraer la cantidad de imágenes, audios, iconos y videos se realizará una búsqueda dentro de cada aplicación de archivos con la extensión correspondiente a cada uno. find ../../0_Datos/analized/malware/${strarr[5]}/ -iname "*.png" -type f -printf '.' | wc -c >> ../../0_Datos/analized/malware/${strarr[5]}/caracteristicas1.txt find ../../0_Datos/analized/malware/${strarr[5]}/* -iname "*.jpg" -type f -printf '.' | wc -c >> ../../0_Datos/analized/malware/${strarr[5]}/caracteristicas1.txt find ../../0_Datos/analized/malware/${strarr[5]}/* -iname "*.mp3" -type f -printf '.' | wc -c >> ../../0_Datos/analized/malware/${strarr[5]}/caracteristicas1.txt 40 PROYECTO FIN DE GRADO find ../../0_Datos/analized/malware/${strarr[5]}/* -iname "*.mp4" -type f -printf '.' | wc -c >> ../../0_Datos/analized/malware/${strarr[5]}/caracteristicas1.txt du -sh ../../0_Datos/analized/malware/${strarr[5]}/ | cut -f -1 >> ../../0_Datos/analized/malware/${strarr[5]}/caracteristicas1.txt Figura 43: Ejemplo de características a buscar fuera de AndroidManifest Una vez se hayan extraído las características, cada carpeta de aplicación tendrá el siguiente formato, los archivos con extensión “.txt” corresponderá a los diferentes análisis, es decir, el fichero “Acciones.txt” corresponderá a los datos extraídos específicos de las acciones de la aplicación, pero el fichero “permisosAcciones.txt” contendrá tanto los datos extraídos de las acciones como los de los permisos. El resto de carpetas y ficheros serán los extraídos al decompilar la aplicación por ApkTool. Figura 44: Resultado de carpeta de cada aplicación Las diferentes características se guardarán de la siguiente forma: Package : package="com.hudway.online" platformBuildVersionCode="23" Activities : activity android:configChanges="keyboardHidden|orientation|screenSize" android:excludeFromRecents="true" android:name="com.startapp.android.publish.FullScreenActivity" android:taskAffinity="" activity android:configChanges="keyboardHidden|orientation|screenSize" android:excludeFromRecents="true" Services : service android:enabled="true" android:exported="false" android:name="com.google.android.gms.measurement.AppMeasurementService" service android:enabled="true" android:exported="false" android:name="com.google.android.gms.tagmanager.TagManagerService" Providers : provider android:authorities="com.hudway.online.firebaseinitprovider" android:exported="false" android:initOrder="100" android:name="com.google.firebase.provider.FirebaseInitProvider" Receivers : receiver android:enabled="true" android:exported="false" android:name="com.google.android.gms.measurement.AppMeasurementReceiver" receiver android:enabled="true" 41 4. METODOLOGÍA DESARROLLADA android:name="com.google.android.gms.measurement.AppMeasurementInstallRefer rerReceiver" Intents Action : action android:name="android.app.action.DEVICE_ADMIN_ENABLED" action android:name="android.intent.action.MAIN" Intents Category : category android:name="android.intent.category.BROWSABLE" category android:name="android.intent.category.DEFAULT" Permissions : permission android:name="android.permission.ACCESS_COARSE_LOCATION" permission android:name="android.permission.ACCESS_FINE_LOCATION" Exported : exported="true" android:name="com.batsman.revoices.HaimsuckenCheapishlyService" exported="true" android:name="com.facebook.CustomTabActivity" Backup : allowBackup="true" android:icon="@mipmap/hudway_icon" android:label="@string/app_name" android:name="com.hudway.online.controllers.App.App" android:supportsRtl="true" Meta-Data : meta-data android:name="android.app.device_admin" android:resource="@xml/device_admin" meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/fb_login_protocol_scheme" Number of Icons : 1413 Number of Pictures : 2 Number of Audio : 3 Number of Videos : 0 Size of the App : 159M Figura 45: Ejemplo de “.txt” generado 42 PROYECTO FIN DE GRADO 4.4.3 Generar listados A la hora de extraer los permisos, las acciones, los servicios y las categorías existen dos posibilidades, la primera, buscar unos en concreto, es decir, se tratará de encontrar solamente los valores más peligrosos, la segunda es crear una lista que contenga todos los valores contenidos en el dataset entero, posteriormente, en vez de realizar una búsqueda de ciertos valores únicamente, se buscarán todos los valores posibles. En el caso de que se quiera realizar la segunda opción, se usará el siguiente código escrito en python, al igual que en el anterior apartado, este es un ejemplo de cómo se extraerán las acciones: for i in /mnt/discoDuro/clasesFinales/extraccion/0_Datos/analized/*/*/Acciones.txt; do python 1_CrearLista.py $i; done Figura 46: Comando ejecutar generador de listados import re import csv import sys Feature = [] name = "" with open (sys.argv[1], 'rt') as myfile: for myline in myfile: Feature.append(myline.rstrip('\n').rstrip(' ')) print(Feature) for index, line in enumerate(Feature): if " Acciones:" in str(line): for a in range(index+1, index + 100): if len(Feature[a]) == 0: break else: name = re.search(r'"([^"]*)"', Feature[a]).group(1) if name != None: print(name) else: print(" None !!!! ") print("###################################################################" ) print("Analysing App : "+name) print("\n") Actions = [] for index, line in enumerate(Feature): if " Acciones:" in str(line): for a in range(index+1, index + 100): if len(Feature[a]) == 0: 43 4. METODOLOGÍA DESARROLLADA break else: try: actio = re.search(r'".*.action.([^"]*)"', Feature[a]).group(1) Actions.append("action."+actio) except: print("None !!!!") print("*************************************************************") Act = [] for i in Actions: Act.append(i) print("List of actions for this app :") for i in Act: print(i) print("*************************************************************") for i in Act: print(i) if i in open('/mnt/discoDuro/clasesFinales/extraccion/0_Datos/Unique_Lists/3_List_A ctions.csv').read(): print("0") else: print("1") with open('/mnt/discoDuro/clasesFinales/extraccion/0_Datos/Unique_Lists/3_List_A ctions.csv', 'a+') as csvfile: csvfile.write(i.encode()) csvfile.write('\n'.encode()) csvfile.close() print("Added ... ") Figura 47: Ejemplo código generador de listados El resultado, será un archivo de extensión “.csv” con todas las acciones, permisos, servicios o categorías existentes en el dataset, tener en cuenta que cada una de las características estará contenida en un listado diferente, es decir los permisos tendrán un conjunto de datos, las acciones otro y así sucesivamente: category.BROWSABLE category.DEFAULT category.LAUNCHER category.HOME category.CARDBOARD Tabla 1: Ejemplo listados 44 PROYECTO FIN DE GRADO Figura 48: Ejemplo ejecución generador de listados 4.4.4 Generar Dataset Una vez extraídas las características y generados los listados, se procederá a generar un dataset con la información de las aplicaciones para su posterior análisis: for i in /mnt/discoDuro/clasesFinales/extraccion/0_Datos/analized/*/*/Acciones.txt; do python 2_CrearCSV.py $i .; done Figura 49: Comando ejecutar generador de Datasets Para la generación de dicho dataset, se usará Python y las herramientas csv, sys y re. Lo que realiza el código inferior es, inicialmente abrir el archivo de la característica o características a extraer, es decir, el que se ha generado en el paso dos, y se guardarán en una variable. Seguidamente se procederá a comprobar si existe coincidencia en el listado generado en el anterior paso, en caso de que si exista, se añadirá un 1 al dataset, en el caso contrario un 0. Finalmente se comprobará si se está analizando dentro de la carpeta de malware o software benigno y dependiendo de cual sea se añadirá un 0, correspondiente al software benigno, o un 1, correspondiente al malware. En este ejemplo solamente se analizarán las acciones, en el caso de que se deseen analizar más variables, se deberá introducir el código correspondiente antes del último paso. 45 4. METODOLOGÍA DESARROLLADA import csv import sys import re Feature = [] name = "" Values =[] with open (sys.argv[1], 'rt') as myfile: for myline in myfile: Feature.append(myline.rstrip('\n').rstrip(' ')) end = sys.argv[2] sp1=sys.argv[1].split(end) sp2=sp1[0].split('.') Values.append(sp2[0]) Actions = [] print(Feature) for index, line in enumerate(Feature): if " Acciones:" in str(line): for a in range(index+1, index + 100): if len(Feature[a]) == 0: break else: try: actio = re.search(r'".*.action.([^"]*)"', Feature[a]).group(1) Actions.append("action."+actio) except: print("None !!!!") with open('/mnt/discoDuro/clasesFinales/extraccion/0_Datos/Unique_Lists/3_List_A ctions.csv') as csvFile: dataAct = csvFile.readlines() csvFile.close() for i in dataAct: if i.strip() in Actions: Values.append(1) else: Values.append(0) tipo = sp1[0].split("/") tipoFn = tipo[-2] if tipoFn == 'malware': Values.append(1) else: Values.append(0) with open('/mnt/discoDuro/clasesFinales/extraccion/0_Datos/Output_CSV_Files/Acci ones.csv', 'a+') as csvFile: 46 PROYECTO FIN DE GRADO writer = csv.writer(csvFile) writer.writerow(Values) csvFile.close() Figura 50: Ejemplo código generador de Datasets Para analizar las características que no contengan un listado, como el tamaño de la aplicación o la cantidad de imágenes, iconos, audios o videos, se realizará a través del siguiente código: print(" Number of Videos ***************************") for index, line in enumerate(Feature): if " Number of Videos :" in str(line): for a in range(index+1, index + 100): if len(Feature[a]) == 0: break else: Hardware.append(Feature[a]) print(" Size of the App ***************************") for index, line in enumerate(Feature): if " Size of the App :" in str(line): for a in range(index+1, index + 100): if len(Feature[a]) == 0: break else: print(Feature[a][:-1]) Hardware.append(int(float(Feature[a][:-1]))) Figura 51: Ejemplo código generador de Datasets para datos no asignados en los listados 4.4.5 Análisis Una vez se haya obtenido el dataset se procederá a analizarlo y a verificar la efectividad de los algoritmos de aprendizaje automático. Para ello se usará Sklearn, una conocida librería de aprendizaje automático implementada en Python. Primero se leerá el dataset y se guardarán sus valores en una lista, posteriormente se procederá a dividir los datos para entrenar a los diferentes modelos, finalmente se implementarán algoritmos de verificación para comprobar la efectividad de dichos algoritmos con los datos utilizados. train_x = [[]] train_y = [[]] Values = [] nombre = "" def carga(): global train_x global train_y global test_x 47 4. METODOLOGÍA DESARROLLADA global test_y file = pd.read_csv("Output_CSV_Files/Acciones.csv") coulmnNames = file.iloc[1:1, 1:].columns FeatureNames = list(coulmnNames[1:-1]) LabelName = coulmnNames[-1] X = file[FeatureNames] X = np.asarray(X) Y = file[LabelName] Y = np.asarray(Y) feature_vectors = X labels = Y train_x, test_x, train_y, test_y = train_test_split(feature_vectors,labels,test_size=0.2) def ridge(): global train_x global train_y global test_x global pred_x global nombre nombre = "Bayesian Ridge" carga() br = RidgeClassifier() br.fit(train_x, train_y) pred_x = br.predict(test_x) print("This is a Linear Model") print("Bayesian Ridge") resultado() def mlp(): global train_x global train_y global test_x global pred_x global nombre nombre = "Multi-layer Perceptron" carga() mlp = MLPClassifier() mlp.fit(train_x, train_y) pred_x = mlp.predict(test_x) print("This is a Neural Network") print("Multi-layer Perceptron") resultado() def resultado(): Values =[] global test_y global pred_x 48 PROYECTO FIN DE GRADO print("Accuracy:", accuracy_score(test_y, pred_x)) # accuracy print("Balanced Accuracy:", balanced_accuracy_score(test_y, pred_x, sample_weight=None, adjusted=False)) # balanced_accuracy print("Precision score:", precision_score(test_y, pred_x, average=None)) # precision print("Average Precision score:", average_precision_score(test_y, pred_x)) # average_precision print("Neg Brier Score:", brier_score_loss(test_y, pred_x)) # neg_brier_score print("F1 Score:", f1_score(test_y, pred_x)) # f1 print("Recall Score:", recall_score(test_y, pred_x))# recall print("AUC:", roc_auc_score(test_y, pred_x)) # roc_auc Values.append(nombre) Values.append(accuracy_score(test_y, pred_x)) Values.append(balanced_accuracy_score(test_y, pred_x, sample_weight=None, adjusted=False)) Values.append(precision_score(test_y, pred_x, average=None)) Values.append(average_precision_score(test_y, pred_x)) Values.append(brier_score_loss(test_y, pred_x)) Values.append(f1_score(test_y, pred_x)) Values.append(recall_score(test_y, pred_x)) Values.append(roc_auc_score(test_y, pred_x)) with open('resultadoAnalisis/resultadoAcciones.csv', 'a+') as csvFile: writer = csv.writer(csvFile) writer.writerow(Values) csvFile.close() def nombres(): global Values Values.append("Clasificador") Values.append("accuracy_score") Values.append("balanced_accuracy_score") Values.append("precision_score") Values.append("average_precision_score") Values.append("brier_score_loss") Values.append("f1_score") Values.append("recall_score") Values.append("roc_auc_score") with open('resultadoAnalisis/resultadoAcciones.csv', 'a+') as csvFile: writer = csv.writer(csvFile) writer.writerow(Values) csvFile.close() def main(): global train_x 49 4. METODOLOGÍA DESARROLLADA global train_y global test_x global pred_x train_x = [[]] train_y = [[]] Values = [] train_y = [] train_x = [] nombres() ridge() logisticRegression() SGD() KNN() gaussian() decisionTree() adaBoost() gradientBoosting() mlp() main() Figura 52: Ejemplo código de análisis 50 PROYECTO FIN DE GRADO Capítulo 5 Resultados 5.1 Métricas 5.1.1 Accuracy Score A través de la función accuracy_score calcularemos la precisión o exactitud de los diferentes tipos de clasificadores. Para calcular la exactitud compararemos las predicciones correctas con las predicciones totales, por ejemplo siendo el resultado de la fórmula accuracy_score 0.87, de cada 100 predicciones 87 serán correctas [77][78]. Dicha exactitud se calculará con la siguiente fórmula: Figura 53: Función exactitud [75] En esta fórmula VP serán los verdaderos positivos, VN verdaderos negativos, FP falsos positivos y FN falsos negativos. Los valores representarán las siguientes muestras [76]: ● Verdaderos positivos: En nuestro caso representaría las aplicaciones maliciosas detectadas como malignas por el clasificador. ● Verdaderos negativos: Representará las aplicaciones benignas predichas como benignas. ● Falsos positivos: Representará las aplicaciones benignas predichas como malignas. ● Falsos negativos: Representará las aplicaciones malignas predichas como benignas. Los problemas que puede contener esta función es que aunque la precisión sea de un 87% puede que de ese porcentaje la gran mayoría sean verdaderos negativos y el modelo no detecte de la forma más correcta las aplicaciones malignas. 5.1.2 Balanced Accuracy Score Esta función calcula la la precisión equilibrada, es útil en clases muy desequilibradas, es decir cuando uno de los dos tipos de elementos a comparar es más frecuente [80][81]. Al igual que la "accuracy_score", contiene los valores VP (Verdaderos Positivos), VN (Verdaderos Negativos), FP (Falsos Positivos) y FN (Falsos Negativos). Para hacer el cálculo se hará la división de la suma de la sensibilidad y la especificidad dividido entre 2, donde la sensibilidad es la división 51 5. Resultados entre los VP y la suma de los VP y FN y la especificidad es la división entre los VN y la suma de los FP y VN, es decir la fórmula sería la siguiente: Figura 54: Función Balanced Accuracy [79] Lo que se consigue a través de esta verificación es intentar seleccionar los aspectos negativos de la métrica y evitar seleccionar los positivos, así evitará las estimaciones de rendimiento infladas, por lo que si el resultado de esta función varía mucho del resultado de "accuracy_score" se puede decir que el conjunto de datos será bastante desequilibrado [79]. 5.1.3 Precision Score La precisión es el número de resultados positivos dividido entre la cantidad de resultados totales, es decir mide la capacidad de no marcar de forma positiva una muestra negativa. La fórmula a la que llama "precision_score" es el calculo de el total de VP (Verdaderos Positivos) dividido entre los VP (Verdaderos Positivos) sumados a los FP (Falsos Positivos), es decir cumpliría la siguiente fórmula [82]: Figura 55: Función Precision [83] Cuyo resultado será mejor si es más próximo a 1 y peor si es más próximo a 0. La gran diferencia entre la función "precision_score" y "accuracy_score" es que el segundo sólo es una buena medida cuando la cantidad de muestras benignas y malignas son del mismo tamaño. 5.1.4 Average Precision Score La precisión promedio o average precision es una métrica que calcula el valor de la precisión promedio para el valor de recuperación entre 0 y 1. Para ello hay que tener en cuenta la precisión y la recuperación. La precisión por una parte, como su nombre indica, medirá la exactitud de las predicciones, es decir la cantidad de predicciones correctas. En cambio la recuperación medirá con qué precisión encontrará los positivos [84]. Es decir seguirán las siguientes fórmulas: Figura 56: Función Precision y Recuperación [85]. 52 PROYECTO FIN DE GRADO Esto nos generará, llevando la precisión y la recuperación a una gráfica, un resultado con la siguiente forma. Figura 57: Gráfica de Recuperación y precisión [85]. De la cual esta fórmula calcula la curva de recuperación de la precisión como media ponderada de las precisiones logradas en cada umbral, para realizar dicha ponderación se usa el umbral anterior como ponderación. 5.1.5 Brier Score Loss Esta función mide la diferencia cuadrática entre la probabilidad predicha y el resultado real. El valor estará recogido entre 0 y 1, cuanto más bajo sea el valor la predicción será más precisa. Este método es apropiado para medir valores binarios, es decir o existe o no existe, en cambio si los valores pueden ser de tres o más tipos diferentes no es válido, esto se debe a que esta función da por hecho que la distancia entre las variables es igual entre ellas. En definitiva con esta métrica sabremos si el clasificador está calibrado [86]. También hay que tener en cuenta que aunque el valor sea muy bajo, no significa que el clasificador esté mejor calibrado, es decir esta función se puede dividir en la suma de la pérdida de calibración y la pérdida de refinamiento. La pérdida de refinamiento es independiente a la pérdida de calibración, por lo que no significa que esté mejor calibrado, sino que solamente cuando la pérdida de refinamiento sea invariable y la pérdida de puntaje Brier sea baja significa que el clasificador esté mejor calibrado [87]. 5.1.6 F1 Score Este valor se puede interpretar como el promedio ponderado de la precisión y la recuperación, su puntuación estará entre 0 y 1 donde 1 será la mejor y 0 la peor. La importancia de la precisión y la recuperación es equivalente, por lo que es una media armónica de ambas. Su fórmula es la siguiente: Figura 58: Función F1 [88] 53 5. Resultados 5.1.7 Recall Score Esta función muestra la habilidad de detectar todas las muestras positivas por el clasificador. Se calcula con VP / (VP + FN) donde TP es la cantidad de verdaderos positivos y FN la cantidad de falsos negativos, el valor oscila entre 0 y 1 siendo el mejor valor 1 y el peor 0 [90]. Su fórmula es la siguiente: Figura 59: Función Recuperación [89] 5.1.8 ROC AUC Score Calcula el área bajo la curva de características operativas del receptor a partir de las puntuaciones de la predicción. Analiza el rendimiento de un clasificador binario gracias a la variación de su umbral de discriminacion [91]. 5.2 Resultados obtenidos En este apartado se analizarán los diferentes clasificadores con las distintas características extraídas a través de las métricas seleccionadas en el apartado anterior. 5.2.1 Permisos Clasificador accur acy_s core balan ced_a ccura cy_sc ore precisi on_sc ore average_pre cision_score brier_s core_lo ss f1_sc ore recall _scor e roc_a uc_sc ore Bayesian Ridge 0.912 0.914 43643 85 [0.873 01587 0.951 6129 ] 0.901987481 9 0.088 0.914 72868 22 0.880 59701 49 0.914 43643 85 Logistic Regression 0.856 0.856 24679 98 [0.881 35593 0.833 33333 ] 0.795247311 8 0.144 0.859 375 0.887 09677 42 0.856 24679 98 Stochastic Gradient Descent SGD 0.76 0.765 78674 95 [0.830 50847 0.696 9697 ] 0.652510822 5 0.24 0.754 09836 07 0.821 42857 14 0.765 78674 95 Neighbors Classifier 0.808 0.804 21842 65 [0.796 2963 0.816 90141 ] 0.774670749 1 0.192 0.828 57142 86 0.840 57971 01 0.804 21842 65 54 PROYECTO FIN DE GRADO GaussianNB 0.656 0.662 14139 34 [0.595 74468 0.838 70968 ] 0.644725806 5 0.344 0.547 36842 11 0.406 25 0.662 14139 34 Decision Tree Clasifier 0.872 0.870 60041 41 [0.884 05797 0.857 14286 ] 0.798693877 6 0.128 0.857 14285 71 0.857 14285 71 0.870 60041 41 Ada Boost Classifier 0.816 0.816 77817 81 [0.786 88525 0.843 75 ] 0.784037313 4 0.184 0.824 42748 09 0.805 97014 93 0.816 77817 81 Gradient Tree Boosting Classifier 0.872 0.867 37089 2 [0.865 38462 0.876 71233 ] 0.846275902 0.128 0.888 88888 89 0.901 40845 07 0.867 37089 2 Multi-layer Perceptron 0.888 0.886 74884 44 [0.894 73684 0.882 35294 ] 0.850139037 4 0.112 0.895 52238 81 0.909 09090 91 0.886 74884 44 Tabla 2: Resultado permisos Primero se analizarán los resultados extraídos con únicamente los permisos que Android Developers, la plataforma de desarrolladores de Android, considera de riesgo. Con estos permisos se puede observar que se obtienen unos resultados bastante buenos con la mayoría de clasificadores. Además se puede observar que la balanced_accuracy_score es similar a la accuracy, por lo que se puede determinar que el modelo detecta correctamente el malware. Por otro lado, el campo brier_score_loss, en la mayoría de los casos, devuelve unos valores bastante bajos, aunque en el caso del clasificador GaussianNB obtiene unos valores demasiado altos, lo que indica que el clasificador no está muy bien calibrado. El clasificador que mejores resultados obtiene es Bayesian Ridge con un 0.912 en la accuracy_score, como se puede observar en el resto de tablas, este valor solo es superado por el cálculo con todas las variables posibles, por lo que se podría decir que este método es el mejor en el caso de que la cantidad de muestras sea muy grande y el tiempo disponible para la clasificación sea bajo. 55 5. Resultados 5.2.2 Todos los permisos posibles Clasificador accur acy_s core balance d_accu racy_sc ore precisi on_sco re average_pre cision_score brier_s core_lo ss f1_sc ore recall _scor e roc_a uc_s core Bayesian Ridge 0.808 0.8093 154915 [0.8412 6984 0.7741 9355] 0.720711902 1 0.192 0.8 0.827 5862 069 0.809 3154 915 Logistic Regression 0.88 0.8764 766307 [0.8493 1507 0.9230 7692] 0.838977835 7 0.12 0.864 8648 649 0.813 5593 22 0.876 4766 307 Stochastic Gradient Descent SGD 0.712 0.6954 451879 [0.6666 6667 0.8437 5 ] 0.640780172 4 0.288 0.6 0.465 5172 414 0.695 4451 879 Neighbors Classifier 0.84 0.8397 33743 [0.8620 6897 0.8208 9552] 0.780654821 1 0.16 0.846 1538 462 0.873 0158 73 0.839 7337 43 GaussianNB 0.672 0.6773 821721 [0.6111 1111 0.8285 7143] 0.655446428 6 0.328 0.585 8585 859 0.453 125 0.677 3821 721 Decision Tree Clasifier 0.88 0.8807 692308 [0.8571 4286 0.9032 2581] 0.850163771 7 0.12 0.881 8897 638 0.861 5384 615 0.880 7692 308 Ada Boost Classifier 0.808 0.8116 314977 [0.8644 0678 0.7575 7576] 0.717082549 6 0.192 0.806 4516 129 0.862 0689 655 0.811 6314 977 Gradient Tree Boosting Classifier 0.864 0.8628 205128 [0.8771 9298 0.8529 4118] 0.817085972 9 0.136 0.872 1804 511 0.892 3076 923 0.862 8205 128 Multi-layer Perceptron 0.912 0.9121 794872 [0.9218 75 0.9016 3934] 0.866502732 2 0.088 0.909 0909 091 0.916 6666 667 0.912 1794 872 Tabla 3: Resultado todos los permisos posibles Una vez realizado el primer análisis se consideró realizar un segundo pero esta vez analizando todos los permisos contenidos por las aplicaciones del Dataset. Como se puede observar en la tabla, en la combinación de todos los permisos, los valores obtenidos son similares, aunque 56 PROYECTO FIN DE GRADO esta vez el clasificador Bayesian ridge obtiene peores resultados pero el Multi Layer Perceptron obtiene unos valores mejoresa. El clasificador GaussianNB sigue siendo el clasificador con peores resultados, aunque mejoran algo respecto al anterior análisis. En conclusión, es mejor buscar los permisos de alto riesgo únicamente, ya que los resultados obtenidos son similares y el tiempo de ejecución es menor en el caso de la extracción de los permisos de riesgo. 5.2.3 Acciones Clasificador accur acy_s core balan ced_a ccura cy_sc ore precisi on_sc ore average_pre cision_score brier_s core_lo ss f1_sc ore recall _scor e roc_a uc_sc ore Bayesian Ridge 0.88 0.879 41628 26 [0.833 33333 0.943 39623 ] 0.856803408 4 0.12 0.869 56521 74 0.806 45161 29 0.879 41628 26 Logistic Regression 0.816 0.816 76938 88 [0.790 32258 0.841 26984 ] 0.779565175 6 0.184 0.821 70542 64 0.803 03030 3 0.816 76938 88 Stochastic Gradient Descent SGD 0.76 0.762 55122 95 [0.706 66667 0.84 ] 0.72725 0.24 0.736 84210 53 0.656 25 0.762 55122 95 Neighbors Classifier 0.72 0.719 87179 49 [0.734 375 0.704 91803 ] 0.641191256 8 0.28 0.710 74380 17 0.716 66666 67 0.719 87179 49 GaussianNB 0.608 0.605 22273 43 [0.842 10526 0.566 03774 ] 0.563083558 0.392 0.710 05917 16 0.952 38095 24 0.605 22273 43 Decision Tree Clasifier 0.824 0.829 73805 86 [0.753 42466 0.923 07692 ] 0.815328671 3 0.176 0.813 55932 2 0.727 27272 73 0.829 73805 86 Ada Boost Classifier 0.856 0.857 56562 02 [0.822 58065 0.888 8889] 0.830951907 1 0.144 0.861 53846 15 0.835 82089 55 0.857 56562 02 57 5. Resultados Gradient Tree Boosting Classifier 0.824 0.823 86072 71 [0.815 38462 0.833 33333 ] 0.768043010 8 0.176 0.819 67213 11 0.806 45161 29 0.823 86072 71 Multi-layer Perceptron 0.8 0.800 43522 79 [0.768 11594 0.839 28571 ] 0.754133786 8 0.2 0.789 91596 64 0.746 03174 6 0.800 43522 79 Tabla 4: Resultado acciones Una vez analizados los permisos, se procederá a analizar los resultados obtenidos de las acciones, en este caso podemos observar que aunque los valores no son malos, no son tan buenos como los de los permisos. Otra vez el clasificador con mejores resultados es el Bayesian Ridge, y el peor es GaussianNB y los resultados de esta característica oscila entre 0.608 y 0.88, por lo que se puede decir que es una característica aceptable siempre y cuando se elija el clasificador correcto, es decir, si se usa Bayesian Ridge se obtendrán unos buenos resultados y la calibración del clasificador será precisa. 5.2.4 Servicios Clasificador accur acy_s core balan ced_a ccura cy_sc ore precisi on_sc ore average_pre cision_score brier_s core_lo ss f1_sc ore recall _scor e roc_a uc_sc ore Bayesian Ridge 0.44 0.507 04225 35 [1. 0.435 48387 ] 0.435483871 0.56 0.606 74157 3 1 0.433 21243 23 Logistic Regression 0.52 0.530 86577 87 [0.504 20168 0.833 33333 ] 0.537104166 7 0.48 0.142 85714 29 0.078 125 0.530 86577 87 Stochastic Gradient Descent SGD 0.544 0.540 32258 06 [0.525 1. ] 0.536645161 3 0.456 0.149 25373 13 0.080 64516 129 0.546 49077 87 Neighbors Classifier 0.584 0.520 73552 43 [0.578 5124 0.75 ] 0.449666666 7 0.416 0.103 44827 59 0.055 55555 556 0.575 24613 GaussianNB 0.512 0.537 87878 79 [0.491 66667 1. ] 0.563757575 8 0.488 0.140 84507 04 0.075 75757 576 0.506 75675 68 58 PROYECTO FIN DE GRADO Decision Tree Clasifier 0.56 0.549 18032 79 [0.537 81513 1. ] 0.538360655 7 0.44 0.179 10447 76 0.098 36065 574 0.563 23604 71 Ada Boost Classifier 0.528 0.524 32155 66 [0.516 66667 0.8 ] 0.515612903 2 0.472 0.119 40298 51 0.064 51612 903 0.5 Gradient Tree Boosting Classifier 0.472 0.511 86790 51 [0.462 18487 0.666 66667 ] 0.551215686 3 0.528 0.108 10810 81 0.058 82352 941 0.522 05882 35 Multi-layer Perceptron 0.536 0.510 27221 37 [0.533 33333 0.6] 0.478508474 6 0.464 0.093 75 0.050 84745 763 0.530 86577 87 Tabla 5: Resultado servicios Continuando con las características, procederemos a analizar los servicios, como se puede observar es la característica con peores resultados de todas las analizadas, es decir los valores de la accuracy y la balanced accuracy son muy bajos, además se puede decir que todos los clasificadores no se calibran correctamente, ya que obtienen unos valores muy altos. En el caso del Stochastic Gradient Descent - SGD el valor del f1_score es notablemente bajo, lo que indica que el algoritmo no mantiene concordancia entre la precisión y la recuperación, además el valor de recall_score, es también muy bajo, lo que indica que no es nada útil para detectar muestras positivas. 5.2.5 Categorías Clasificador accur acy_s core balan ced_a ccura cy_sc ore precisi on_sc ore average_pre cision_score brier_s core_lo ss f1_sc ore recall _scor e roc_a uc_sc ore Bayesian Ridge 0.632 0.634 71435 92 [0.677 9661 0.590 90909 ] 0.549335423 2 0.368 0.629 03225 81 0.672 41379 31 0.634 71435 92 Logistic Regression 0.584 0.582 05128 21 [0.571 42857 0.594 2029 ] 0.566804905 2 0.416 0.611 94029 85 0.630 76923 08 0.582 05128 21 Stochastic Gradient Descent SGD 0.488 0.521 23005 66 [0.475 0.8 ] 0.551761194 0.512 0.1111 11111 1 0.059 70149 254 0.521 23005 66 59 5. Resultados Neighbors Classifier 0.592 0.589 26741 8 [0.604 16667 0.584 41558 ] 0.562917207 8 0.408 0.638 29787 23 0.703 125 0.589 26741 8 GaussianNB 0.528 0.538 29405 74 [0.777 77778 0.508 62069 ] 0.507944601 5 0.472 0.666 66666 67 0.967 21311 48 0.538 29405 74 Decision Tree Clasifier 0.592 0.584 66289 24 [0.571 42857 0.605 26316 ] 0.583553809 9 0.408 0.643 35664 34 0.686 56716 42 0.584 66289 24 Ada Boost Classifier 0.656 0.661 22233 93 [0.741 93548 0.571 42857 ] 0.523604395 6 0.344 0.626 08695 65 0.692 30769 23 0.661 22233 93 Gradient Tree Boosting Classifier 0.616 0.616 99948 8 [0.659 57447 0.589 74359 ] 0.565551695 6 0.384 0.657 14285 71 0.741 93548 39 0.616 99948 8 Multi-layer Perceptron 0.632 0.632 61648 75 [0.660 37736 0.6111 1111] 0.577691756 3 0.368 0.656 71641 79 0.709 67741 94 0.632 61648 75 Tabla 6: Resultado categorías Continuando con la siguiente característica, se puede observar que aunque se obtienen mejores resultados que con los servicios, estos resultados son muy bajos también. En el caso del Stochastic Gradient Descent - SGD el valor del f1_score es notablemente bajo, lo que indica que el algoritmo no mantiene concordancia entre la precisión y la recuperación, además el valor de recall_score, es también muy bajo, lo que indica que no es nada útil para detectar muestras positivas. 60 PROYECTO FIN DE GRADO 5.2.6 Permisos y acciones Clasificador accur acy_s core balance d_accu racy_sc ore precisi on_sco re average_pre cision_score brier_s core_lo ss f1_sc ore recall _scor e roc_a uc_s core Bayesian Ridge 0.88 0.8796 72299 [0.8529 4118 0.9122 807 ] 0.845138653 1 0.12 0.873 9495 798 0.838 7096 774 0.879 6722 99 Logistic Regression 0.896 0.8957 479508 [0.9 0.8923 0769] 0.856653846 2 0.104 0.899 2248 062 0.906 25 0.895 7479 508 Stochastic Gradient Descent SGD 0.912 0.9051 724138 [0.8589 7436 1. ] 0.898344827 6 0.088 0.895 2380 952 0.810 3448 276 0.905 1724 138 Neighbors Classifier 0.864 0.8691 966615 [0.8032 7869 0.9218 75 ] 0.862065140 8 0.136 0.874 0740 741 0.830 9859 155 0.869 1966 615 GaussianNB 0.72 0.7306 999485 [0.6455 6962 0.8478 2609] 0.717510707 3 0.28 0.690 2654 867 0.582 0895 522 0.730 6999 485 Decision Tree Clasifier 0.912 0.9121 794872 [0.9218 75 0.9016 3934] 0.866502732 2 0.088 0.909 0909 091 0.916 6666 667 0.912 1794 872 Ada Boost Classifier 0.88 0.8772 727273 [0.8873 2394 0.8703 7037] 0.807771043 8 0.12 0.862 3853 211 0.854 5454 545 0.877 2727 273 Gradient Tree Boosting Classifier 0.88 0.8733 766234 [0.9 0.8666 6667] 0.844761904 8 0.12 0.896 5517 241 0.928 5714 286 0.873 3766 234 Multi-layer Perceptron 0.856 0.8561 187916 [0.8688 5246 0.8437 5 ] 0.798879032 3 0.144 0.857 1428 571 0.870 9677 419 0.856 1187 916 Tabla 7: Resultado permisos y acciones Una vez analizadas todas las características principales, se ha procedido a analizar la combinación de las dos con mejores resultados, en este caso los permisos y las acciones. Como se puede observar, los resultados obtenidos son bastante similares a los obtenidos en 61 5. Resultados los análisis de ambas características por separado, lo que indica que la combinación de ambas no aporta una mejora. Aunque se haya obtenido una tasa de aciertos mínima, siendo esta 0.72 obtenida por GaussianNB, la mejor tasa de aciertos es 0.912, siendo igual que en los permisos y en las acciones, lo único que varía es el clasificador que obtiene una mejor precisión, siendo el Decision Tree Classifier en vez de el Multi-layer Perceptron o el Bayesian Ridge. 5.2.7 Todos los valores Clasificador accur acy_s core balance d_accu racy_sc ore precisi on_sco re average_pre cision_score brier_s core_lo ss f1_score recall_sc ore Bayesian Ridge 0.92 0.9193 75645 [0.9264 7059 0.9122 807 ] 0.872256078 8 0.08 0.912280 7018 0.912280 7018 Logistic Regression 0.84 0.8391 393443 [0.8235 2941 0.8596 4912] 0.78653782 0.16 0.830508 4746 0.803278 6885 Stochastic Gradient Descent SGD 0.672 0.7102 987421 [0.5666 6667 0.9428 5714] 0.744142857 1 0.328 0.616822 4299 0.458333 3333 Neighbors Classifier 0.888 0.8867 827869 [0.9272 7273 0.8571 4286] 0.835571428 6 0.112 0.895522 3881 0.9375 GaussianNB 0.776 0.7698 717949 [0.7228 9157 0.8809 5238] 0.727253968 3 0.224 0.725490 1961 0.616666 6667 Decision Tree Clasifier 0.824 0.8243 589744 [0.8064 5161 0.8412 6984] 0.781958486 0.176 0.828125 0.815384 6154 Ada Boost Classifier 0.88 0.8776 376737 [0.8909 0909 0.8714 2857] 0.841390191 9 0.12 0.890510 9489 0.910447 7612 Gradient Tree Boosting Classifier 0.952 0.9519 230769 [0.95 0.9538 4615] 0.933822485 2 0.048 0.953846 1538 0.953846 1538 Multi-layer 0.888 0.8913 [0.9354 0.814233361 0.112 0.883333 0.929824 62 PROYECTO FIN DE GRADO Perceptron 828689 8387 0.8412 6984] 2 3333 5614 Tabla 8: Resultado todos los valores Finalmente es analizarán todas las características posibles, es decir, los permisos, el nombre de paquete, las actividades, los proveedores, los servicios, los receivers, las Intents Action, las Intent Category, las funcionalidades exportadas, la posibilidad de realizar copia de seguridad de la aplicación, la Meta-Data, las declaraciones del uso de hardware y software del dispositivo, la cantidad de imágenes, iconos y videos y el tamaño de la aplicación. Los resultados de este análisis son mejores que todos los obtenidos anteriormente, el clasificador que mejores resultados obtiene es el Gradient Tree Boosting con una tasa de 0.952 en accuracy_score y un 0.048 en brier_score_loss, lo que indica que es muy preciso y que está muy bien calibrado. También se puede observar que el Stochastic Gradient Descent - SGD es el clasificador con peores resultados. Con estos datos podemos concluir que aunque no todas las características obtengan buenos resultados, la unión de ellas conlleva unos mejores resultados, superando a los conjuntos de características de menor tamaño y a las características analizadas por separado. 5.3 Comparativa con los diferentes Papers anteriores En este apartado se comparan los resultados obtenidos en este proyecto fin de grado con los resultados de papers anteriores. Para dichos resultados compararemos los datos obtenidos recogiendo todas las características. Primero se comparan los resultados obtenidos en el trabajo PERMISSION ANALYSIS FOR ANDROID MALWARE DETECTION realizado por Nguyen Viet Duc, Pham Thanh Giang y Pham Minh Vi [92]. Figura 60: Tabla resultados Paper PERMISSION ANALYSIS FOR ANDROID MALWARE DETECTION [92] En este proyecto se realiza un análisis estático de permisos. Como podemos observar, en este experimento se obtienen unos resultados inferiores a los obtenidos por los clasificadores de este PFG. No solo se obtienen peores resultados comparándolos con el conjunto de datos final obtenido en este PFG, sino que también se obtienen peores resultados que los obtenidos solamente con los permisos o las acciones. 63 5. Resultados Se puede concluir que la gran diferencia en este caso no está en las características extraídas, sino que reside en el algoritmo de análisis. El siguiente experimento con el que se compararán los resultados de este PFG, es un análisis realizado por seis investigadores de Deusto Borja Sanz, Igor Santos, Carlos Laorden, Xabier Ugarte-Pedrero, Pablo Garcia Bringas y Gonzalo Álvarez en el paper PUMA: Permission Usage to detect Malware in Android [93]. Figura 61: Tabla resultados Paper Puma, Universidad de Deusto [93] El formato del paper es similar al formato de este PFG, es decir, se analizarán los permisos y los clasificadores utilizados son similares a los utilizados en este PFG. Como se puede observar, cuando de permisos solamente se trata, los resultados son similares, pero cuando se compara el paper con los resultados obtenidos del conjunto que engloba las características extraídas, se puede observar cierta mejora. Se puede concluir que con un mayor conjunto de datos se obtienen mejores resultados. Lo que se puede concluir con la comparación entre los resultados obtenidos en este PFG y los resultados obtenidos en otros Papers es que tanto los algoritmos de análisis, como el conjunto de datos es importante, y para obtener este conjunto de datos la metodología usada funciona. 64 PROYECTO FIN DE GRADO Capítulo 6 Planificación, presupuesto y estructura del proyecto 6.1 Planificación El reparto de tareas a lo largo del proyecto es la siguiente: MAR Actividades 10 ABR JU N MAY 11 12 13 14 15 16 17 18 19 20 21 22 23 0. Gestión y coordinación del proyecto Total Experto 10 0 5 0 10 0 5 0 10 30 20 20 20 15 15 15 15 10 0 5 0 10 25 10 10 0 0 0 80 1. Desarrollo del proyecto 2. Documentación y memoria 2.1 Introducción, antecedentes y justificación 5 5 0 0 0 0 0 0 0 0 0 0 0 5 2.2 Objetivos y alcance 0 0 5 5 0 0 0 0 0 0 0 0 0 5 2.3 Metodología 0 0 0 0 10 10 5 0 0 0 0 0 0 5 2.4 Desarrollo 0 0 0 0 0 0 10 10 5 5 0 0 0 5 2.5 Planificación 5 10 5 0 0 0 0 0 0 0 0 0 0 5 2.6 Presupuesto 7 10 0 0 0 0 0 0 0 0 0 2 0 3 2.7 Conclusiones 0 0 0 0 0 0 0 0 0 0 0 2.8 Bibliografía Total Proyecto y Memoria 1 0 0 0 0 1 0 0 0 0 48 45 30 25 26 25 30 25 15 1 0 0 16 10 2 10 10 1 Total Program 1 ador 11 39 347 Total Equipo 427 Tabla 9: Reparto de horas 65 6. Planificación, presupuesto y estructura del proyecto A continuación se describen las tareas mencionadas en el diagrama: ● Gestión y coordinación del proyecto: Tarea realizada por el coordinador del proyecto, entre sus diferentes labores entran, el soporte al programador, la revisión de los procesos seguidos, la verificación de los resultados y la gestión del trabajo. ● Desarrollo del proyecto: Es el desarrollo del proyecto, enfocado en el diseño del código y la realización de la parte práctica. Consta de la búsqueda de un dataset de aplicaciones apropiado, la extracción de características y análisis de las mismas. ● Documentación y memoria: ○ Introducción, antecedentes y justificación: Poner contexto al proyecto. ○ Objetivos y alcance: Establecer los límites y tareas a realizar dentro del proyecto. ○ Metodología: Desarrollar el orden que seguirá el desarrollo. ○ Desarrollo: Explicación detallada del proceso seguido para la creación del PFG y sus contenidos. ○ Planificación: Enfocar los pasos a seguir para una correcta ejecución del análisis. ○ Presupuesto: Cálculo de los costes económicos. ○ Conclusiones: Analizar los resultados obtenidos. ○ Bibliografía 6.2 Presupuesto Para la realización de este proyecto se requerirá un Jefe de Proyecto con una dedicación de 80 horas y un sueldo de 35 euros/hora y un programador junior con una dedicación de 347 horas y un sueldo de 18 euros/hora. Por otra parte se usará software libre, cuyo coste es gratuito, en cuanto al hardware, se calcula que su coste será de 1000€. El coste total del proyecto es de 10.046€ aproximadamente. 66 PROYECTO FIN DE GRADO 6.3 Estructura del proyecto Este proyecto será realizado por un programador junior y un Jefe de Proyecto. La labor del programador consistirá en las siguientes tareas: ● ● ● ● ● ● Búsqueda de nuevas características distintivas de las aplicaciones Android. Evaluación de las nuevas características. Creación de Datasets para el análisis de las aplicaciones. Entrenamiento y análisis de algoritmos de aprendizaje automático. Evaluación de los resultados obtenidos de los algoritmos. Creación de una metodología para el análisis y detección de malware en Android. El Jefe de Proyecto guiará al programador junior a lo largo del proceso enfocando la dirección que el proyecto seguirá y ayudando en los diferentes problemas con los que el programador pueda encontrarse. Para realizar dicho proceso se usará el siguiente sistema: Procesador AMD Ryzen 7 3800X Memoria Ram 32GB / 30 Útiles Disco Duro Samsung SSD 970 EVO Plus Tarjeta Gráfica Nvidia GeForce RTX 2070 Super Sistema Operativo Kali linux 2021.2 Lenguaje de Programación Python 3.9.5 Librería Aprendizaje Automático Scikit-learn 0.24.2 Decompilador ApkTool 2.5.0 Tabla 10: Datos del sistema usado 67 68 PROYECTO FIN DE GRADO Capítulo 7 Trabajo futuro Con este PFG se ha realizado no solo un análisis estático a través de los permisos de las aplicaciones Android. Además se ha analizado la posibilidad de una mejora introduciendo nuevas variables para la detección de malware. Este enfoque se ha realizado con las aplicaciones obtenidas a través de un repositorio de código abierto con 300 aplicaciones maliciosas y 300 benignas. El trabajo futuro incluye la introducción de otros tipos de análisis como el análisis híbrido, otro de los posibles trabajos futuros es el análisis a través de nuevas características como el análisis por códigos operacionales para la búsqueda de otras vulnerabilidades de seguridad. Otro elemento a tener en cuenta para el trabajo futuro es el análisis de más aplicaciones para poder obtener mejores resultados y unas mejores tasas de acierto. Además de tratar de identificar las acciones, servicios y categorías que pertenecen al malware para así reducir el tiempo de ejecución del proceso. 69 70 PROYECTO FIN DE GRADO Capítulo 8 Conclusiones A través de este Proyecto de Fin de Grado se ha conseguido un nuevo enfoque al conocimiento del análisis estático de las aplicaciones Android. Por otra parte puede servir como soporte y guía para aquellas personas que comienzan a adentrarse en el mundo del malware en el sistema operativo Android. En cuanto al resultado final se puede decir que se han cumplido los objetivos propuestos al inicio del proyecto, es decir, se han estudiado las diferentes técnicas para el análisis malware en android, el análisis estático, dinámico e híbrido, se han buscado las características distintivas del malware en android y se ha creado una metodología para la detección de dichas aplicaciones. Se ha propuesto una metodología diferente a las tradicionales, modificando CRISP-DM para una aplicación específica para el análisis malware. Además se han analizado nuevas características y algoritmos de aprendizaje automático, verificando su utilidad o inutilidad para detectar malware. Además este proyecto no solamente es un proyecto teórico sobre las diferentes características y sus funcionalidades o los algoritmos y su funcionamiento, además se realiza un análisis práctico de todas las características analizadas y de los diferentes algoritmos de aprendizaje automático. La idea principal es que sirva como base para proyectos más grandes, siendo usado como parte de un análisis más extenso de aplicaciones Android. 8.1 Análisis de los aspectos éticos del proyecto En este apartado se realizará un análisis de los aspectos éticos de este PFG. Se analizarán las consecuencias, los métodos de investigación, los procedimientos de decisión y ejecución y sus costos. 8.1.1 Consecuencias Los resultados de este proyecto permitirán un nuevo enfoque ante el análisis malware en Android, además ayudará a facilitar la introducción al mundo del análisis de malware en android. Por otra parte, ayudará a facilitar la realización de nuevas investigaciones en el ámbito android ya que con los resultados obtenidos se pueden descartar características a analizar en futuros proyectos. En cambio también puede tener consecuencias negativas como posibles fallas que lleven a equivocaciones en el análisis de las características de las aplicaciones. Además informa sobre las características más importantes en las aplicaciones Android, por lo que permiten a los fabricantes de malware evitar que su software malicioso sea detectado. 71 8.Conclusiones 8.1.2 Métodos de investigación La parte principal de este proyecto es la investigación, esto es el análisis de la tecnología a investigar y las herramientas necesarias para realizar el proyecto. La fuente única ha sido internet y en su mayoría dos sitios web, Android Developers y scikit-learn, aunque además se han analizado papers existentes, documentos o libros publicados en formato pdf entre otros. Esto presenta ciertas desventajas, la mayor es la dificultad para comprobar la veracidad de la información extraída de los diferentes sitios web, aunque debido a que la mayor parte de la información está extraída de sitios web fiables, se puede decir que la información es integra. Dicha falta de veracidad de la información puede provocar consecuencias negativas como la exclusión de ideas que pueden ser válidas. En cuanto a ventajas existen la diversidad de información y la facilidad de acceso a esta, se puede acceder rápidamente a dicha información rápidamente y está disponible en diversos idiomas. 8.1.3 Procedimientos de decisión Los procedimientos de decisión de este proyecto se han llevado a cabo en base al método de prueba y error, ya que es un proyecto realizado a nivel personal y trata de encontrar nuevas variables y nuevas metodologías de análisis de aplicaciones Android. Finalmente una vez se ha encontrado una metodología válida, se han buscado características en base a los datos de internet, pero sobre todo esta búsqueda se ha basado en la intuición del programador. Se puede decir que aunque se haya realizado un proyecto en pequeña escala se han conseguido resultados positivos aunque para verificar dichos resultados habría que aplicar la metodología y los datos extraídos a un entorno real con software novedoso. 8.1.4 Costes En cuanto a coste económico, debido a que es un proyecto realizado por un individuo a nivel personal, se puede decir que su coste económico en el aspecto humano es nulo, por otra parte todo el software usado es software libre, por lo que su coste es también nulo, finalmente, los únicos costes económicos serían, el hardware necesario para la realización del proyecto y los costes de electricidad e internet. Pasando al coste temporal, se dividirá en dos apartados, el primero, el tiempo invertido por el programador, el cual habrá realizado unas 350 horas de trabajo, por otro lado el coste del director del proyecto será de 80 horas. Lo que en total suman unas 430 horas de trabajo, esto lleva a pensar, en si a lo largo de esas 430 horas se podrían haber investigado otros aspectos del sistema android para mejorar la detección de malware en android o de podrían haber investigado otros tipos de análisis más novedosos para poder encontrar unas mejores soluciones ante el malware. Finalmente, se pasará a analizar el coste medioambiental de este proyecto, debido a que es un proyecto realizado a pequeña escala, su coste no es excesivamente elevado, aunque dicho coste se puede reducir con el uso de un sistema adaptado al proyecto, es decir, el sistema usado es un sistema con unas características excesivas para la tarea a realizar, lo que conlleva también un consumo eléctrico elevado. 72 PROYECTO FIN DE GRADO Capítulo 9 Agradecimientos Quiero agradecer a todas aquellas personas que me han apoyado a lo largo de la creación de este PFG. En primer lugar a mi tutor Borja Sanz Urquijo , por todo el apoyo y atención recibido a lo largo de este Proyecto Fin de Grado, por las horas de reuniones y tutorías y a la aportación de ideas y herramientas. En segundo lugar, a mi familia por apoyarme a lo largo de los años de estudio y en especial estos últimos meses. En tercer lugar, a mis amigos por las horas de compañía a lo largo de todo el PFG, haciendo más amena la investigación y redacción del mismo. 73 74 PROYECTO FIN DE GRADO Bibliografía: [1] “AV-Test”. https://www.av-test.org/en/statistics/malware/ (consultado el 16/05/2021) [2] “statista”. https://www.statista.com/statistics/680705/global-android-malware-volume/ (consultado el 16/05/2021) [3] “verizon”. https://www.verizon.com/business/resources/reports/mobile-security-index/2021/cheat-sheet/ (consultado el 16/05/2021) [4] “Android Developers”. https://developer.android.com/jetpack/guide?authuser=1 (consultado el 16/05/2021) [5] “Android Developers”. https://developer.android.com/guide/platform (consultado el 16/05/2021) [6] Iordic “GitHub”. https://iordic.github.io/android/smali/reversing/apk/coding/2018/10/08/introduccion-a-smali.html (consultado el 21/05/2021) [7] Jesus Freke “GitHub”. https://github.com/JesusFreke/smali/wiki (consultado el 21/05/2021) [8] Jesus Freke “GitHub”. https://github.com/JesusFreke/smali/blob/master/examples/HelloWorld/HelloWorld.smali (consultado el 21/05/2021) [9] “Python.org” https://www.python.org/ (consultado el 21/05/2021) [10] “EthicalHacking Consultores”. https://blog.ehcgroup.io/2020/08/20/16/25/30/9481/kali-linux-2020-3-estrena-nuevo-shell-y-nuev a-interfaz-para-windows/kali-linux/ehacking/ (consultado el 20/05/2021) [11] “ApkTool”. https://ibotpeaches.github.io/Apktool/ (consultado el 25/05/2021) [12] “NumPy” https://numpy.org/ (consultado el 21/05/2021) [13] “Pandas”. https://pandas.pydata.org/ (consultado el 25/05/2021) [14] “SKLearn”. https://scikit-learn.org/stable/ (consultado el 25/05/2021) [15] “Heimdal Security”. https://heimdalsecurity.com/blog/android-malware/ 21/05/2021) (consultado el [16] “SecureList by Kaspersky”. https://securelist.com/mobile-malware-evolution-2020/101029/ (consultado el 21/05/2021) [17] “MalwareFox”. https://www.malwarefox.com/android-app-permissions/ (consultado el 21/05/2021) 75 [18] “Tap Reason”. https://blog.tapreason.com/android-permissions-explained-e540ef90574d (consultado el 21/05/2021) [19] “Android Permissions”. http://androidpermissions.com/permission/android.permission.READ_SOCIAL_STREAM (consultado el 21/05/2021) [20] “El Español”. https://www.elespanol.com/elandroidelibre/noticias-y-novedades/20130607/sofisticado-androidanalizado-milimetro-caracteristicas-funcionamiento-descubierto/1000157_0.html (consultado el 21/05/2021) [21] “Kaspersky”. https://www.kaspersky.es/resource-center/threats/trojans (consultado el 21/05/2021) [22] “techJury”. https://techjury.net/blog/what-is-a-keylogger/ (consultado el 21/05/2021) [23] “iavcei”. https://www.iavcei.org/12-best-android-keylogger-apps-in-2019-no-root-hidden/ (consultado el 21/05/2021) [24] “SecureList by Kaspersky”. https://securelist.lat/ransomware-world-in-2021/93642/ (consultado el 21/05/2021) [25] “Technology Safety”. https://www.techsafety.org/spyware-and-stalkerware-phone-surveillance (consultado el 21/05/2021) [26] “XatakaAndroid”. https://www.xatakandroid.com/seguridad/nuevo-malware-android-se-hace-pasar-actualizacion-s istema (consultado el 21/05/2021) [27] “MalwareBytes” https://es.malwarebytes.com/adware/ (consultado el 21/05/2021) [28] Christian Camilo Urcuqui López, Andres Navarro, “Machine learning classifiers for android malware analysis”, 10-16, 2016 https://www.researchgate.net/publication/305649819_Machine_learning_classifiers_for_android _malware_analysis [29] Modupe Odusami, Olusola Oluwakemi Abayomi-Alli, Sanjay Misra, Olamilekan Shobayo, Robertas Damasevicius, Rytis Maskeliunas, “Android Malware Detection: A Survey”, 2018 https://www.researchgate.net/publication/328495819_Android_Malware_Detection_A_Survey [30] “Scikit Learn”. https://scikit-learn.org/stable/modules/linear_model.html (consultado el 23/05/2021) [31] “Scikit Learn”. https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.RidgeClassifier.html (consultado el 23/05/2021) 76 PROYECTO FIN DE GRADO [32] “Scikit Learn”. https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Ridge.html (consultado el 23/05/2021) [33] “Scikit Learn”. https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression (consultado el 23/05/2021) [34] “Scikit Learn”. https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression (consultado el 23/05/2021) [35] “Scikit Learn”. https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.SGDClassifier.html (consultado el 23/05/2021) [36] “Scikit Learn”. https://scikit-learn.org/stable/modules/sgd.html#sgd (consultado el 23/05/2021) [37] “Scikit Learn”. https://scikit-learn.org/stable/modules/neighbors.html (consultado el 23/05/2021) [38] “Scikit Learn”. https://scikit-learn.org/stable/modules/neighbors.html#classification (consultado el 23/05/2021) [39] “Scikit Learn”. https://scikit-learn.org/stable/modules/naive_bayes.html#gaussian-naive-bayes (consultado el 23/05/2021) [40] “Scikit Learn”. https://scikit-learn.org/stable/modules/tree.html#tree (consultado el 23/05/2021) [41] “Datacamp”. https://www.datacamp.com/community/tutorials/decision-tree-classification-python (consultado el 23/05/2021) [42] “Scikit Learn”. https://scikit-learn.org/stable/modules/ensemble.html (consultado el 25/05/2021) [43] “Scikit Learn”. https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.AdaBoostClassifier.html (consultado el 25/05/2021) [44] “Scikit Learn”. https://scikit-learn.org/stable/modules/neural_networks_supervised.html (consultado el 25/05/2021) [45] “SNGULAR”. https://www.sngular.com/es/data-science-crisp-dm-metodologia/ (consultado el 25/05/2021) [46] “Wikipedia Images”. https://es.wikipedia.org/wiki/Cross_Industry_Standard_Process_for_Data_Mining#/media/Archiv o:CRISP-DM_Process_Diagram.png (consultado el 25/05/2021) 77 [47] “Oracle”. https://docs.oracle.com/javase/7/docs/technotes/guides/jar/jar.html (consultado el 25/05/2021) [48] “Android Developers”. https://developer.android.com/google/play/expansion-files?authuser=1 (consultado el 25/05/2021) [49] “We Live Security”. https://www.welivesecurity.com/la-es/2017/01/19/metadatos-en-archivos-apk/ (consultado el 25/05/2021) [50] “Stack Overflow”. https://stackoverflow.com/questions/39305775/what-are-the-purposes-of-files-in-meta-inf-folderof-an-apk-file/39305776 (consultado el 25/05/2021) [51] “Android Developers”. https://developer.android.com/guide/topics/manifest/manifest-intro?hl=es-419 (consultado el 25/05/2021) [52] “Android Developers”. https://developer.android.com/guide/topics/resources/providing-resources (consultado el 25/05/2021) [53] “Geeks for Geeks”. https://www.geeksforgeeks.org/assets-folder-in-android/ (consultado el 25/05/2021) [54] “C# Corner”. https://www.c-sharpcorner.com/blogs/apk-and-dex-extension-in-android1 [55] “ReviverSoft”. https://www.reviversoft.com/es/file-extensions/dex (consultado el 25/05/2021) [56] “File Extension”. https://www.file-extension.info/es/format/arsc (consultado el 25/05/2021) [57] “Android Developers”. https://developer.android.com/reference/android/content/pm/PackageItemInfo?hl=es-419#meta Data (consultado el 15/06/2021) [58] “Android Developers”. https://developer.android.com/reference/android/app/Activity (consultado el 01/06/2021) [59] “Android Developers”. https://developer.android.com/guide/topics/manifest/activity-element (consultado el 01/06/2021) [60] “Android Developers”. https://developer.android.com/reference/android/app/Service (consultado el 01/06/2021) [61] “Android Developers”. https://developer.android.com/guide/topics/manifest/service-element (consultado el 01/06/2021) 78 PROYECTO FIN DE GRADO [62] “Android Developers”. https://developer.android.com/guide/topics/manifest/provider-element (consultado el 01/06/2021) [63] “Android Developers”. https://developer.android.com/reference/android/content/ContentProvider (consultado el 01/06/2021) [64] “Android Developers”. https://developer.android.com/reference/android/content/BroadcastReceiver (consultado el 02/06/2021) [65] “Android Developers”. https://developer.android.com/guide/components/broadcasts#system-broadcasts (consultado el 02/06/2021) [66] “Android Developers”. https://developer.android.com/guide/topics/manifest/receiver-element (consultado el 02/06/2021) [67] “Android Developers”. https://developer.android.com/guide/components/fundamentals#Components (consultado el 02/06/2021) [68] “Android Developers”. https://developer.android.com/guide/components/intents-filters?authuser=1 (consultado el 02/06/2021) [69] “Android Developers”. https://developer.android.com/guide/topics/manifest/intent-filter-element?authuser=1 (consultado el 15/06/2021) [70] “Android Developers”. https://developer.android.com/guide/topics/permissions/overview?authuser=1 (consultado el 15/06/2021) [71] “Android Developers”. https://developer.android.com/guide/topics/manifest/application-element?authuser=1 (consultado el 15/06/2021) [72] “StackOverflow”. https://stackoverflow.com/questions/38687159/what-is-metadata-and-what-is-the-use-of-it-in-an droid#:~:text=In%20Android%2C%20you%20can%20define,and%20inside%20tag (consultado el 15/06/2021) [73] “Android Developers”. https://developer.android.com/guide/topics/manifest/meta-data-element?hl=es-419 (consultado el 15/06/2021) 79 [74] “Android Developers”. https://developer.android.com/guide/topics/manifest/uses-feature-element (consultado el 15/06/2021) [75] “Google Developers”. https://developers.google.com/machine-learning/crash-course/classification/accuracy (consultado el 09/06/2021) [76] “Google Developers”. https://developers.google.com/machine-learning/crash-course/glossary#accuracy (consultado el 09/06/2021) [77] “Scikit Learn”. https://scikit-learn.org/stable/modules/model_evaluation.html#accuracy-score (consultado el 09/06/2021) [78] “Scikit Learn”. https://scikit-learn.org/stable/modules/generated/sklearn.metrics.accuracy_score.html (consultado el 10/06/2021) [79] “Statistical Odds & Ends”. https://statisticaloddsandends.wordpress.com/2020/01/23/what-is-balanced-accuracy/#:~:text=B alanced%20accuracy%20is%20a%20metric,the%20presence%20of%20a%20disease. (consultado el 10/06/2021) [80] “Scikit Learn”. https://scikit-learn.org/stable/modules/generated/sklearn.metrics.balanced_accuracy_score.html (consultado el 10/06/2021) [81] “Scikit Learn”. https://scikit-learn.org/stable/modules/model_evaluation.html#balanced-accuracy-score (consultado el 10/06/2021) [82] “Scikit Learn”. https://scikit-learn.org/stable/modules/model_evaluation.html#precision-recall-f-measure-metrics (consultado el 11/06/2021) [83] “Scikit Learn”. https://scikit-learn.org/stable/modules/generated/sklearn.metrics.precision_score.html (consultado el 11/06/2021) [84] “Runebook”. https://runebook.dev/es/docs/scikit_learn/modules/generated/sklearn.metrics.average_precision _score (consultado el 11/06/2021) [85] “Jonathan Hui”. https://jonathan-hui.medium.com/map-mean-average-precision-for-object-detection-45c121a311 73 (consultado el 11/06/2021) 80 PROYECTO FIN DE GRADO [86] “Scikit Learn”. https://scikit-learn.org/stable/modules/generated/sklearn.metrics.brier_score_loss.html (consultado el 13/06/2021) [87] “Scikit Learn”. https://scikit-learn.org/stable/modules/model_evaluation.html#brier-score-loss (consultado el 13/06/2021) [88] “Scikit Learn”. https://scikit-learn.org/stable/modules/generated/sklearn.metrics.f1_score.html (consultado el 13/06/2021) [89] “Scikit Learn”. https://scikit-learn.org/stable/modules/model_evaluation.html#precision-recall-f-measure-metrics (consultado el 13/06/2021) [90] “Scikit Learn”. https://scikit-learn.org/stable/modules/generated/sklearn.metrics.recall_score.html (consultado el 13/06/2021) [91] “Scikit Learn”. https://scikit-learn.org/stable/modules/model_evaluation.html#roc-metrics (consultado el 13/06/2021) [92] Pham Thanh Giang, “THE PROCEEDINGS OF THE 7th VAST - AIST WORKSHOP “RESEARCH COLLABORATION: REVIEW AND PERSPECTIVE”, 207-216, 2015 https://www.researchgate.net/publication/296704790_Permission_Analysis_for_Android_Malwar e_Detection [93] Borja Sanz, Igor Santos, Carlos Laorden, Xabier Ugarte-Pedrero, Pablo García Bringas, Gonzalo Alvarez, “PUMA: Permission Usage to Detect Malware in Android”, 2013 https://www.researchgate.net/publication/256194732_PUMA_Permission_Usage_to_Detect_Ma lware_in_Android [94] “University of New Brunswick”. http://205.174.165.80/CICDataset/CICAndAdGMal2017/Dataset/ [95] “University of New Brunswick”. https://www.unb.ca/cic/datasets/android-adware.html [96] “GitHub”. https://github.com/Saket-Upadhyay/Android-Permission-Extraction-and-Dataset-Creation-with-P ython (consultado el 13/04/2021) [97] “GitHub”. https://github.com/terry2012/android-a2p (consultado el 20/04/2021) [98] “GitHub”. https://github.com/ahlashkari/AndroidAppLyzer (consultado el 15/04/2021) 81