- Compró una cámara Tapo para observar a su perro en casa, pero inesperadamente terminó haciendo ingeniería inversa de cómo funcionan los dispositivos y la app de TP-Link
- Para analizar el proceso de onboarding y la estructura de la comunicación API cifrada, usó varias técnicas como MITM, descompilación de APK y generación de scripts de descifrado
- Al descubrir la contraseña inicial de administrador y el proceso de derivación de claves de sesión, logró descifrar mensajes cifrados e identificar problemas de sincronización poco confiable entre el dispositivo y la cuenta en la nube
- Tras analizar el flujo completo de onboarding, automatizó con scripts de Bash las llamadas API clave, la creación de cuentas, el cambio de contraseña y la conexión Wi‑Fi
- Señala fallas en el diseño de seguridad del firmware de Tapo, una implementación de cifrado poco sofisticada y sincronización irregular de cuentas, rasgos típicos de dispositivos IoT de bajo costo
Resumen del proyecto
- El autor compró y usó una cámara Tapo económica para observar a su perro dentro de casa
- Durante el uso, la incomodidad de la configuración y la falta de información en línea lo motivaron a investigar a fondo cómo funcionaba el producto
- Surgieron problemas inesperados al integrarla con frigate y al activar 2way audio, lo que despertó su interés por un método de onboarding directo sin integración con la nube
Análisis de la estructura de onboarding y autenticación
- Para analizar el procedimiento de conexión de la cámara Tapo, interceptó el tráfico entre la app y la cámara usando MITM proxy y la herramienta de hooking dinámico frida
- Como las apps recientes incluyen resistencia a este tipo de análisis, como ignorar proxies y usar certificate pinning, este enfoque con herramientas dinámicas resultó efectivo
- Después de configurar esta evasión, pudo confirmar con precisión el proceso de login de la cuenta de administrador predeterminada dentro del flujo de onboarding de la cámara
- Descubrió que la API de login predeterminada funciona con una contraseña base propia del dispositivo, separada de la contraseña de la cuenta en la nube
Estructura de cifrado y búsqueda de la contraseña predeterminada
- Mediante descompilación del APK (usando JADX) y análisis de código, obtuvo la contraseña predeterminada de la cuenta
admin(TPL075526460603) - Confirmó que, incluso si se cambia la contraseña de la nube, las cámaras ya vinculadas no detectan el cambio, lo que evidencia una sincronización imprecisa de contraseñas entre la app y la cámara
- Como ya conocía la contraseña predeterminada, implementó la lógica de derivación de claves de sesión (
lsk,ivb) y pudo descifrar en tiempo real los mensajes cifrados de la API
Scripting con mitmproxy y análisis de la API
- Tomando como referencia el proyecto open source PyTapo, analizó con precisión el flujo de API del procedimiento real de onboarding de Tapo
- Con el script
tapo_decrypt_pretty.pylogró:- detectar el handshake de login
- extraer las claves de sesión
- descifrar la API cifrada y mostrarla de forma legible, además de guardar el JSON
- De todas las llamadas API del onboarding completo, extrajo solo los procesos principales relevantes para crear un flujo de automatización
- consulta de lista Wi‑Fi (
scanApList) - activación de cuentas RTSP/ONVIF
- cambio de contraseña de administrador
- conexión Wi‑Fi
- consulta de lista Wi‑Fi (
Automatización y resultados
- Configuró un script de Bash (
tapo_onboard.sh) para ejecutar automáticamente todo el proceso de onboarding anterior- login inicial con admin predeterminado
- selección y conexión a Wi‑Fi
- eliminación del logo en el feed de la cámara
- habilitación de RTSP/ONVIF
- restablecimiento de la contraseña de administrador
- En la estructura del firmware de la cámara encontró las siguientes características y debilidades
- algunas APIs usan hash SHA-256, pero otras mantienen esquemas antiguos como MD5
- existen 2 claves públicas, y no está claro en qué situaciones debe usarse cada una
- la sincronización de contraseñas entre la app y el dispositivo es muy inestable
Conclusión e impresiones
- La estructura de seguridad del firmware y de la API de la cámara Tapo da la impresión de ser improvisada y poco refinada
- Fue una experiencia indirecta de las debilidades de seguridad de los dispositivos IoT económicos y de la realidad de sus sistemas de onboarding incompletos
- Sí logró el objetivo final del proyecto, que era revisar a su perro, y confirmó que normalmente duerme en el sofá o en la cama
2 comentarios
Parece que el CVE-2022-37255 tiene una puntuación de 7.5.
Comentarios en Hacker News
Me sorprendió ver que usaron mi script de Frida; se puede revisar aquí. Me alegra que parezca funcionar bien en un entorno real, y me gustaría saber si le agregaron o modificaron algo.
Como referencia, para usar audio bidireccional en frigate hay que aplicar la configuración
tapo://de go2rtc al stream principal en lugar del típicortsp://. TP-Link solo ofrece audio bidireccional a través de su propia API. El problema es que con esa configuración ONVIF (control de paneo/inclinación de la cámara con herramientas open source) deja de funcionar, así que resulta incómodo. Si quieres usar ambas funciones, necesitas un flujo bastante agresivo de: detener la lectura del streamtapo://→ ejecutar el cliente ONVIF/ajustar paneo e inclinación → cerrar ONVIF → reiniciartapo://.Creo que la seguridad de IoT en general es un desastre, y me preocupa especialmente que los routers de consumo sean cajas negras no auditables por donde pasa todo el tráfico de red. Mucha gente ni siquiera sabe que el firmware de su router no se actualiza desde hace años y que ya existen vulnerabilidades conocidas. Me parece que el modelo de confianza de la cadena de suministro del hardware de red está completamente roto.
Me pareció que esta entrada de blog está excepcionalmente bien escrita. Hoy en día muchos textos de este estilo son generados por LLM y resultan incómodos de leer, pero este logra muy bien el equilibrio entre lo técnico y lo ameno. (Sé que la imagen de portada fue generada con IA, pero me parece irrelevante para la esencia del texto).
Me pregunto si se podrá seguir usando herramientas como Frida o mitmproxy con apps de Android, y qué pasará el próximo año cuando entren en vigor los requisitos de firma.
Como referencia, hay casos relacionados como The Tapo C200 Research Project y PyTapo: librería de Python para cámaras Tapo.
Otro material relacionado: (descifrado de firmware de TP-Link y análisis del bootloader de la cámara en la nube C210 V2) está aquí.
Sospecho que la razón por la que el perro del OP se mueve de la cama al piso podría ser simplemente que se enciende la calefacción (radiador). Parece que harían falta más datos de sensores.
Siento que ya llegamos al punto en que encontrar una contraseña de administrador hardcodeada ya ni sorprende.
Quisiera una referencia que resuma qué modelos de cámaras tapo soportan RTSP. La c210 funciona más o menos bien para mí (aunque no captura en la nube) y la uso integrada con frigate. Hoy compré una c402 (para exterior), pero esa no tiene
camera accounten la configuración avanzada, lo cual me decepcionó. El precio bajo es atractivo, pero siento que falta consistencia entre funciones. Si alguien puede recomendar una buena cámara exterior barata, con soporte para stream RTSP y panel solar, me interesaría.rtsp://, probablemente se pueda usar la fuente de streamtapo://de go2rtc. Dejo como referencia mi configuración de frigate aquí.