
Client Python pour le protocole de contrôle WiFi local du dashcam Thinkware U3000, rétro-ingénieré à partir de l'application Android officielle. Outillage PoC derrière CVE-2026-101053, CVE-2026-101054 et CVE-2026-101055.
Un client Python pour le protocole de contrôle WiFi local du tableau de bord Thinkware U3000, rétro-ingénieré à partir de l'application Android officielle, confirmé sur du matériel réel, et non à partir d'une spécification publique (il n'y en a pas).
Ce projet a deux objectifs : une bibliothèque utilisable pour extraire les séquences vidéo de votre propre tableau de bord, et du matériel de support pour une divulgation de CVE complétée (voir Sécurité ci-dessous).
docs/protocol-reference.md pour le détail complet de ce qui est solide et de ce qui est une supposition.confirm=True parce qu'elles sont destructrices (formatage de la carte SD) ou parce qu'elles peuvent déconnecter la caméra du réseau que vous utilisez pour l'atteindre (set_wifi_mode, connect_to_ap, etc.). Lisez la docstring avant de passer confirm=True sur l'une d'elles.Pas de publication PyPI. Installez directement depuis GitHub :
pip install "u3000py[cli] @ git+https://github.com/turretsec/u3000py.git"
Ou sans le CLI, juste la bibliothèque :
pip install git+https://github.com/turretsec/u3000py.git
Ou épinglez à une version taguée :
pip install git+https://github.com/turretsec/[email protected]
from u3000py import ThinkLinkClient, VideoCategory
with ThinkLinkClient("192.168.1.100") as cam: # your camera's actual IP
print(cam.get_device_info())
print(cam.get_system_status())
files = cam.list_files(VideoCategory.CONTINUOUS)
latest = files[-1]
def show_progress(received, total):
print(f"\r{received / total:.0%}", end="")
cam.download(latest.path, dest="latest_clip.mp4", progress=show_progress)
Ou depuis la ligne de commande, une fois installé avec l'extra [cli] :
u3000py --host 192.168.1.100 info device
u3000py --host 192.168.1.100 files download --latest --category cont_rec
--host est requis à chaque invocation, soit via le flag montré ci-dessus, soit via la variable d'environnement U3000PY_HOST si vous préférez ne pas le répéter.
Le détail complet méthode par méthode, y compris quels résultats proviennent de tests sur matériel réel et lesquels sont des suppositions éclairées en attente de vérification, se trouve dans le document de référence du protocole.
PUT_FILE : confirmé comme permettant des écritures de fichiers arbitraires non authentifiées vers n'importe quel chemin absolu du système de fichiers de la caméra. C'est l'une des trois découvertes de CVE ; livrer une méthode générique d'écriture n'importe où dans une bibliothèque publique reviendrait à fournir un outil d'attaque prêt à l'emploi. Détails complets dans disclosure-thinkware-u3000.pip install -e ".[dev]"
pytest -v # unit tests, no camera needed
pytest -m hardware --host 192.168.1.100 # real-camera tests, opt-in only
Un script de smoke-test autonome pour le CLI lui-même se trouve dans scripts/smoke_test_cli.py. Il ne fait pas partie de la suite pytest (il invoque la vraie commande u3000py installée contre une vraie caméra) pour des vérifications de bon fonctionnement après modifications.
docs/protocol-reference.md : le protocole rétro-ingénieré complet ; format de transmission, chaque commande confirmée, ce qui reste non vérifié, et les mystères ouverts connus (quelques choses ne se comportent vraiment pas comme les conventions du protocole lui-même le laisseraient prédire).Ce protocole n'a aucune authentification. Trois découvertes sont issues de cette recherche, entièrement documentées et divulguées dans un dépôt séparé : disclosure-thinkware-u3000.
PUT_FILE (CVE-2026-101053 (VulDB #410915)), confirmée en écrivant dans le vrai répertoire /tmp de la caméra. Délibérément non exposée par cette bibliothèque (voir Ce qui est délibérément absent ci-dessus).LS/GET_FILE (CVE-2026-101054 (VulDB #410916)), sans aucune restriction de chemin. La méthode download() de cette bibliothèque démontre directement la primitive, par ex. cam.download("/tmp/wpa_supplicant.conf") lit le fichier de configuration WiFi actif de l'appareil.GET_STATUS "wifi_info" (CVE-2026-101055 (VulDB #410917)). La méthode get_wifi_info() de cette bibliothèque démontre directement la primitive (avec le mot de passe masqué par défaut dans toute sortie imprimée, voir le repr() de WifiInfo).Thinkware a été notifié le 2026-06-21. La fenêtre de divulgation de 30 jours s'est close le 2026-07-21 avec seulement un accusé de réception non technique et aucune confirmation de correction. Les trois découvertes restent reproductibles sur le firmware de production actuel. Des recherches antérieures connexes sur un autre modèle Thinkware (F800 Pro) par geo-chen sont référencées dans le dépôt de divulgation pour contexte.
MIT, voir LICENSE.