Man-in-the-middle en entornos mobile

En criptografía, un ataque de intermediario​ (man-in-the-middle, MitM) es un ataque en el que se adquiere la capacidad de leer, insertar y modificar a voluntad. El atacante debe ser capaz de observar e interceptar mensajes entre las dos víctimas los mensajes entre dos partes sin que ninguna de ellas conozca que el enlace entre ellos ha sido violado.

Así es cómo la Wikipedia describe el popular ataque man-in the middle, sobre el cuál nos vamos a centrar hoy, concretamente en el entorno mobile.

Por desgracia, son muchos los desarrolladores que se conforman con realizar las conexiones de sus aplicaciones mediante una capa de seguridad SSL/TLS sin preocuparse de nada más que eso.

Y lo cierto es que hay problemas de seguridad que son complicados de resolver, como por ejemplo el phishing, ya que parte de la responsabilidad reside en el usuario. Sin embargo, hay determinados problemas que podemos solventar con un poco de previsión.
Por ejemplo, ante la casuística del DNS spoofing podemos defendernos con una comprobación de certificados, si más no, podemos complicar el ataque.

Además, hay un tipo de “ataques” man-in-the-middle que los desarrolladores tienden a olvidar, y es en este tipo en el que me gustaría centrarme hoy. Me refiero a los man-in-the-middle que el propio usuario se realiza así mismo con el objetivo de modificar las peticiones que se envían a través de la red.

Te imaginas poder tener el control de qué Pokémon has capturado en el mediático Pokémon Go?  Vale, quizás le quita algo de sentido al juego, pero no me negaréis que para presumir un ratito estaría bien.

Bien, pues no es el caso de Pokémon Go, pero si el de Tap Tap Reborn, popular juego con varios millones de descargas, y seguro que también el de muchos otros. Casos dónde, de una forma relativamente sencilla, podemos modificar las peticiones HTTP/S que hace la aplicación a sus servidores con tal de actualizar nuestro perfil al gusto: nivel, hitos, recompensas…
Así que ya sabéis, si tenéis curiosidad podéis buscar por la red y fácilmente encontraréis un extenso análisis de las peticiones “en plano” que hace esta aplicación. Incluso si queréis ir más a allá, podéis investigar si vuestras aplicaciones o juegos favoritos hacen llamadas fácilmente manipulables.

Pero… no usábamos SSL/TLS? Es imposible interceptar las peticiones realizadas mediante este canal, verdad? Nada más lejos de la realidad.
Hoy en día resulta trivial interceptar éste tipo de tráfico tanto en iOS como en Android.

Entonces, cómo podemos evitar este tipo de ataques, os preguntaréis.
Veamos tres de las alternativas que tenemos, de menor a mayor grado de complejidad. Pero antes de entrar en cómo prevenir este tipo de ataques es importante conocer el concepto de ofuscación el cuál será fundamental durante la aplicación de las técnicas que veremos a continuación.

  1. Añadir un campo hash en tus peticiones con el resultado de aplicar una función de hash al cuerpo de tu petición. De éste modo serás capaz de comprobar, desde el servidor, si la petición que te llega ha sido modificada. Para aplicar esta técnica resulta fundamental que la clave secreta que sea usada para la generación del hash esté ofuscada ya que sino la aplicación de esta técnica carecerá de sentido.
  2. Enviar tus peticiones completamente cifradas de un modo similar a la técnica anterior pero cifrando toda la petición. Esto llevará la seguridad de tus peticiones un paso más a allá y aún complicará más la tarea del atacante. Sin embargo, a pesar de la ofuscación, no podemos afirmar que sea imposible aplicar técnicas de reverse engineering y conseguir extraer la clave secreta usada para el cifrado de la petición.
  3. Incorporar la técnica de certificate pinning en tus aplicaciones, cuya aplicación aún complicará más la tarea al atacante. De hecho, si evitamos que nuestra aplicación sea usada en dispositivos rooteados, podemos garantizar, casi con total seguridad, que estaremos bien protegidos.

Como podéis imaginar, la aplicación de cada una de éstas técnicas puede variar mucho en función del entorno en el que nos encontremos. Por eso, lo ideal es profundizar en la aplicación de la técnica que queramos usar con las tecnologías de nuestro entorno. Por ejemplo, si vamos a desarrollar una aplicación móvil para Android, deberemos tener un buen conocimiento del estado del arte de la ofuscación en Android.

En mi caso me voy a centrar en la implementación del certificate pinning, técnica que podríamos considerar la más compleja y robusta de las anteriores. Concretamente me centraré en la implementación del certificate pinning en entornos Android e iOS.

Sin embargo, para poder realizar dicha implementación, es fundamental tener claros algunos conceptos relacionados con esta técnica. Por eso, os recomiendo encarecidamente que, mientras yo preparo la próxima entrada, os leáis las entradas sobre certificate pinning que están publicadas en el blog de Eleven Paths, dónde seguro que lo explican mejor de lo que yo pudiera hacerlo.

Mobile developers, nos vemos en la próxima entrada con la profundización del certificate pinning. Hasta entonces!