Esta historia empezó hace varios meses, cuando conseguí un tracker para fitness en forma de pulsera de una popular marca. Como se trata de un dispositivo para vestir (wearable device), instalé Android Wear app, una aplicación creada especialmente para dispositivos portátiles. Ésta se conectó sin problemas a la pulsera de fitness.
Pero había algo extraño: el programa se conectó a la pulsera Nike+ Fuel Band SE, y la que yo tenía era de otra marca. No tardé mucho en darme cuenta de que la pulsera Nike pertenecía a mi colega. Y él ni siquiera se percató de que me había conectado a su dispositivo.
Después de lo cual me dieron ganas de hacer una pequeña investigación y verificar cuán segura era mi pulsera.
Pulseras inteligentes: conectadas a tu teléfono
En este momento, hay en el mercado muchas ofertas de brazaletes de otras marcas. Más abajo citamos la estadística de KSN referente a las aplicaciones populares de trabajo con trackers de fitness para Android (los datos de la estadística fueron obtenidos de los equipos de los usuarios de KSN que dieron su consentimiento para transmitirlos).
Distribución de las instalaciones de aplicaciones Android para el trabajo con trackers de fitness de diferentes marcas
A pesar de que esta es una estadística sólo de aplicaciones Android (y no tenemos garantías de que los usuarios posean los dispositivos correspondientes), nos da una visión aproximada de la popularidad de los dispositivos "de vestir".
La mayoría de estas pulseras usa la tecnología Bluetooth LE (también conocida como Bluetooth Smart) para comunicarse con el teléfono. Para nosotros esto significa que la conexión de dispositivos se realiza de una manera diferente a la del Bluetooth común y corriente. No supone ninguna contraseña, porque la mayoría de los dispositivos no tienen ni pantalla, ni teclado.
En estos brazaletes se usa el sistema GATT (Generic Attribute Profile), perfil de atributos genéricos. Es decir, en el dispositivo portátil hay cierto conjunto de servicios y cada servicio tiene un surtido de características. Cada característica contiene un buffer de bytes y una lista de descriptores, cada descriptor contiene un valor, un buffer de bytes.
Como ilustración, tomé un código ya preparado de Android SDK, un ejemplo de aplicación para conectarse a dispositivos Bluetooth LE. No tuve que escribir un renglón de código, simplemente abrí un proyecto existente en Android Studio y pulsé el botón Start.
En la captura de pantalla se observa el resultado de la conexión a mi pulsera mediante esta aplicación. Aquí podemos ver los servicios y sus características. Pero para mi pulsera no es tan simple obtener los datos de las características, porque para hacerlo, aparte de la conexión, hay que pasar la autentificación. Pero con otros dispositivos, logré leer los datos de las características y sus descriptores. Y es muy posible que se trate de los datos del usuario.
Escaneo
Y así, usando el ejemplo de aplicación de Android SDK logré conectarme a algunos dispositivos. Después de lo cual creé mi propia aplicación que buscaba automáticamente dispositivos Bluetooth LE, trataba de conectarse a ellos y obtener su lista de servicios.
Usando esta aplicación, realicé varios escaneos.
- En el metro de Moscú, en dos horas conseguí conectarme a 19 dispositivos: 11 FitBit y 8 Jawbone.
- En un club de fitness en Bellevue, Washington, EE.UU. detecté 25 dispositivos: 20 Fitbit, 1 Nike, 1 Jawbone, 1 Microsoft, 1 Polar y 1 Quans.
- En Cancún (México), en dos horas durante el SAS2015 pude conectarme a 10 trackers de fitnes: 3 Jawbone y 7 FitBit.
En total, en seis horas de escaneo logré conectarme a 54 dispositivos. Y esto habida cuenta de dos serias limitaciones:
- A pesar de los 50 metros indicados en las especificaciones, la distancia máxima real de conexión en la mayoría de los casos no supera los seis metros.
- Se supone que no se puede hacer una segunda conexión a un dispositivo que ya está conectado. Es decir, si tu dispositivo está conectado a tu teléfono, nadie podrá conectarse, y hasta será invisible durante el escaneo.
La segunda limitación en principio significa que mientras el dispositivo esté conectado al smartphone, no será susceptible a ataques. Pero en realidad, no es así. Y he aquí un ejemplo: usando mi aplicación de escaneo, logré bloquear la comunicación entre mi pulsera y la aplicación oficial, a pesar de que estaban conectadas mutuamente.
Tomando en consideración el segundo punto de las limitaciones mencionadas, podemos suponer que los dispositivos que detecté no se habían conectado nunca a un teléfono o que la pulsera no estaba conectada al Smartphone durante el escaneo (Bluetooth estaba desactivado en el teléfono). Y también es posible que los dispositivos ya conectados estuvieran disponibles para conectarse a pesar de la limitación supuesta. Fuera como fuere, los delincuentes tienen posibilidades bastante grandes de conectarse a los trackers de fitnes.
Sin embargo, en la mayoría de los casos no sólo es necesario conectarse al dispositivo, sino también pasar la autentificación para obtener acceso a los datos de los usuarios. Veamos cómo se hace la autentificación en mi pulsera.
Proceso de autentificación de mi pulsera
Para autentificar la pulsera con el teléfono, la aplicación oficial usa uno de los cuatro servicios disponibles en la pulsera. Para cada característica de este servicio, la aplicación instala una bandera CharacteristicNotification y de esta manera le indica a la pulsera que quiere recibir notificaciones sobre cualquier modificación que se haga a esta característica. A continuación, la aplicación recibe la lista de descriptores de cada característica e instala la bandera ENABLE_NOTIFICATION_VALUE para decirle a la pulsera que quiere recibir notificaciones sobre cualquier cambio que se haga al descriptor.
Después, una de las características cambia su valor, el buffer de bytes. La aplicación lee este buffer desde el brazalete: el encabezado 200f1f y el masivo de bytes, que llamaremos authBytes.
La aplicación crea un nuevo masivo. Su primera parte será un masivo de constantes contenido en la aplicación y que empieza con 6dc351fd44, la segunda parte del nuevo masivo será authBytes. La aplicación recibe el hash MD5 del nuevo masivo y lo devuelve al dispositivo en la siguiente estructura:
- Encabezado (201210051f)
- MD5
- Byte de verificación
Más adelante la aplicación envía un masivo más al dispositivo, que también está contenido en la aplicación.
Después, la pulsera empieza a vibrar. El usuario sólo tiene que pulsar el botón para que la autentificación concluya.
Para la aplicación oficial, el proceso de autentificación tarda unos 15 segundos. Yo creé una aplicación que sólo necesita 4 segundos para bloquear la pulsera.
Es fácil hacer que el usuario pulse un botón en la pulsera. Sólo hay que insistir lo suficiente, por ejemplo reiniciando el proceso de autentificación muchas veces, hasta que el usuario lo haga. O hasta que no se aleje a más de 6 metros.
Una vez pasada la autentificación, los datos de mi pulsera quedan susceptibles al sniffing. En el presente, los dispositivos de fitness no contienen mucha información que digamos. Como regla, se trata de la cantidad de pasos, las fases del sueño, el pulso durante la última hora o cosas parecidas. Aproximadamente una vez por hora la aplicación envía toda la información de la pulsera a “la nube”.
Después de la autentificación, es fácil ejecutar instrucciones en el dispositivo. Por ejemplo, para cambiar la fecha y hora, hay que enviar al dispositivo un masivo de bytes que empiece por f0020c, y después la fecha en el formato YYYY MM DD DW HH MM SS.
En los otros trackers de fitness es aún más sencillo: para algunos, una parte de los datos está disponible inmediatamente después de la conexión, y el código de la aplicación no está enmarañado y es muy fácil de leer (los resultados de una investigación se pueden ver aquí).
Conclusión
Como demostraron los resultados de mi pequeña investigación, en algunos casos se puede conectar al dispositivo portátil sin que el usuario se dé cuenta.
Tras hackear mi pulsera, el delincuente no puede obtener acceso a todos los datos del usuario, ya que éstos no se guardan en la pulsera o teléfono, sino que la aplicación oficial los envía con cierta regularidad a la “nube”.
Los trackers de fitness se están haciendo cada vez más populares y funcionales. Es probable que en un futuro muy cercano contengan muchos más sensores y, por lo tanto, mucha más información del usuario, con frecuencia de carácter médico. Y a pesar de esto, provocan la impresión de que sus creadores no piensan en su seguridad.
Basta imaginarse que si se hackea una pulsera con un sensor de pulso cardiaco, el dueño de la tienda donde se encuentre el usuario puede hacer un seguimiento de la frecuencia de su pulso, mientras este observa las rebajas. De la misma forma se puede averiguar la reacción de las personas ante una publicidad. Es más, una pulsera hackeada con sensor de pulso se puede usar como un detector de mentiras.
Por supuesto, son posibles otros actos maliciosos, por ejemplo, el uso de malware del tipo Trojan-Ransom. El delincuente puede interceptar el control de tu pulsera y hacer que vibre todo el tiempo. Y pedirte dinero por hacer que cese la vibración.
Hemos informado de nuestros descubrimientos al fabricante de mi pulsera. La compañía nos ha respondido definiéndolos como un error de UX, y no como un problema de seguridad. Por razones éticas y de seguridad, no haremos público el nombre y modelo de la pulsera por esta vez. Si sientes preocupación por los posibles usos incorrectos de las brechas de seguridad descubiertas, no dudes en ponerte en contacto con el fabricante de tu pulsera y preguntarle si el método descubierto en este artículo afecta al producto que usas.
También esperamos que este artículo no sólo sea útil para los usuarios, sino también para que los fabricantes de pulseras las hagan más seguras desde el punto de vista informático.
Cómo hackeé mi propia pulsera de fitness
Ramon Garcia De la rosa
Muy bueno el articulo.
Muchas garcías por la información.
Yo quiero realizar algo parecido pero legal 🙂
leer distintas pulseras para captura datos de personas con su autorización
mandarlos a un servidor para analizara y generar informes de estado.
yo no soy programador intentare captura los datos desde un arduino con un BT4.0
Alejandro
Ayuda tengo una pulsera con bluethooth y quiero conectar el bluethoth de la pulsera con una app que yo tengo para que me lea el pulso que registra mi pulsera ya tiene una app predefinida que registra el pulso pero yo quiero hacer la mia pero no tengo idea de como conectarla y que ademas registre el pulso se podria hacer la app?