
Tenda Technology Co., Ltd NVR_4H: CH3 v2.1.V27.5.58.6 foi descoberto conter uma chave criptográfica codificada.
ID CNVD: CNVD-2026-25884
Fabricante: Tenda Technology Co., Ltd.
Produto: Gravador de vídeo em rede NVR_4H (versão de hardware CH3V2.1)
Firmware: V27.5.58.6
Classe: CWE-321 — Uso de Chave Criptográfica Embutida em Hardware
O firmware do NVR_4H armazena um par de chaves ECDSA em sua partição somente leitura user-x.squashfs (montada em /opt/app/): a chave privada em /etc/privkey.pem e o certificado autoassinado correspondente em /etc/cacert.pem. Ambos foram gerados uma única vez no momento da compilação e incorporados à imagem, de modo que todo dispositivo executando a versão V27.5.58.6 é distribuído com a mesma chave privada.
A imagem de firmware é um download gratuito do site da Tenda. Qualquer pessoa que a descompacte possui uma chave privada funcional para a interface HTTPS de todos os NVR_4H nessa versão. Um atacante na mesma rede (LAN, Wi-Fi ou um dispositivo exposto à internet) pode posicionar um proxy entre o navegador do administrador e o NVR por meio de ARP spoofing ou envenenamento de DNS, apresentar o certificado genuíno da Tenda com a chave extraída, e o navegador não exibirá nenhum aviso. A sessão completa torna-se então legível e modificável em tempo real: login do administrador, tokens de sessão, credenciais RTSP das câmeras, configuração do dispositivo.
| Arquivo | Descrição |
|---|---|
/etc/privkey.pem | Chave privada EC de 302 bytes (P-256) |
/etc/cacert.pem | Certificado autoassinado de 802 bytes, O=Tenda, OU=Video Surveillance, CN=www.tenda.com.cn |
O contêiner do firmware é um arquivo ZIP no deslocamento 0xBBB:
# 1. unpack the firmware
binwalk -e ted.bin
cd ted.bin.extracted/BBB
# 2. strip the 64-byte proprietary header
dd if=user-x.squash.img of=pure_system.squashfs bs=1 skip=64
# 3. unpack the filesystem
unsquashfs pure_system.squashfs
# 4. locate the key material
find squashfs-root -name "*.pem"
# squashfs-root/etc/cacert.pem
# squashfs-root/etc/privkey.pem
Para confirmar que a chave privada pertence ao certificado distribuído, exporte a chave pública de ambos e compare:
openssl ec -in squashfs-root/etc/privkey.pem -pubout > pub_from_priv.pem
openssl x509 -in squashfs-root/etc/cacert.pem -pubkey -noout > pub_from_cert.pem
diff pub_from_priv.pem pub_from_cert.pem
# no output
sha256sum pub_from_priv.pem pub_from_cert.pem
# 80b6aa4b9e8f4cd30e857ff5b9bfcf7e0227e268f4d397efdaffe37d4b0e9bcc (both files)
A chave também funciona diretamente a partir da imagem:
openssl s_server \
-key squashfs-root/etc/privkey.pem \
-cert squashfs-root/etc/cacert.pem \
-accept 4433 -www
# ACCEPT — TLS server starts with no errors
user-x.squashfs é um sistema de arquivos somente leitura comprimido, portanto seu conteúdo é idêntico byte a byte em todas as unidades distribuídas.
Não há provisionamento por dispositivo em nenhum lugar da imagem: nenhum script de inicialização, nenhum binário openssl, nenhuma geração de chave no primeiro boot. As únicas strings relacionadas a geração de chaves em todo o sistema de arquivos vêm do hostapd e do wpa_supplicant, que não têm nenhuma relação com o servidor HTTPS.
O diretório /etc/ dentro do squashfs contém apenas quatro arquivos, dois dos quais são esse material de chave. Ambos carregam o timestamp de compilação do squashfs em vez de um timestamp de tempo de execução.
O certificado é X.509 v1, autoassinado (emissor = titular = C=CN, ST=ZJ, L=HZ, O=Tenda, OU=Video Surveillance, CN=www.tenda.com.cn), válido de 1999-12-31 a 2049-12-18, sem SAN e sem extensões de uso de chave. O número de série 1c:f2:13:a0:7b:e2:7c:91:63:f3:e0:0c:be:0f:0d:42:2e:6b:e8:69 é fixo e idêntico em todos os dispositivos.
A chave privada extraída, utilizável como está:
-----BEGIN EC PARAMETERS-----
BggqhkjOPQMBBw==
-----END EC PARAMETERS-----
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIHQLiI/KUzk/hXX4BZVuujlQMit341WWi3sTpLlGQVcaoAoGCCqGSM49
AwEHoUQDQgAEqFt550/3k/nGoYr4CFeRtvDf9HuZpHbb5FecKweJtFH7a5hBNFqq
qckxILVt8KefGENelZgPdEGNU6VcXyTORA==
-----END EC PRIVATE KEY-----
A confidencialidade e a integridade de toda a interface de gerenciamento HTTPS são perdidas para todos os dispositivos nessa versão de firmware, contra qualquer pessoa que tenha baixado a imagem pública. Nenhum privilégio e nenhuma interação do usuário são necessários no lado do alvo — um MITM passivo é suficiente. Credenciais de administrador roubadas concedem controle total do gravador e de suas câmeras.
Gere um par de chaves exclusivo por dispositivo no primeiro boot e armazene-o em uma partição gravável (por exemplo, a área JFFS2 em /opt/sav/), e remova privkey.pem e cacert.pem da imagem somente leitura por completo. A longo prazo, emita certificados por dispositivo assinados no momento da fabricação.