
Framework d'exploitation BLE pour robots Unitree : l'injection de commandes via des clés AES codées en dur permet la prise de contrôle à distance, l'injection de payload et la propagation de type ver.

Auteur: Bin4ry aka Andreas Makris [[email protected]]
Co-auteur: h0stile aka Kevin Finisterre
Contributeur: legion1581 aka Konstantin Severov de theroboverse a aidé à corriger le payload de l'injection et l'a prouvé avec un PoC entièrement fonctionnel 🙂 merci mec, ce fut une contribution cruciale, vraiment très appréciée !
Date: 20 septembre 2025
CVE-2025-35027
CVE-2025-60017
CVE-2025-60250
CVE-2025-60251
Les recherches de ce dépôt sont intégrées dans un article qui présente une évaluation systématique de la sécurité du Unitree G1. L'impact des recherches n'est cependant PAS limité au seul G1, mais concerne toute la gamme de produits Unitree à partir de la série Go2. Le code des robots Unitree plus récents semble être un fork du codebase Go2, ce qui rend précisément la lignée Go1 et les autres robots Unitree antérieurs au Go2 non vulnérables. Toutes les variantes modernes sont cependant impactées à l'heure actuelle. Unitree n'a pas encore publié d'advisory clarifiant l'impact exact sur l'ensemble de la gamme.
Lien vers l'article: https://arxiv.org/abs/2509.14139
Titre: Cybersecurity AI: Humanoid Robots as Attack Vectors
Auteurs: Víctor Mayoral-Vilches, Andreas Makris, Kevin Finisterre```bibtex
@misc{mayoralvilches2025cybersecurityaihumanoidrobots,
title={Cybersecurity AI: Humanoid Robots as Attack Vectors},
author={Víctor Mayoral-Vilches and Andreas Makris and Kevin Finisterre},
year={2025},
eprint={2509.14139},
archivePrefix={arXiv},
primaryClass={cs.CR},
url={https://arxiv.org/abs/2509.14139},
}
Table des matières
=================
* [Analyse de l'injection de commandes dans le service BLE du robot Unitree](#unitree-robot-ble-service-command-injection-analysis)
* [Aperçu](#overview)
* [Découverte du service BLE](#ble-service-discovery)
* [Rétro-ingénierie du protocole](#reverse-engineering-the-protocol)
* [Instruction 1 : La poignée de main "sécurisée"](#instruction-1-the-secure-handshake)
* [Instruction 2 : Obtenir le numéro de série](#instruction-2-get-serial-number)
* [Instruction 3 : Initialiser le mode WiFi](#instruction-3-initialize-wifi-mode)
* [Instruction 4 : Définir le SSID](#instruction-4-set-ssid)
* [Instruction 5 : Définir le mot de passe](#instruction-5-set-password)
* [Instruction 6 : Définir le code pays (le déclencheur !)](#instruction-6-set-country-code-the-trigger)
* [Le thread de configuration WiFi](#the-wifi-setting-thread)
* [La fonction vulnérable : injection de commandes](#the-vulnerable-function-command-injection)
* [Résumé du déroulement de l'attaque](#attack-flow-summary)
* [La menace auto-propagée](#the-wormable-threat)
* [Preuve de concept](#proof-of-concept)
* [Déploiement réel & impact](#real-world-deployment--impact)
* [Déploiements actuels](#current-deployments)
* [Évaluation de l'impact](#impact-assessment)
* [Impact sur les forces de l'ordre & l'armée](#law-enforcement--military-impact)
* [Environnements d'entreprise](#corporate-environments)
* [Impact sur les consommateurs](#consumer-impact)
* [Propagation auto-propagée](#wormable-propagation)
* [Détails techniques](#technical-details)
* [Architecture du service BLE](#ble-service-architecture)
* [Paramètres cryptographiques](#cryptographic-parameters)
* [Structure des paquets](#packet-structure)
* [Enseignements tirés](#lessons-learned)
* [Chronologie de la divulgation](#disclosure-timeline)
* [Première et dernière tentative de signaler un autre problème de sécurité dans vos robots phares G1, Go2 et autres robots](#first-and-last-attempt-to-report-another-security-issue-in-your-flagship-g1-and-go2-and-other-bots)
* [Avertissement](#disclaimer)
* [Un schéma récurrent de problèmes de sécurité](#a-pattern-of-security-issues)
* [Conclusion](#conclusion)
* [Mention légale](#legal-notice)
* [Contribution](#contributing)
* [Licence et accès à ces fichiers](#licensing-and-access-to-these-files)
---
## Aperçu
Au cours de nos recherches en sécurité sur les plateformes robotiques Unitree, nous avons découvert une vulnérabilité critique dans l'interface de configuration Wi-Fi Bluetooth Low Energy (BLE). Cette vulnérabilité affecte plusieurs modèles de robots Unitree, notamment les séries Go2, G1, H1 et B2, jusqu'au dernier firmware en date [20 septembre 2025].
**🎯 Il s'agit du premier exploit divulgué publiquement ciblant les robots humanoïdes !**
La vulnérabilité combine plusieurs problèmes de sécurité : des clés cryptographiques codées en dur, un contournement trivial de l'authentification et une injection de commandes non assainie. Ce qui rend cela particulièrement préoccupant, c'est qu'il est totalement **auto-propagateur** — les robots infectés peuvent automatiquement compromettre d'autres robots à portée BLE. Cette vulnérabilité permet à l'attaquant de prendre entièrement le contrôle de l'appareil.
Nous avons publié les clés cryptographiques en juillet [Lien vers le tweet](https://x.com/Bin4ryDigit/status/1950566849072005304) mais Unitree n'en a pas tenu compte.
Plongeons dans les détails techniques de la façon dont nous avons découvert et exploité cette vulnérabilité.
## Découverte du service BLE
La première étape consistait à identifier les services BLE exposés par les robots. Tous les modèles Unitree concernés exposent un service BLE personnalisé pour la configuration Wi-Fi :```
Service UUID: 0000ffe0-0000-1000-8000-00805f9b34fb
Write Characteristic: 0000ffe2-0000-1000-8000-00805f9b34fb
Notify Characteristic: 0000ffe1-0000-1000-8000-00805f9b34fb
Grâce à la rétro-ingénierie, nous avons découvert que le robot implémente un gestionnaire de réception qui traite les paquets BLE chiffrés. Voici ce que nous avons trouvé :

Le gestionnaire de réception déchiffre d'abord les paquets entrants à l'aide de paramètres AES codés en dur :```python AES_KEY = "df98b715d5c6ed2b25817b6f2554124a" AES_IV = "2841ae97419c2973296a0d4bdfe19a4f" Mode: AES-CFB128

Après déchiffrement, les paquets sont traités en fonction des codes d'instruction dans une structure switch-case. Examinons chaque instruction :
## Instruction 1 : le handshake « sécurisé »

L'« authentification » du handshake est ridiculement simple :


En gros, le robot vérifie si le paquet déchiffré contient la chaîne `"unitree"` comme secret du handshake, puis passe le flag `valid_incoming_user` à 1. C'est tout le mécanisme d'« authentification » !
## Instruction 2 : obtenir le numéro de série