Saltar al contenido


Este articulo es el primero de una serie de capítulos relacionados con la seguridad en las aplicaciones móviles. En este caso nos vamos a centrar en las aplicaciones nativas para las dos plataformas dominantes a día de hoy en el mercado mundial, nos referimos a Android e iOS, más concretamente el el almacenamiento de los datos, algo que todo desarrollador debería de saber a la hora de desarrollar una aplicación móvil.

La mejor manera de empezar es hablando de: "¿por qué la seguridad en una aplicación es tan importante?". Para responder a esta pregunta, lo más oportuno es indicar unos simples datos estadísticos para que nos demos cuenta de la importancia del tema:

  • 163 % de aumento de malware móvil desde 2012.
  • 78 % de las 100 mejores aplicaciones de Android e iOS han sido hackeadas.
  • Menos del 5 % de las aplicaciones populares contienen protecciones de nivel profesional para la defensa contra los ataques de hackers.
  • 40 % de las aplicaciones más populares gratuitas de iOS y el 80 % de las mismas aplicaciones Android gratuitas han sido hackeadas en algún momento.

Visto estos datos, una aplicación móvil no segura puede provocar pérdida de ingresos, acceso no autorizado a los datos críticos, robo de propiedad intelectual, fraude, mala experiencia de usuario, daños a la marca…

Las aplicaciones de mayor riego, las que necesitan más seguridad, son aquellas aplicaciones que requieren de ubicación, recoge información personal de los usuarios o aquellas que se basan en servidores remotos para almacenar o manipular información.


Qué hacer y qué no hacer para mantener una aplicación segura

HACER

  • Mantener actualizadas las bibliotecas.
  • Utilice una dirección web cifrada para el intercambio de contenido entre aplicación y servidor.
  • Cifrar datos del servidor y aplicación. Si usted está manejando datos de usuario y/o datos sensibles.
  • Considerar la posibilidad de bloquear/editar cuentas desde sitios externos, por si acaso sus usuarios pierden sus teléfonos.
  • Forzar a los usuarios a utilizar mejores contraseñas. No permita que la contraseña sea simple.
  • Filtrar las entradas del usuario a nivel de dispositivo para evitar un ataque de inyección de datos.
  • Asegúrese de que confía en el origen y comprobar la seguridad (SSL-Pinning).
  • Almacenado en un lugar seguro dentro de recinto de seguridad de la aplicación. iOS -> Llavero del sistema, Android -> cifrar datos.
  • Utilice la función hash criptográfica individual por usuario.

NO HACER

  • Tratar contenido obtenido como de confianza.
  • Mantener datos no necesarios en la aplicación.
  • Guarde los datos sensibles en NSUserDefaults (iOS) o SharedPreferences (Android).
  • Olvídese de incluir https: peticiones a servidor (GET, POST, PUT, DELETE, …) para cualquier tipo de petición que incluya información sensible.
  • Conectar a un backend no seguro.
  • Crear credenciales no seguros para sus usuarios (como nombres de usuario y contraseñas).
  • Utilizar una clave de cifrado estática.



Vulnerabilidad en el almacenamientos de datos

Después de la introducción y de haber visto la importancia de invertir tiempo y dinero en crear aplicaciones móviles seguras, veamos que podemos hacer con los datos, con toda la información sensible que maneja una aplicación móvil.

Es importante ver el acceso de los modelos de datos, ya que este acceso es una amenaza importante y por la tanto es necesario invertir tiempo para que los datos de usuario estén lo mas seguro posible.

Es importante conocer las API que se encargan del manejo de datos y mas, si almacenan información sensible, hay que realizar una inversión en asegurar la seguridad de dicha datos. De forma anecdótica, veamos lugares en los que más a menudo vemos los datos que se almacenan de forma insegura son:

  • Bases de datos SQLite
  • Archivos de registro
  • Archivos Plist
  • Almacenes de datos XML o archivos Manifest
  • Almacenes de datos binarios
  • Cookies
  • Tarjeta SD
  • Sincronización en la nube

La regla cardinal de aplicaciones móviles es: no almacenar datos a menos que sea absolutamente necesario. Como desarrollador tienes que asumir que los datos serán perdidos en cuanto se toca el teléfono. También hay que considerar las implicaciones de la pérdida de datos de los usuarios individuales, cada móvil es una fuga de datos en potencia.

Si la facilidad de uso en comparación con menos seguridad es demasiado para ti, le recomendamos que estudie en profanidad e invierta tiempo en crear una API de seguridad de datos para asegurarse de que acceso a esta información es de manera apropiada. La idea aquí es saber qué datos se están almacenando y protegerlos adecuadamente.

Mejores Prácticas (iOS)

  • Nunca almacene las credenciales en el sistema de archivos del teléfono. Obligar al usuario a autenticarse utilizando un esquema web o API de entrada estándar (a través de HTTPS). Garantizando que los tiempos de espera de la sesión se han fijado en el mínimo indispensable para cumplir con los requisitos de experiencia de usuario.
  • En el almacenamiento de la información es necesario considerar el uso de una biblioteca de cifrado estándar de iOS como CommonCrypto.
  • Si hay poca información necesaria de ser almacenada, se puede hacer uso de la API del llavero del sistema, pero sabiendo que un teléfono con jailbreak puede explorar el llavero y leerlo fácilmente.
  • Para bases de datos consideren usar SQLCipher para el cifrado de datos SQLite.
  • Para almacenar una gran cantidad de datos a de nivel del consumidor, se puede utilizar el mecanismo de protección de archivos de Apple con seguridad, ver NSData, clase con opciones de protección.
  • Evite el uso de NSUserDefaults para almacenar información sensible, ya que almacena los datos en los archivos plist.
  • Tenga en cuenta que todos los datos/entidades que utilizan NSManagedObjects serán almacenados en un archivo de base de datos sin cifrar.

Mejores Prácticas (Android)

  • Para el almacenamiento local de información es recomendable usar la API de administración para empresas a nivel del dispositivo Android, se puede utilizar para forzar el cifrado de archivos locales usando “setStorageEncryption” (DevicePolicyManager).
  • Con el almacenamiento en la memoria externa se puede conseguir cierta seguridad a través de la biblioteca ‘javax.crypto’. Existen algunas opciones, es simplemente cifrar los datos de texto plano con una contraseña maestra y AES 128.
  • Asegurar que las preferencias compartidas no están MODE_WORLD_READABLE al menos que sea requerido expresamente para compartir entre las aplicaciones de la información.
  • Si fuera imprescindible usar SharedPreferences para datos sensibles, es totalmente imprescindible crear un envoltorio seguro sobre los datos, acceso al contenedor mediante una clave de acceso, guardar los datos cifrados…
  • Guardar información en base de datos (SQLite) ya sea mediante las API del SDK Android o con el uso de librerías ORM, encriptar los datos sensibles, no almacenar información en plano.
  • Ofuscar el código de una aplicación de producción, es sorprendentemente sencillo desempaquetar apks y obtener código fuente no deseado. Para esto se pude usar Proguard.
  • Otro aspecto que muchas veces se pasa por alto son los logs que genera tu aplicación, esta información es muy importante durante el desarrollo y pruebas, pero en una aplicación en producción, no puede existir escritura de logs. Para evitar esto con proguard es sencillo suprimirlos, otra opción puede ser crear una capa por encima de Log para habilitar/deshabilitar de forma rápida.

Otros artículos destacados