
Framework de exploração BLE para robôs Unitree: injeção de comandos via chaves AES codificadas permite tomada de controle remota, injeção de payloads e propagação do tipo worm.

Autor: Bin4ry aka Andreas Makris [[email protected]]
Coautor: h0stile aka Kevin Finisterre
Contribuidor: legion1581 aka Konstantin Severov da theroboverse ajudou a corrigir o payload para a injeção e provou isso com um PoC totalmente funcional 🙂 valeu cara, essa foi uma contribuição crítica, muito apreciada!
Data: 20 de setembro de 2025
CVE-2025-35027
CVE-2025-60017
CVE-2025-60250
CVE-2025-60251
A pesquisa deste repositório está incorporada em um artigo que apresenta uma avaliação sistemática de segurança do Unitree G1. O impacto da pesquisa, no entanto, NÃO se limita apenas ao G1, mas a toda a linha de produtos Unitree a partir da série Go2. O código nos robôs Unitree mais novos parece ser um fork do codebase do Go2, o que especificamente torna a linhagem Go1 e outros robôs Unitree anteriores ao Go2 não vulneráveis. Todas as variantes modernas são, no entanto, afetadas neste momento. A Unitree ainda não divulgou um aviso esclarecendo o impacto exato em toda a linha de produtos.
Link para o artigo: https://arxiv.org/abs/2509.14139
Título: Cybersecurity AI: Humanoid Robots as Attack Vectors
Autores: 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},
}
* [Análise de Injeção de Comandos no Serviço BLE do Robô Unitree](#unitree-robot-ble-service-command-injection-analysis)
* [Visão Geral](#overview)
* [Descoberta de Serviços BLE](#ble-service-discovery)
* [Engenharia Reversa do Protocolo](#reverse-engineering-the-protocol)
* [Instrução 1: O Handshake "Seguro"](#instruction-1-the-secure-handshake)
* [Instrução 2: Obter Número de Série](#instruction-2-get-serial-number)
* [Instrução 3: Inicializar Modo WiFi](#instruction-3-initialize-wifi-mode)
* [Instrução 4: Definir SSID](#instruction-4-set-ssid)
* [Instrução 5: Definir Senha](#instruction-5-set-password)
* [Instrução 6: Definir Código do País (O Gatilho!)](#instruction-6-set-country-code-the-trigger)
* [A Thread de Configuração WiFi](#the-wifi-setting-thread)
* [A Função Vulnerável: Injeção de Comandos](#the-vulnerable-function-command-injection)
* [Resumo do Fluxo de Ataque](#attack-flow-summary)
* [A Ameaça do Tipo Worm](#the-wormable-threat)
* [Prova de Conceito](#proof-of-concept)
* [Implantação no Mundo Real & Impacto](#real-world-deployment--impact)
* [Implantações Atuais](#current-deployments)
* [Avaliação de Impacto](#impact-assessment)
* [Impacto na Aplicação da Lei & Militar](#law-enforcement--military-impact)
* [Ambientes Corporativos](#corporate-environments)
* [Impacto no Consumidor](#consumer-impact)
* [Propagação do Tipo Worm](#wormable-propagation)
* [Detalhes Técnicos](#technical-details)
* [Arquitetura do Serviço BLE](#ble-service-architecture)
* [Parâmetros Criptográficos](#cryptographic-parameters)
* [Estrutura do Pacote](#packet-structure)
* [Lições Aprendidas](#lessons-learned)
* [Linha do Tempo de Divulgação](#disclosure-timeline)
* [Primeira, e última tentativa de relatar outro problema de segurança em seus robôs emblemáticos G1, Go2 e outros robôs](#first-and-last-attempt-to-report-another-security-issue-in-your-flagship-g1-and-go2-and-other-bots)
* [Aviso Legal](#disclaimer)
* [Um Padrão de Problemas de Segurança](#a-pattern-of-security-issues)
* [Conclusão](#conclusion)
* [Nota Legal](#legal-notice)
* [Contribuição](#contributing)
* [Licenciamento e acesso a estes arquivos](#licensing-and-access-to-these-files)
---
## Visão Geral
Durante nossa pesquisa de segurança em plataformas robóticas da Unitree, descobrimos uma vulnerabilidade crítica na interface de configuração Wi-Fi via Bluetooth Low Energy (BLE). Esta vulnerabilidade afeta múltiplos modelos de robôs Unitree, incluindo as séries Go2, G1, H1 e B2, até o firmware mais recente de hoje [20 de setembro de 2025].
**🎯 Esta representa o primeiro exploit divulgado publicamente direcionado a robôs humanoides!**
A vulnerabilidade combina múltiplos problemas de segurança: chaves criptográficas fixas (hardcoded), bypass trivial de autenticação e injeção de comandos não sanitizada. O que torna isso particularmente preocupante é que é completamente **do tipo worm** - robôs infectados podem comprometer automaticamente outros robôs no alcance do BLE. Esta vulnerabilidade permite que o atacante assuma completamente o controle do dispositivo.
Publicamos as chaves criptográficas em julho [Link para o Tweet](https://x.com/Bin4ryDigit/status/1950566849072005304), mas a Unitree não se importou.
Vamos mergulhar nos detalhes técnicos de como descobrimos e exploramos esta vulnerabilidade.
## Descoberta de Serviços BLE
O primeiro passo foi identificar os serviços BLE expostos pelos robôs. Todos os modelos Unitree afetados expõem um serviço BLE personalizado para configuração de Wi-Fi:```
Service UUID: 0000ffe0-0000-1000-8000-00805f9b34fb
Write Characteristic: 0000ffe2-0000-1000-8000-00805f9b34fb
Notify Characteristic: 0000ffe1-0000-1000-8000-00805f9b34fb
Por meio de engenharia reversa, descobrimos que o robô implementa um gerenciador de recebimento que processa pacotes BLE criptografados. Aqui está o que encontramos:

O gerenciador de recebimento primeiro descriptografa os pacotes recebidos usando parâmetros AES embutidos no código:```python AES_KEY = "df98b715d5c6ed2b25817b6f2554124a" AES_IV = "2841ae97419c2973296a0d4bdfe19a4f" Mode: AES-CFB128

Após a descriptografia, os pacotes são processados com base nos códigos de instrução em uma estrutura switch-case. Vamos examinar cada instrução:
## Instrução 1: O handshake "seguro"

A "autenticação" do handshake é ridiculamente simples:


Basicamente, o robô verifica se o pacote descriptografado contém a string `"unitree"` como segredo do handshake e, em seguida, define o flag `valid_incoming_user` como 1. Esse é todo o mecanismo de "autenticação"!
## Instrução 2: Obter Número de Série

Esta instrução verifica se o usuário está "autenticado" (ou seja, se o flag está definido) e então lê o arquivo do número de série e o retorna. Isso confirma que temos acesso ao sistema.