
Tenda Technology Co., Ltd NVR_4H: CH3 v2.1.V27.5.58.6 wurde entdeckt, dass es einen fest codierten kryptografischen Schlüssel enthält.
CNVD ID: CNVD-2026-25884
Hersteller: Tenda Technology Co., Ltd.
Produkt: NVR_4H Netzwerkvideorekorder (Hardwareversion CH3V2.1)
Firmware: V27.5.58.6
Klasse: CWE-321 — Use of Hard-coded Cryptographic Key
Die NVR_4H-Firmware speichert ein ECDSA-Schlüsselpaar in ihrer schreibgeschützten user-x.squashfs-Partition (eingebunden unter /opt/app/): den privaten Schlüssel in /etc/privkey.pem und das zugehörige selbstsignierte Zertifikat in /etc/cacert.pem. Beide wurden einmal zur Build-Zeit generiert und fest in das Image eingebettet, sodass jedes Gerät mit V27.5.58.6 mit demselben privaten Schlüssel ausgeliefert wird.
Das Firmware-Image ist ein kostenloser Download von der Tenda-Website. Wer es entpackt, verfügt über einen funktionierenden privaten Schlüssel für die HTTPS-Schnittstelle jedes NVR_4H in dieser Version. Ein Angreifer im selben Netzwerk (LAN, WLAN oder ein internetseitig erreichbares Gerät) kann sich per ARP-Spoofing oder DNS-Poisoning als Proxy zwischen den Browser des Administrators und den NVR setzen, das echte Tenda-Zertifikat mit dem extrahierten Schlüssel präsentieren, und der Browser zeigt keinerlei Warnung an. Die gesamte Sitzung ist dann in Echtzeit lesbar und veränderbar: Admin-Login, Session-Tokens, RTSP-Zugangsdaten der Kameras, Gerätekonfiguration.
| Datei | Beschreibung |
|---|---|
/etc/privkey.pem | 302-Byte EC Private Key (P-256) |
/etc/cacert.pem | 802-Byte selbstsigniertes Zertifikat, O=Tenda, OU=Video Surveillance, CN=www.tenda.com.cn |
Der Firmware-Container ist ein ZIP-Archiv bei Offset 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
Um zu bestätigen, dass der private Schlüssel zum ausgelieferten Zertifikat gehört, exportieren Sie den öffentlichen Schlüssel aus beiden und vergleichen Sie:
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)
Der Schlüssel funktioniert auch direkt aus dem Image heraus:
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 ist ein komprimiertes schreibgeschütztes Dateisystem, sodass sein Inhalt auf jedem ausgelieferten Gerät byte-identisch ist.
Es gibt nirgendwo im Image eine gerätespezifische Bereitstellung: keine Init-Skripte, keine openssl-Binärdatei, keine Schlüsselgenerierung beim ersten Start. Die einzigen schlüsselgenerierungsbezogenen Strings im gesamten Dateisystem stammen von hostapd und wpa_supplicant, die nichts mit dem HTTPS-Server zu tun haben.
/etc/ innerhalb des squashfs enthält nur vier Dateien, von denen zwei dieses Schlüsselmaterial sind. Beide tragen den squashfs-Build-Zeitstempel statt eines Laufzeit-Zeitstempels.
Das Zertifikat ist X.509 v1, selbstsigniert (Issuer = Subject = C=CN, ST=ZJ, L=HZ, O=Tenda, OU=Video Surveillance, CN=www.tenda.com.cn), gültig vom 1999-12-31 bis 2049-12-18, ohne SAN und ohne Key-Usage-Erweiterungen. Die Seriennummer 1c:f2:13:a0:7b:e2:7c:91:63:f3:e0:0c:be:0f:0d:42:2e:6b:e8:69 ist fest und auf allen Geräten identisch.
Der extrahierte private Schlüssel, direkt verwendbar:
-----BEGIN EC PARAMETERS-----
BggqhkjOPQMBBw==
-----END EC PARAMETERS-----
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIHQLiI/KUzk/hXX4BZVuujlQMit341WWi3sTpLlGQVcaoAoGCCqGSM49
AwEHoUQDQgAEqFt550/3k/nGoYr4CFeRtvDf9HuZpHbb5FecKweJtFH7a5hBNFqq
qckxILVt8KefGENelZgPdEGNU6VcXyTORA==
-----END EC PRIVATE KEY-----
Vertraulichkeit und Integrität der gesamten HTTPS-Verwaltungsschnittstelle gehen für jedes Gerät mit dieser Firmware-Version verloren, gegenüber jedem, der das öffentliche Image heruntergeladen hat. Es sind keine Privilegien und keine Benutzerinteraktion auf der Zielseite erforderlich — ein passiver MITM reicht aus. Gestohlene Admin-Zugangsdaten geben die vollständige Kontrolle über den Rekorder und seine Kameras.
Generieren Sie bei jedem Gerät beim ersten Start ein eindeutiges Schlüsselpaar und speichern Sie es auf einer beschreibbaren Partition (z. B. dem JFFS2-Bereich unter /opt/sav/), und entfernen Sie privkey.pem und cacert.pem vollständig aus dem schreibgeschützten Image. Langfristig sollten gerätespezifische Zertifikate ausgestellt werden, die zum Zeitpunkt der Fertigung signiert werden.