Wednesday, April 29, 2020

Android: Buenas Prácticas de Desarrollo

Android es uno de los sistemas operativos para teléfonos inteligentes más populares en la actualidad. Tiene una gran base de consumidores, así como un gran apoyo de la comunidad de desarrolladores, al momento existen 2,885,938 aplicaciones en Google Play.

Google Play cuenta con el programa de mejora de seguridad de aplicaciones “App Security Improvement”. Gracias a este programa Google analiza las aplicaciones en busca de fallos de seguridad, antes de que éstas sean publicadas, en caso de evidenciarse un fallo, se envía una notificación junto con el consejo o recomendación para mitigar la vulnerabilidad.

Así mismo, si usted encuentra un posibles problemas de seguridad en cualquier aplicación, puede notificarlo por medio de la cuenta: security+asi@android.com.

El programa de Google puede facilitarle en la remediación de vulnerabilidades, pero esto será en la etapa de implementación lo cual puede incurrir en gastos adicionales y aumento en tiempos de entrega, a continuación, podrá encontrar las principales estrategias que le permitirán incrementar los niveles de seguridad en su aplicación:

1. Ofuscación del código

¿Qué tan fácil es hacer ingeniería inversa a la aplicación?
Una aplicación Android(.apk) puede contener código Java, Kotlin(compilado a Java), C/C++ (Java NDK), Corona / LUA, PhoneGap.

La ofuscación de código es el proceso de modificar un ejecutable para evitar que este sea fácilmente legible, sin este proceso el código fuente del apk puede es fácilmente legible por cualquier curioso. Un apk no es más que un archivo comprimido.

¿A qué tipo de riesgos podría estar expuesto?

Robo de propiedad intelectual: El código fuente debería ser leído únicamente por el autor o dueño del producto pero esto no siempre es así, y la lógica de programación, arquitectura, dominios etc., puede ser usados/consultados por un adversario que intentará tomar provecho de cada componente.

Privacidad: El código podría exponer datos de licenciamiento, lógica del proceso de activación o mecanismos para evasión de filtros.

Explotación de vulnerabilidades: Un nuevo día revela una nueva vulnerabilidad en componentes o funciones que no se tuvieron en cuenta en el lanzamiento de la aplicación, éstas podrían ser encontradas por medio de un análisis de código estático y explotadas en tiempo de ejecución.

El propósito de la ofuscación es reducir el tamaño de una aplicación acortando los nombres de las clases, métodos y campos, incrementando el nivel de dificultad en una inspección.

Para mejorar este proceso se recomienda usar herramientas de código abierto como ProGuard o comercial como DexGuard.

2. Almacenamiento de datos

El problema de seguridad más común para una aplicación en Android es que otras aplicaciones puedan acceder a los datos que se guardaron en el dispositivo, toda la información sensible requiere métodos de protección adicionales, en Android existen tres formas fundamentales para guardar los datos:

2.1 Almacenamiento Interno: Por defecto, los archivos que se crean en el almacenamiento interno son accesibles únicamente por la aplicación, tenga en cuenta que los permisos dados a otras aplicaciones podrían permitir el acceso a estos datos.

Para proporcionar protección adicional para datos confidenciales, puede cifrar archivos locales utilizando la biblioteca de Seguridad. Esta librería proporciona una implementación de las mejores prácticas de seguridad relacionadas con la lectura y escritura de datos en reposo, La biblioteca utiliza el patrón del generador para proporcionar configuraciones predeterminadas seguras.
Para la gestión de claves, la biblioteca de seguridad utiliza un sistema de 2 partes para la administración de claves: un conjunto de claves que contiene una o más claves para cifrar un archivo o datos de preferencias compartidas. (Almacenadas en SharedPreferences) y una clave maestra que cifra todos los conjuntos de claves (Almacena en Android keystore system).

2.2 Almacenamiento Externo: Los archivos creados en almacenamiento externo, como las tarjetas SD, se pueden leer y escribir a nivel global. El archivo puede ser modificado o eliminado por el usuario o por cualquier aplicación.

Para leer y escribir archivos en el almacenamiento externo de una manera más segura, considere usar la clase EncryptedFile del paquete androidx.security.crypto soportado desde el nivel de API 23+.
Recuerde utilizar la última versión disponible.

2.3 Proveedor de Contenido: Los proveedores de contenido ofrecen un mecanismo de almacenamiento estructurado que puede limitarse a su propia aplicación o exportarse para permitir el acceso de otras aplicaciones, esto puede ser configurado a través del atributo: android:exported.

Recuerde tener presente el principio de menor privilegio.

3. Criptografía

La criptografía también se puede utilizar para proteger los datos del usuario, Android tiene dos métodos para el cifrado del dispositivo:

3.1 Cifrado basado en archivos: A partir de Android 7.0 se admite el cifrado basado en archivos (FBE), el cual permite cifrar diferentes archivos con diferentes claves que se pueden desbloquear de forma independiente.

3.2 Cifrado utilizando el cifrado de disco: Este proceso codifica todos los datos del usuario en un dispositivo Android, utilizando claves de cifrado simétricas, todos los datos creados por el usuario se encriptan y se desencripta automáticamente antes de enviarlo o leerlo en el disco.

El paquete javax.crypto proporciona las clases e interfaces para operaciones criptográficas. Las cuales incluyen el cifrado, la generación de claves y código de autenticación de mensajes (MAC).
Las clases facilitan la implementación de cifrados simétricos, asimétricos, de bloque y de flujo tales como: AES, AES_128, AES_256, ARC, BLOWFISH, ChaCha20, DES, DESede, RSA.

4. Permisos de las aplicación

Las solicitudes para acceder a información confidencial, sólo deben realizarse cuando el acceso es necesario para el funcionamiento de su aplicación.
Android permite configurar los permisos de las aplicaciones, la aplicación debe publicar los permisos que requiere en la etiqueta <uses-permission> del manifiesto de la aplicación.

Al trabajar con permisos en Android se recomienda seguir los siguientes principios:
4.1 Sólo use los permisos necesarios para que su aplicación funcione.
4.2 Verifique los permisos requeridos por las bibliotecas.
4.3 Sea transparente (Tenga claro a qué está accediendo y porqué)
4.4: Haga que el acceso al sistema sea explícitos e informativo.

Recuerde agregar los permisos requeridos para el correcto funcionamiento de la aplicación.

5. Protección de aplicaciones en tiempo de ejecución

Herramientas como DexGuard protege las aplicaciones contra ataques en tiempo real, evitando que atacantes recopilen conocimiento sobre su comportamiento y lo modifique en tiempo de ejecución.
Implementa detección de herramientas de depuración, emuladores, dispositivos rooteados, marcos de ocultación de raíz y manipulación.


Finalmente, al desarrollar una aplicación recuerde cumplir con las políticas establecidad por Google:

Referencias:
Android Security, Attack And Defenses, Abhishek Dubey | Anmol Misra
Android Developers, Docs Guides https://developer.android.com/topic/security/best-practices
Centro de política del desarrollador: https://play.google.com/about/privacy-security-deception/

AppBrain, Android Statistics https://www.appbrain.com/stats/number-of-android-apps

No comments:

Post a Comment