Recomendaciones para el desarrollo de aplicaciones móviles seguras

Uno de los retos principales para mantener la confianza en los negocios online es el de la seguridad de las aplicaciones móviles. Varios factores están influyendo en que éste sea un área de la máxima prioridad:

• El imparable crecimiento del uso del teléfono móvil como vehículo para las transacciones online por parte de los consumidores y el gusto de los mismos por descargarse múltiples pequeñas aplicaciones para “resolver” las más diversas cuestiones de su vida cotidiana

• Una fuerte presión en las empresas por ocupar rápidamente “su hueco” en el mundo de la operativa por medio del móvil, con una fuerte demanda de servicios de desarrollo “rápido” de aplicaciones para móviles, tablets…

• Fuerte énfasis en la facilidad de uso de las aplicaciones y en una funcionalidad distintiva y original, con un olvido recurrente de las cuestiones de seguridad y prevención del fraude. La seguridad se suele considerar como un añadido posterior, cuando se detectan los problemas y no como una característica intrínseca del diseño de las aplicaciones.

• La escasa o nula formación de los desarrolladores de software en cuestiones de seguridad y una presión constante en los plazos de entrega y el coste de las aplicaciones desarrolladas.

En este entorno se viene observando, lógicamente, un progresivo interés y especialización de hackers y redes de delincuentes online en explotar las frecuentes vulnerabilidades de este tipo de aplicaciones.

En este artículo vamos a hacer un breve recorrido por los principales problemas de seguridad de las aplicaciones móviles y trataremos de dar una orientación sobre las prácticas que ayudan a mitigar algunas de estas vulnerabilidades, aplicando prácticas de control en el desarrollo de estas aplicaciones. Esperemos que sea de utilidad para los programadores y responsables de desarrollo.

Principales incidentes de seguridad de las aplicaciones móviles

Los tipos de incidentes que se describen a continuación se suelen materializar sobre todo por la actividad de código malicioso (malware) instalado en el dispositivo. La mayor parte de las veces es el propio usuario el que al ser engañado descarga y da privilegios al software malicioso. El robo de información también puede ser realizado en casos de pérdida o robo del terminal o actuando a distancia pero cerca del dispositivo. Si no están convenientemente protegidos, los datos almacenados por las aplicaciones pueden ser accedidos fácilmente.

Incidente Ejemplos
Interceptación de la comunicación y robo de datos 
  • Redirigir de manera encubierta cada e-mail o SMS enviado o recibido por el usuario  a una tercera parte en la sombra.
  • Reenvío de las llamadas entrantes
  • Escucha de las llamadas telefónicas del dispositivo.
  • Robo de los datos almacenados en el dispositivo y envío a terceras partes usando el  e-mail, SMS o a través de http/s.
  • Monitorización de la localización física de la víctima y el terminal.
  • Crear falsas pantallas para engañar a los usuarios y solicitares que desvelen sus credenciales de acceso a los servicios u otra información sensible (passwords, claves de acceso a banca, número de tarjeta de crédito). O sea, típicos escenarios de phising o troyanos bancarios en el móvil. La información es enviada a los defraudadores usando el correo electrónico, SMS o la conexión Internet.
  • Interceptación de la comunicación a través de WI-FI

 

Uso fraudulento del dispositivo 
  • Envío desde el terminal infectado de SMS o correos electrónicos fraudulentos, como medio para la distribución de virus a los destinatarios
  • Llamadas no autorizadas a servicios de tarificación especial
  •  Uso no autorizado de aplicaciones de pagos por móvil

 

Modificación fraudulenta del terminal  Una vez infectado el dispositivo, como pasos preliminares de las actividades fraudulentas y para ocultar la presencia del código malicioso.

  • Eliminación de las protecciones intrínsecas del dispositivo (rooting, jaibreaking)
  • Modificación la configuración proxy de internet para interceptar la navegación del usuario (Man in the Middle).
  • Cambiar la configuración de correo electrónico, SMS o llamadas para la redirección de los mismos.

 

 Recomendaciones de diseño y desarrollo seguro de aplicaciones móviles

Aunque en gran medida las vulnerabilidades y los riesgos de las aplicaciones móviles son comunes al resto de aplicaciones de Internet, las especiales características de los dispositivos móviles y las circunstancias alrededor de su uso hacen que en la actualidad organismos como la ENISA (en colaboración con OWASP) estén trabajando en la elaboración de recomendaciones específicas de diseño y desarrollo seguro de este tipo de aplicaciones móvil.

A continuación presentamos un resumen de algunas directrices útiles para desarrolladores de aplicaciones, siguiendo los pasos de la referencia iniciativa en la que está trabajando ENISA.

Como se puede comprobar, aplicando estas directrices de desarrollo no seremos capaces de prevenir o mitigar todos los escenarios de riesgo descritos, pero sí al menos dificultaremos el acceso ilegítimo a los datos y la suplantación de identidad.

Protección de datos sensibles almacenados en el dispositivo

• En la medida de lo posible evitar el almacenamiento de información sensible (passwords, claves de cifrado, datos personales…) en el dispositivo móvil. En vez de esto, almacenar esta información en el servidor.

• En caso de ser necesario el almacenaje de información sensible localmente en el dispositivo usar el espacio reservado a la aplicación.

