Investigadores repartidos entre Italia y el Reino Unido han publicado recientemente un artículo sobre las inseguridades criptográficas que han encontrado en una conocida bombilla inteligente.
Los investigadores parecen haber elegido su dispositivo objetivo, la TP-Link Tapo L530E, por ser “actualmente la más vendida en Amazon Italia”, así que no sabemos cómo se comportan otras bombillas inteligentes, pero su informe tiene mucho que enseñarnos en cualquier caso.
Los investigadores dicen que:
Nos pusimos en contacto diligentemente con TP-Link a través de su Programa de Investigación de Vulnerabilidades (VRP), informando de las cuatro vulnerabilidades que encontramos.
Reconocieron todas ellas y nos informaron de que habían empezado a trabajar en correcciones tanto a nivel de la aplicación como del firmware de la bombilla y que planeaban publicarlas a su debido tiempo.
Para bien o para mal (los autores del artículo no dicen si se acordaron fechas de divulgación con TP-Link, así que no sabemos cuánto tiempo lleva la empresa trabajando en sus parches), los investigadores han revelado ahora cómo funcionan sus ataques, aunque sin proporcionar ningún código de ataque copiable para que los aspirantes a ciberdelincuentes lo exploten a su antojo.
Por tanto, pensamos que merecía la pena examinar el documento.
Configuración inalámbrica
Como muchos de los llamados dispositivos “inteligentes”, el Tapo L530E está diseñado para que pueda configurarse rápida y fácilmente mediante Wi-Fi.
Aunque la configuración inalámbrica es habitual incluso en dispositivos alimentados por batería que pueden cargarse y configurarse mediante puertos USB integrados, como cámaras y accesorios para bicicletas, las bombillas no suelen tener puertos USB, entre otras cosas por razones de espacio y seguridad, ya que están diseñadas para enchufarse y dejarse en una toma de corriente.
Encendiendo y apagando repetidamente una bombilla Tapo L530E en el interruptor de la pared durante un segundo cada vez, puedes forzarla a entrar en el modo de configuración (al parecer, la bombilla parpadea automáticamente tres veces para indicarte cuándo está lista para la configuración).
Como la mayoría de los dispositivos configurables automáticamente, esto hace que la bombilla inteligente se convierta en un punto de acceso Wi-Fi con un nombre de red fácil de reconocer: Bulb Tapo XXXX, donde las X forman una cadena de dígitos.
Luego te conectas a ese punto de acceso temporal, que no está protegido por contraseña, desde una aplicación de tu smartphone.
A continuación, le indicas a la bombilla cómo conectarse en el futuro tanto a tu red Wi-Fi doméstica protegida por contraseña como a tu cuenta TP-Link en la nube, tras lo cual el firmware de la bombilla puede reiniciarse y conectarse a Internet, permitiéndote gestionarla desde la aplicación de tu teléfono.
La bombilla puede unirse a la red doméstica, lo que significa que puedes contactar con ella directamente a través de tu propia Wi-Fi cuando estés en casa, aunque tu ISP esté desconectado en ese momento.
Y la bombilla puede conectarse a través de Internet a tu cuenta en la nube, por lo que también puedes enviarle órdenes indirectamente a través de tu cuenta en la nube mientras estás de viaje, por ejemplo para encender y apagar las luces si tardas en volver para dar la impresión de que hay alguien en casa.
Cuidado con los impostores
Probablemente puedas adivinar cómo sigue esto.
Si la aplicación de tu teléfono no tiene ninguna forma criptográficamente sólida de averiguar que realmente se ha conectado a una bombilla auténtica cuando realizas el proceso de configuración, entonces un atacante cercano que pusiera en marcha un punto de acceso Tapo Bulb XXXX falso en el momento adecuado podría engañarte para que enviaras esos importantes secretos de configuración a su dispositivo “bombilla impostora” en lugar de a la auténtica, capturando así tanto tu contraseña Wi-Fi como los datos de tu cuenta TP-Link.
La buena noticia es que los investigadores se dieron cuenta de que tanto la aplicación Tapo como el firmware de la L530E incluían una comprobación de seguridad básica para ayudar a la aplicación y a tus bombillas a encontrarse mutuamente de forma fiable, reduciendo así el riesgo de que la aplicación soltara tus contraseñas cuando no debía.
Pero la mala noticia es que el protocolo utilizado para este intercambio de ¿eres realmente una bombilla? se diseñó claramente para evitar errores más que para prevenir ataques.
En pocas palabras, la aplicación localiza las bombillas de su red enviando paquetes UDP especiales al puerto 20002 y viendo qué dispositivos responden, si es que lo hacen.
Para ayudar a las bombillas que estén escuchando a decidir si la solicitud “¿Estás ahí?” procede de la aplicación Tapo, y no de otro producto o servicio desconocido que casualmente también utiliza el puerto 20002, la solicitud incluye lo que se conoce como un hash con clave.
La respuesta “¡Estoy aquí!” de la bombilla incluye el mismo tipo de suma de comprobación para ayudar a la aplicación a filtrar respuestas UDP inesperadas y no deseadas.
En pocas palabras, el hash con clave es una suma de comprobación basada no solo en los datos del paquete UDP, sino también en algunos bytes clave adicionales que se incluyen en la suma de comprobación.
Por desgracia, el protocolo Tapo utiliza bytes clave fijos para su suma de comprobación, con la misma “clave” en la aplicación y en el firmware de cada bombilla Tapo.
En otras palabras, una vez que alguien ha descompilado la aplicación o el firmware de la bombilla, o ambos, y ha recuperado esta “clave”, debes suponer que cualquiera sabrá cuál es, lo que hace que los mensajes “¿estás ahí? /¡estoy aquí! sean fáciles de falsificar.
Peor aún, los investigadores descubrieron que no necesitaban descompilar nada, porque esta “clave” no tan secreta solo tiene 32 bits de longitud, lo que significa que si pones tu propia bombilla Tapo en modo de configuración y luego le envías mensajes de ¿estás ahí? utilizando las 232 claves de suma de comprobación posibles, al final darás con la clave correcta en lo que se conoce como ataque de fuerza bruta.
Es el equivalente criptográfico de girar los diales para probar todas las combinaciones de un candado de bicicleta, por ejemplo, de 000 a 999, hasta que tengas suerte y el candado se abra. (Por término medio, abrirás el candado tras probar la mitad de las combinaciones posibles, pero nunca te llevará más de 1000 intentos).
De hecho, no necesitaron enviar 232 mensajes desde la aplicación a una bombilla para descifrar la llave.
Al capturar un solo mensaje conocido y auténtico con un hash válido, podían probar todas las claves posibles sin conexión hasta que produjeran un mensaje con el mismo hash que el que habían guardado.
Esto significa que el ataque de fuerza bruta podía realizarse a la velocidad de la CPU, no sólo a la velocidad de los paquetes de la red Wi-Fi, y los investigadores afirman que “en nuestra configuración, el ataque de fuerza bruta siempre tuvo éxito en una media de 140 minutos”.
(Suponemos que lo intentaron repetidamente solo para comprobar que su código de descifrado funcionaba correctamente, aunque con una clave compartida por todas las bombillas Tapo, solo con su primer descifrado habría bastado).
Mientras hables con seguridad, me da igual quién seas
El siguiente problema criptográfico apareció en la siguiente fase del proceso de configuración de la bombilla, y fue un tipo de error similar.
Tras aceptar una bombilla como auténtica basándose en una clave-que-no-tiene-una-clave-verdadera, la aplicación acuerda una clave de sesión para cifrar su tráfico con la bombilla “auténtica”, pero, una vez más, no tiene forma de comprobar si la bombilla es auténtica o una impostora.
Acordar una clave de sesión es importante, porque garantiza que nadie más en la red pueda espiar las contraseñas Wi-Fi y de Tapo cuando se envíen posteriormente desde la aplicación Tapo a lo que cree que es una bombilla Tapo.
Pero no tener un proceso de verificación para el propio acuerdo de claves es un poco como conectarse a un sitio web a través de HTTPS, y luego no molestarse en realizar ni siquiera la comprobación más básica del certificado web que envía de vuelta: tu tráfico será seguro en tránsito, pero sin embargo podría ir directamente a manos de un delincuente.
La aplicación Tapo se identifica ante la bombilla (o lo que cree que es una bombilla) enviándole una clave pública RSA, que el otro extremo utiliza para cifrar una clave AES generada aleatoriamente para proteger los datos intercambiados durante la sesión.
Pero el dispositivo de la bombilla no proporciona ningún tipo de identificación, ni siquiera una suma de comprobación con una clave de 32 bits, a la aplicación Tapo.
Así, la aplicación no tiene más remedio que aceptar la clave de sesión sin saber si procede de una bombilla real o de un dispositivo impostor.
El resultado combinado de estos dos fallos es que un atacante en tu red podría, en primer lugar, convencerte de que su punto de acceso fraudulento es una bombilla auténtica a la espera de ser configurada, y así atraerte al lugar equivocado, y luego convencerte de que le envíes una copia cifrada de tus propias contraseñas Wi-Fi y de Tapo.
Irónicamente, esas contraseñas filtradas serían realmente seguras contra todo el mundo… excepto contra el impostor con el punto de acceso falso.
Número-usado-una-vez que se utiliza una y otra vez
Por desgracia, hay más.
Cuando decíamos más arriba que “esas contraseñas filtradas serían realmente seguras”, no era del todo correcto.
La clave de sesión que se establece durante el proceso de acuerdo de claves que hemos descrito antes no se gestiona correctamente, porque los programadores cometieron un error al utilizar AES.
Cuando la aplicación cifra cada solicitud que envía a una bombilla, utiliza un modo de cifrado llamado AES-128-CBC.
No vamos a explicar aquí el CBC (encadenamiento de bloques cifrados), pero sólo mencionaremos que el modo CBC está diseñado para que, si cifras el mismo fragmento de datos más de una vez (como las solicitudes repetidas de encender y apagar la luz, en las que los datos brutos de la solicitud son los mismos cada vez), no obtengas siempre el mismo resultado.
Si todas las solicitudes de encendido y apagado de la luz fueran idénticas, una vez que un atacante hubiera adivinado cómo era un paquete de apagado, no solo podría reconocer esos paquetes en el futuro sin descifrarlos, sino que también podría reproducir esos mismos paquetes sin necesidad de saber cómo cifrarlos.
En efecto, el cifrado basado en CBC se basa en “sembrar” el proceso de cifrado de cada fragmento de datos mezclando primero un bloque de datos único, elegido al azar, en el proceso de cifrado, creando así una secuencia única de datos cifrados en el resto del fragmento.
Estos datos “semilla” se conocen en la jerga como IV, abreviatura de vector de inicialización, y aunque no se pretende que sean secretos, tienen que ser impredeciblemente diferentes cada vez.
En pocas palabras: misma clave + IV único = salida de texto cifrado única, pero misma clave + mismo IV = cifrado predecible.
Por desgracia, los codificadores de TP-Link generaron un IV al mismo tiempo que creaban su clave de sesión AES, y luego utilizaron el mismo IV una y otra vez para cada paquete de datos posterior, incluso cuando los datos anteriores se repetían exactamente.
Eso es un no-no criptográfico.
¿Envié seis paquetes o solo cinco?
El último problema criptográfico que encontraron los investigadores es uno que podría seguir perjudicando a la seguridad aunque se solucionara el problema del vector de inicialización, a saber, que los mensajes antiguos, tanto si un atacante sabe lo que significan como si no, pueden reproducirse más tarde como si fueran nuevos.
Normalmente, este tipo de ataque de repetición se maneja en los protocolos criptográficos mediante algún tipo de número de secuencia, o marca de tiempo, o ambos, que se incluye en cada paquete de datos para limitar su validez.
Al igual que la fecha de un billete de tren que te delatará si intentas utilizarlo dos días seguidos, aunque el billete en sí nunca sea cancelado por una máquina expendedora de billetes ni perforado por un revisor, los números de secuencia y las marcas de tiempo de los paquetes de datos tienen dos finalidades importantes.
En primer lugar, los atacantes no pueden grabar el tráfico hoy y reproducirlo fácilmente más tarde y crear potencialmente el caos.
En segundo lugar, el código defectuoso que envía peticiones repetidamente por error, por ejemplo debido a respuestas caídas o a la falta de acuses de recibo de la red, puede detectarse y controlarse con fiabilidad.
¿Qué hacer?
Si eres usuario de la bombilla Tapo, mantente atento a las actualizaciones de firmware de TP-Link que solucionen estos problemas.
Si eres un programador responsable de asegurar el tráfico de red y la configuración de productos basados en red, lee el documento de investigación para asegurarte de que no has cometido errores similares.
Recuerda las siguientes reglas:
- La criptografía no es solo una cuestión de guardar secretos.. El cifrado es sólo una parte de la “santísima trinidad” criptológica de la confidencialidad (cifrarlo), la autenticidad (verificar quién está al otro lado) y la integridad (asegurarse de que nadie lo ha manipulado por el camino).
- Asegúrate de que las claves de un solo uso o los IVs son realmente únicos. El término nonce, utilizado en la jerga común para este tipo de datos, es la abreviatura de número utilizado una vez, una palabra que te recuerda claramente que los IVs nunca deben reutilizarse.
- Proteger contra los ataques de repetición. Éste es un aspecto especial de la garantía de autenticidad e integridad que hemos mencionado antes. Un atacante no debe ser capaz de capturar una solicitud que estés haciendo ahora y reproducirla ciegamente más tarde sin ser descubierto. Recuerda que un atacante no necesita ser capaz de entender un mensaje si puede reproducirlo y crear potencialmente el caos.