
Tenda Technology Co., Ltd NVR_4H: CH3 v2.1.V27.5.58.6 se descubrió que contiene una clave criptográfica codificada de forma fija.
ID de CNVD: CNVD-2026-25884
Fabricante: Tenda Technology Co., Ltd.
Producto: Grabador de video en red NVR_4H (versión de hardware CH3V2.1)
Firmware: V27.5.58.6
Clase: CWE-321 — Uso de clave criptográfica embebida
El firmware del NVR_4H almacena un par de claves ECDSA en su partición de solo lectura user-x.squashfs (montada en /opt/app/): la clave privada en /etc/privkey.pem y el certificado autofirmado correspondiente en /etc/cacert.pem. Ambos se generaron una sola vez en el momento de la compilación y se incorporaron a la imagen, por lo que todos los dispositivos que ejecutan la V27.5.58.6 se distribuyen con la misma clave privada.
La imagen del firmware es una descarga gratuita desde el sitio web de Tenda. Cualquiera que la descomprima posee una clave privada funcional para la interfaz HTTPS de todos los NVR_4H en esta versión. Un atacante en la misma red (LAN, Wi-Fi o un dispositivo expuesto a internet) puede colocar un proxy entre el navegador del administrador y el NVR mediante ARP spoofing o envenenamiento de DNS, presentar el certificado genuino de Tenda con la clave extraída, y el navegador no mostrará ninguna advertencia. La sesión completa es entonces legible y modificable en tiempo real: inicio de sesión del administrador, tokens de sesión, credenciales RTSP de las cámaras, configuración del dispositivo.
| Archivo | Descripción |
|---|---|
/etc/privkey.pem | Clave privada EC de 302 bytes (P-256) |
/etc/cacert.pem | Certificado autofirmado de 802 bytes, O=Tenda, OU=Video Surveillance, CN=www.tenda.com.cn |
El contenedor del firmware es un archivo ZIP en el desplazamiento 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 la clave privada pertenece al certificado distribuido, exporte la clave pública de ambos y compárela:
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)
La clave también funciona directamente desde la imagen:
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 es un sistema de archivos comprimido de solo lectura, por lo que su contenido es idéntico byte a byte en todas las unidades distribuidas.
No existe aprovisionamiento por dispositivo en ninguna parte de la imagen: ni scripts de inicio, ni binario openssl, ni generación de claves en el primer arranque. Las únicas cadenas relacionadas con la generación de claves en todo el sistema de archivos provienen de hostapd y wpa_supplicant, que no tienen nada que ver con el servidor HTTPS.
/etc/ dentro del squashfs contiene solo cuatro archivos, dos de los cuales son este material de claves. Ambos llevan la marca de tiempo de compilación del squashfs en lugar de una de tiempo de ejecución.
El certificado es X.509 v1, autofirmado (emisor = sujeto = C=CN, ST=ZJ, L=HZ, O=Tenda, OU=Video Surveillance, CN=www.tenda.com.cn), válido del 1999-12-31 al 2049-12-18, sin SAN ni extensiones de uso de clave. El número de serie 1c:f2:13:a0:7b:e2:7c:91:63:f3:e0:0c:be:0f:0d:42:2e:6b:e8:69 es fijo e idéntico en todos los dispositivos.
La clave privada extraída, utilizable tal cual:
-----BEGIN EC PARAMETERS-----
BggqhkjOPQMBBw==
-----END EC PARAMETERS-----
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIHQLiI/KUzk/hXX4BZVuujlQMit341WWi3sTpLlGQVcaoAoGCCqGSM49
AwEHoUQDQgAEqFt550/3k/nGoYr4CFeRtvDf9HuZpHbb5FecKweJtFH7a5hBNFqq
qckxILVt8KefGENelZgPdEGNU6VcXyTORA==
-----END EC PRIVATE KEY-----
La confidencialidad e integridad de toda la interfaz de gestión HTTPS se pierden para todos los dispositivos en esta versión de firmware, frente a cualquiera que haya descargado la imagen pública. No se necesitan privilegios ni interacción del usuario en el lado del objetivo: basta con un MITM pasivo. Las credenciales de administrador robadas otorgan control total del grabador y de sus cámaras.
Genere un par de claves único por dispositivo en el primer arranque y almacénelo en una partición de escritura (por ejemplo, el área JFFS2 bajo /opt/sav/), y elimine privkey.pem y cacert.pem de la imagen de solo lectura por completo. A más largo plazo, emita certificados por dispositivo firmados en el momento de la fabricación.