• Si es necesario almacenar información sensible en el dispositivo, entonces usar técnicas de cifrado fuerte de la información. Nunca almacenar passwords o tokens en claro en el dispositivo.

• Si están disponibles, hacer uso de los elementos de seguridad que proporcionan tarjetas SD criptográficas del tipo FIPS 140-2 de nivel 3.

• Nunca almacenar información sensible en los repositorios de almacenamiento compartido del dispositivo (directorios de acceso público, caches, almacenamiento temporal, agenda de direcciones, galerías de imágenes, ficheros de configuración…)

• Hacer uso de las APIs que permiten el borrado remoto de los datos sensibles almacenados en el dispositivo, en aquellos casos de dispositivos que gestionados mediante soluciones de MDM (Mobile Device Management). En otro caso, valorar la posibilidad de que la aplicación disponga de sus propios mecanismos para el borrado remoto y seguro de los datos de aplicación.

• En caso de ser necesario, en lugar de passwords, es preferible almacenar en el dispositivo hashes cifrados de las mismas o tokens de autorización generados por el servidor y cifrados.

• Los tokens deberían ser generados con unos propósitos específicos y con una validez temporal determinada y deben poder ser revocados remotamente.

• Nunca almacenar passwords, tokens o claves de cifrado/descifrado en el binario de las aplicaciones.

• Asegurarse de que la información sensible (passwords, claves de cifrado/descifrado) quede visible en caches, o ficheros de log de la aplicación.

Protección de la transmisión de datos sensibles

• Usar cifrado de las comunicaciones con SSL/TLS o STS.

• Usar algoritmos de cifrado fuertes y claves de cifrado robustas (seguir escrupulosamente las recomendaciones del algoritmo elegido).

• Establecer la conexión de la aplicación con el servidor solamente tras la verificación de que el certificado del servidor se corresponde con el de la entidad legítima.

• Nunca usar SMS o MMS para el envío de información sensible.

Autenticación, autorización y gestión de la sesión del usuario

• Durante el proceso de alta es buena idea proporcionar feedback al usuario sobre la fortaleza de las contraseñas a usar.

• Debe proporcionarse al usuario la posibilidad de cambiar la contraseña de acceso en cualquier momento.

• Si la criticidad de los datos manejados por la aplicación es alta, valorar el uso de autenticación fuerte de dos factores.

• Requerir el envío de tokens o credenciales de autenticación en cada solicitud de operaciones al servidor.

• Para la generación de números aleatorios, utilizar semillas que no sean predecibles.

• Mantener logs de aplicación registrando todas las actividades sensibles por parte del usuario (aunque evitando almacenar en claro información sensible).

Seguridad del servidor

• Todos los servicios a nivel de servidor deben ser verificados periódicamente para asegurar que no exponen vulnerabilidades que pueden ser explotadas. Deben realizarse verificaciones estáticas de código y dinámicas, con la ayuda de herramientas, de modo que el código que llegue a producción esté libre de las vulnerabilidades más típicas.

• Si la criticidad de la aplicación así lo requiere, realizar pruebas periódicas para asegurarse de que los servicios a nivel de servidor no sean vulnerables a ataques de denegación de servicio.

• Ejecutar los servicios a nivel de servidor en hosts que tengan los últimos parches de seguridad aplicados de acuerdo con una política corporativa de gestión de vulnerabilidades.

Recomendaciones generales

• Seguir las normas de codificación segura aplicables a los lenguajes de programación usados.

• Durante la fase de diseño de la aplicación realizar análisis de riesgos preliminares para identificar objetivos y requisitos generales de seguridad, identificar y valorar la criticidad de la información a ser usada por la aplicación y los casos de abuso por parte de usuarios malintencionados.

• Realizar testing de los casos de abuso, además de las pruebas funcionales que verifican la funcionalidad de los usuarios legítimos de la aplicación

• Validar y filtrar a nivel cliente y de manera redundante a nivel de servidor todos los datos introducidos desde el dispositivo móvil. Como norma general, no confiar por defecto en ningún dato que llegue al servidor desde el dispositivo, incluidas las cookies, cabeceras HTTP…

• Filtrar los tipos y longitud de datos a nivel de servidor para prevenir errores y overflows

• Ejecutar las aplicaciones con los mínimos privilegios requeridos a nivel de sistema operativo. En particular, evitar que la aplicación se ejecute con privilegios de administración.

• Eliminar todo código de pruebas del código fuente, así como comentarios y cualquier puerta trasera o mecanismo que deshabilite los controles de acceso usado para facilitar el testing de la aplicación.

• Distribuir la aplicación sólo desde apps-stores oficiales y monitorizar la existencia de posibles versiones fraudulentas de las aplicaciones.

• Proporcionar a los usuarios canales ágiles para la notificación de incidentes de seguridad y gestionar con agilidad la información recibida por los mismos.

Finalizamos aquí este breve resumen. Esperemos que sirva de ayuda a los desarrolladores para centrar e identificar los puntos esenciales a tener en cuenta y como punto de partida a partir del cual profundizar. Sin duda volveremos sobre la seguridad de aplicaciones en el futuro.

Un fuerte abrazo, gracias y hasta pronto.

Artículos relacionados

Gestión de la Seguridad de la Información corporativa en dispositivos móviles