
Cliente Python para o protocolo de controle WiFi local da dashcam Thinkware U3000, obtido por engenharia reversa a partir do aplicativo Android oficial. Ferramentas PoC por trás do CVE-2026-101053, CVE-2026-101054 e CVE-2026-101055.
Um cliente Python para o protocolo de controle via WiFi local da dashcam Thinkware U3000, obtido por engenharia reversa a partir do aplicativo Android oficial, confirmado em hardware real, não a partir de qualquer especificação pública (não existe uma).
Este projeto tem dois propósitos: uma biblioteca utilizável para extrair gravações da sua própria dashcam, e material de apoio para uma divulgação de CVE concluída (veja Segurança abaixo).
docs/protocol-reference.md para o detalhamento completo do que é sólido e do que é suposição.confirm=True porque são destrutivos (formatar o cartão SD) ou porque podem desconectar a câmera da rede que você está usando para alcançá-la (set_wifi_mode, connect_to_ap, etc.). Leia a docstring antes de passar confirm=True em qualquer um deles.Sem release no PyPI. Instale diretamente do GitHub:
pip install "u3000py[cli] @ git+https://github.com/turretsec/u3000py.git"
Ou sem a CLI, apenas a biblioteca:
pip install git+https://github.com/turretsec/u3000py.git
Ou fixe em uma release com tag:
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 pela linha de comando, após instalar com o extra [cli]:
u3000py --host 192.168.1.100 info device
u3000py --host 192.168.1.100 files download --latest --category cont_rec
--host é obrigatório em toda invocação, seja como a flag mostrada acima ou via a variável de ambiente U3000PY_HOST, caso você prefira não repeti-la.
Detalhes completos método a método, incluindo quais resultados vieram de testes em hardware real versus quais são suposições fundamentadas pendentes de verificação, estão no documento de referência do protocolo.
PUT_FILE: confirmado permitir gravação arbitrária de arquivos sem autenticação em qualquer caminho absoluto no sistema de arquivos da câmera. Esta é uma das três descobertas de CVE; distribuir um método genérico de gravação em qualquer lugar em uma biblioteca pública entregaria uma ferramenta de ataque pronta para uso. Detalhes completos em 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
Um script de smoke-test independente para a própria CLI está em scripts/smoke_test_cli.py. Ele não faz parte da suíte pytest (ele invoca o comando u3000py real instalado contra uma câmera real) para verificações de sanidade após alterações.
docs/protocol-reference.md: o protocolo completo obtido por engenharia reversa; formato de transmissão, cada comando confirmado, o que ainda não foi verificado e mistérios abertos conhecidos (algumas coisas genuinamente não se comportam como as próprias convenções do protocolo preveriam).Este protocolo não tem autenticação. Três descobertas resultaram desta pesquisa, totalmente documentadas e divulgadas em um repositório separado: disclosure-thinkware-u3000.
PUT_FILE (CVE-2026-101053 (VulDB #410915)), confirmada gravando no diretório /tmp real da câmera. Deliberadamente não exposta por esta biblioteca (veja O que deliberadamente não está aqui acima).LS/GET_FILE (CVE-2026-101054 (VulDB #410916)), sem nenhuma restrição de caminho. O método download() desta biblioteca demonstra a primitiva diretamente, por exemplo cam.download("/tmp/wpa_supplicant.conf") lê o arquivo de configuração WiFi ativo do dispositivo.GET_STATUS "wifi_info" (CVE-2026-101055 (VulDB #410917)). O método get_wifi_info() desta biblioteca demonstra a primitiva diretamente (com a senha ocultada por padrão em qualquer saída impressa, veja o repr() de WifiInfo).A Thinkware foi notificada em 2026-06-21. A janela de divulgação de 30 dias encerrou em 2026-07-21 com apenas uma confirmação de recebimento não técnica e nenhuma confirmação de correção. Todas as três descobertas permanecem reproduzíveis no firmware de produção atual. Pesquisa anterior relacionada em um modelo diferente da Thinkware (F800 Pro) por geo-chen é referenciada no repositório de divulgação para contexto.
MIT, veja LICENSE.