- J’ai acheté une caméra Tapo pour observer mon chien à la maison, mais cela m’a finalement amené à expliquer à rebours le fonctionnement des appareils et de l’app TP-Link
- Pour analyser le processus d’onboarding et la structure des communications API chiffrées, diverses techniques ont été utilisées : MITM, décompilation d’APK, création de scripts de déchiffrement, etc.
- La découverte du mot de passe administrateur initial et du processus de dérivation des clés de session a permis de déchiffrer les messages chiffrés et d’identifier un problème de synchronisation peu fiable entre l’appareil et le compte cloud
- L’analyse de l’ensemble du flux d’onboarding a permis d’automatiser en Bash les principaux appels API, la création de compte, le changement de mot de passe, la connexion au Wi‑Fi, etc.
- Le billet pointe les failles de conception de la sécurité du firmware Tapo, une implémentation du chiffrement peu sophistiquée et une synchronisation de compte irrégulière, autant de traits typiques des appareils IoT à bas coût
Aperçu du projet
- L’auteur a acheté et utilisé une caméra Tapo d’entrée de gamme pour surveiller son chien à l’intérieur
- Au fil de l’utilisation, face à une configuration peu pratique et au manque d’informations disponibles en ligne, il a été poussé à creuser en profondeur le fonctionnement du produit
- Des problèmes inattendus sont survenus lors de l’intégration avec frigate et de l’activation du 2way audio, ce qui a éveillé son intérêt pour une méthode d’onboarding direct sans intégration cloud
Analyse de l’onboarding et de la structure d’authentification
- Pour analyser la procédure de connexion de la caméra Tapo, l’auteur a intercepté le trafic entre l’app et la caméra à l’aide d’un proxy MITM et de l’outil de hook dynamique frida
- Les applications récentes ignorent souvent les proxys et utilisent des mécanismes de résistance au contournement comme le certificate pinning, ce qui rend pertinente une approche fondée sur des outils dynamiques
- Une fois ce dispositif de contournement en place, il a pu confirmer précisément le processus de connexion du compte administrateur par défaut dans le flux d’onboarding de la caméra
- Il a découvert que l’API de connexion par défaut fonctionnait avec un mot de passe par défaut propre à l’appareil, distinct du mot de passe du compte cloud
Structure du chiffrement et recherche du mot de passe par défaut
- Grâce à la décompilation de l’APK (avec JADX) et à l’analyse du code, il a récupéré le mot de passe par défaut du compte
admin(TPL075526460603) - Il a constaté que, même après modification du mot de passe cloud, les caméras déjà associées ne détectaient pas le changement, ce qui confirme une synchronisation imparfaite des mots de passe entre l’app et la caméra
- Ayant découvert le mot de passe par défaut, il a implémenté la logique de dérivation des clés de session (
lsk,ivb), rendant possible le déchiffrement en temps réel des messages API chiffrés
Scripts mitmproxy et analyse de l’API
- En s’appuyant sur le projet open source PyTapo, il a analysé avec précision le flux API réel de l’onboarding Tapo
- Le script
tapo_decrypt_pretty.pypermet de :- détecter le handshake de connexion
- extraire les clés de session
- déchiffrer les API chiffrées, produire une sortie plus lisible et enregistrer le JSON
- Parmi l’ensemble des appels API de l’onboarding, seuls les processus significatifs ont été retenus pour créer un workflow automatisé
- récupération de la liste Wi‑Fi (
scanApList) - activation des comptes RTSP/ONVIF
- changement du mot de passe administrateur
- connexion au Wi‑Fi
- récupération de la liste Wi‑Fi (
Automatisation et résultats
- Un script Bash (
tapo_onboard.sh) a été conçu pour exécuter automatiquement l’ensemble de ce processus d’onboarding- connexion admin par défaut
- sélection et connexion au Wi‑Fi
- suppression du logo sur le flux de la caméra
- autorisation de l’usage de RTSP/ONVIF
- réinitialisation du mot de passe administrateur
- En raison de la structure du firmware de la caméra, les caractéristiques et faiblesses suivantes ont été observées
- certaines API utilisent un hachage SHA-256, mais d’autres conservent des mécanismes plus anciens comme MD5
- il existe deux clés publiques, sans qu’il soit clair dans quelles situations utiliser l’une ou l’autre
- la synchronisation des mots de passe entre l’app et l’appareil est très instable
Conclusion et impressions
- La structure de sécurité du firmware et des API de la caméra Tapo donne l’impression d’un assemblage de fortune et d’une conception peu sophistiquée
- Le projet lui a permis d’entrevoir concrètement les failles de sécurité et la réalité d’un système d’onboarding imparfait dans les appareils IoT à bas coût
- Il a finalement atteint son objectif initial, à savoir surveiller son chien, et a surtout constaté que celui-ci dormait la plupart du temps sur le canapé ou le lit
2 commentaires
Le CVE-2022-37255 est noté 7,5.
Avis Hacker News
Je trouve ça amusant que quelqu’un ait utilisé mon script Frida ; il est disponible ici. Je suis content de voir qu’il semble bien fonctionner en conditions réelles, et j’aimerais savoir si quelqu’un y a ajouté ou modifié quelque chose.
Pour info, si vous voulez utiliser l’audio bidirectionnel dans frigate, il faut configurer le flux principal go2rtc avec
tapo://au lieu durtsp://habituel. TP-Link ne fournit l’audio bidirectionnel que via son API propriétaire. Le problème, c’est qu’avec cette configuration, ONVIF (contrôle pan/tilt de la caméra via des outils open source) ne fonctionne plus, ce qui est pénible. Pour avoir les deux, il faut un workflow assez agressif : arrêter la lecture du fluxtapo://→ lancer le client ONVIF / ajuster le pan-tilt → quitter ONVIF → redémarrertapo://.Je pense que la sécurité IoT est globalement catastrophique, et le fait que les routeurs grand public soient des boîtes noires impossibles à auditer qui traitent tout le trafic réseau est particulièrement inquiétant. La plupart des gens ignorent que le firmware de leur routeur n’a pas été mis à jour depuis des années et qu’il contient déjà des vulnérabilités connues. À mon avis, le modèle de confiance de la supply chain du matériel réseau est complètement cassé.
J’ai trouvé ce billet de blog remarquablement bien écrit. De nos jours, beaucoup de textes de ce style sont générés par des LLM et deviennent pénibles à lire, mais celui-ci m’a impressionné par son bon équilibre entre technicité et confort de lecture. (Je sais que l’image de couverture est générée par IA, mais je pense que ça n’a rien à voir avec le fond du texte.)
Je me demande si on pourra continuer à utiliser des outils comme Frida ou mitmproxy avec les apps Android, et ce qu’il se passera l’an prochain quand les exigences de signature entreront en vigueur.
Pour info, parmi les cas liés, il y a The Tapo C200 Research Project et PyTapo: bibliothèque Python pour les caméras Tapo.
Autre ressource connexe : l’analyse du déchiffrement du firmware TP-Link et du bootloader de la caméra cloud C210 V2 est disponible ici.
Je me demande si la raison pour laquelle le chien d’OP passe du lit au sol n’est pas simplement que le radiateur s’allume ; il faudrait sans doute davantage de données de capteurs.
J’ai l’impression qu’on est arrivés à une époque où découvrir un mot de passe administrateur codé en dur n’a plus rien d’exceptionnel.
J’aimerais trouver une référence recensant les modèles de caméras tapo qui prennent en charge RTSP. La c210 fonctionne plutôt correctement (sauf pour les captures cloud) et je l’utilise intégrée à frigate. J’ai acheté aujourd’hui une c402 (extérieur), mais celle-ci n’a pas de compte caméra dans les paramètres avancés, ce qui est dommage. Le prix est attractif, mais je trouve le manque d’uniformité des fonctionnalités frustrant. Si quelqu’un a une bonne caméra extérieure bon marché, avec flux RTSP et panneau solaire, je suis preneur.
rtsp://, il devrait être possible d’utiliser une source de flux go2rtc entapo://. J’ai laissé ma configuration frigate ici à titre de référence.