
Tenda Technology Co., Ltd NVR_4H: CH3 v2.1.V27.5.58.6 содержит жестко закодированный криптографический ключ.
CNVD ID: CNVD-2026-25884
Производитель: Tenda Technology Co., Ltd.
Продукт: сетевой видеорегистратор NVR_4H (аппаратная версия CH3V2.1)
Прошивка: V27.5.58.6
Класс: CWE-321 — Использование жёстко закодированного криптографического ключа
Прошивка NVR_4H хранит пару ключей ECDSA в своём read-only разделе user-x.squashfs (монтируется в /opt/app/): закрытый ключ в /etc/privkey.pem и соответствующий самоподписанный сертификат в /etc/cacert.pem. Оба были сгенерированы один раз во время сборки и вшиты в образ, поэтому каждое устройство с версией V27.5.58.6 поставляется с одним и тем же закрытым ключом.
Образ прошивки свободно скачивается с сайта Tenda. Любой, кто его распакует, получает рабочий закрытый ключ для HTTPS-интерфейса каждого NVR_4H на этой версии. Злоумышленник в той же сети (LAN, Wi-Fi или устройство, доступное из интернета) может поставить прокси между браузером администратора и NVR с помощью ARP-спуфинга или отравления DNS, предъявить подлинный сертификат Tenda с извлечённым ключом, и браузер не покажет никакого предупреждения. Вся сессия после этого читается и изменяется в реальном времени: вход администратора, токены сессии, учётные данные RTSP камер, конфигурация устройства.
| Файл | Описание |
|---|---|
/etc/privkey.pem | 302-байтовый EC закрытый ключ (P-256) |
/etc/cacert.pem | 802-байтовый самоподписанный сертификат, O=Tenda, OU=Video Surveillance, CN=www.tenda.com.cn |
Контейнер прошивки — это ZIP-архив со смещением 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
Чтобы убедиться, что закрытый ключ принадлежит поставляемому сертификату, экспортируйте открытый ключ из обоих и сравните:
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)
Ключ также работает прямо из образа:
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 — это сжатая read-only файловая система, поэтому её содержимое побайтово идентично на каждом выпущенном устройстве.
Нигде в образе нет индивидуальной настройки для каждого устройства: ни init-скриптов, ни бинарника openssl, ни генерации ключей при первой загрузке. Единственные строки, связанные с генерацией ключей, во всей файловой системе происходят из hostapd и wpa_supplicant, которые не имеют никакого отношения к HTTPS-серверу.
/etc/ внутри squashfs содержит всего четыре файла, два из которых — этот ключевой материал. Оба несут временную метку сборки squashfs, а не времени выполнения.
Сертификат — X.509 v1, самоподписанный (issuer = subject = C=CN, ST=ZJ, L=HZ, O=Tenda, OU=Video Surveillance, CN=www.tenda.com.cn), действителен с 1999-12-31 по 2049-12-18, без SAN и без расширений key usage. Серийный номер 1c:f2:13:a0:7b:e2:7c:91:63:f3:e0:0c:be:0f:0d:42:2e:6b:e8:69 фиксирован и идентичен на всех устройствах.
Извлечённый закрытый ключ, пригодный к использованию как есть:
-----BEGIN EC PARAMETERS-----
BggqhkjOPQMBBw==
-----END EC PARAMETERS-----
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIHQLiI/KUzk/hXX4BZVuujlQMit341WWi3sTpLlGQVcaoAoGCCqGSM49
AwEHoUQDQgAEqFt550/3k/nGoYr4CFeRtvDf9HuZpHbb5FecKweJtFH7a5hBNFqq
qckxILVt8KefGENelZgPdEGNU6VcXyTORA==
-----END EC PRIVATE KEY-----
Конфиденциальность и целостность всего HTTPS-интерфейса управления теряются для каждого устройства на этой версии прошивки перед любым, кто скачал публичный образ. На стороне цели не требуется никаких привилегий и никакого взаимодействия с пользователем — достаточно пассивного MITM. Украденные учётные данные администратора дают полный контроль над регистратором и его камерами.
Генерировать уникальную пару ключей для каждого устройства при первой загрузке и хранить её на записываемом разделе (например, в области JFFS2 в /opt/sav/), а privkey.pem и cacert.pem полностью удалить из read-only образа. В долгосрочной перспективе — выпускать сертификаты для каждого устройства, подписанные на этапе производства.