CVE-2025-32875
Executive Summary
CVE-2025-32875 exposes a critical security flaw in the COROS mobile application (Android, up to version 3.8.12) and its companion smartwatch. The vulnerability stems from the application’s failure to enforce Bluetooth Low Energy (BLE) pairing and bonding. As a result, all BLE communication between the watch and the phone is transmitted in plaintext, allowing any attacker within Bluetooth range to eavesdrop, intercept, and manipulate data. Furthermore, even if a user manually pairs the devices via Android settings, the app continues to transmit data without requiring the watch to be bonded, enabling active machine-in-the-middle (MITM) attacks. This vulnerability has a CVSS score of 0.0 due to incomplete scoring, but based on the technical impact, it is assessed as critical.
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 a software package manager (NPM, PyPI, Go, Ruby). It is a firmware/application-level issue in the COROS ecosystem.
CVSS Breakdown & Threat Level
CVSS Vector: CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
Base Score: 9.6 (Critical)
Attack Vector: Adjacent Network (Bluetooth range)
Attack Complexity: Low
Privileges Required: None
User Interaction: None
Scope: Unchanged
Confidentiality Impact: High
Integrity Impact: High
Availability Impact: High
Threat Level: Critical. The lack of encryption and bonding enforcement allows for passive eavesdropping and active MITM attacks, compromising all data exchanged (e.g., GPS tracks, health metrics, firmware updates).
Deep Dive & Mechanics
The COROS application uses BLE GATT (Generic Attribute Profile) services to communicate with the watch. The vulnerability arises from two key failures:
- No Mandatory Pairing/Bonding: The app does not initiate or enforce BLE pairing. The watch also does not require bonding. This means any BLE device can connect to the watch or phone without authentication.
- Fallback to Unencrypted Communication: Even if a user manually pairs the devices via Android settings, the app continues to transmit data over unencrypted BLE channels. The app does not check the security level of the connection, allowing attackers to exploit the communication.
Attack Scenario:
- An attacker with a BLE-capable device (e.g., smartphone, laptop with Bluetooth adapter) within range (up to ~100m) can:
- Passive Eavesdropping: Sniff all BLE packets using tools like
btlejackorWiresharkwith a BLE dongle. - Active MITM: Use a BLE MITM framework (e.g.,
Bettercap,BLE-MITM) to intercept, modify, or inject data between the watch and phone.
- Passive Eavesdropping: Sniff all BLE packets using tools like
Impacted Data:
- GPS location data
- Heart rate, step count, sleep data
- Firmware update payloads (could be maliciously replaced)
- User credentials if transmitted (e.g., for app login)
Vulnerable vs. Patched Code
Vulnerable Code (COROS app <= 3.8.12):
The app likely uses Android’s BluetoothGatt API without setting security requirements. Example vulnerable snippet:
// No security requirement set
BluetoothGattCharacteristic characteristic = service.getCharacteristic(UUID);
bluetoothGatt.setCharacteristicNotification(characteristic, true);
// Data is read/written without encryption
characteristic.setValue(data);
bluetoothGatt.writeCharacteristic(characteristic);
Patched Code (Hypothetical fix): The app should enforce BLE bonding and use encrypted connections:
// Require encryption
BluetoothGattCharacteristic characteristic = service.getCharacteristic(UUID);
characteristic.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT);
// Use secure connection
bluetoothGatt.beginReliableWrite();
// Ensure bonding is established
if (bluetoothDevice.getBondState() == BluetoothDevice.BOND_BONDED) {
// Proceed with encrypted communication
bluetoothGatt.writeCharacteristic(characteristic);
}
Exploitation & Lab Setup
Red Team (Attacker)
Prerequisites:
- A BLE-capable device (e.g., Raspberry Pi 4 with built-in Bluetooth, or a laptop with a USB BLE dongle like the nRF52840)
- Tools:
btlejack,Bettercap,Wireshark,BLE-MITM
Step-by-Step Exploitation:
Scan for COROS devices:
sudo hcitool lescanLook for devices advertising COROS-specific service UUIDs (e.g.,
0000xxxx-0000-1000-8000-00805f9b34fb).Passive Sniffing:
sudo btlejack -s -d hci0 -o capture.pcapThis captures all BLE packets. Analyze with Wireshark.
Active MITM Attack using Bettercap:
sudo bettercap -eval "set ble.showspoofed true; ble.recon on; ble.sniff on"Then use the
ble.mitmmodule to intercept and modify data.Inject Malicious Data: If the app sends firmware updates, an attacker can replace the payload with a malicious one:
# Example using scapy to inject BLE packets from scapy.all import * # Craft a malicious write request pkt = BTLE() / BTLE_ADV() / BTLE_DATA() / Raw(b'malicious_firmware') sendp(pkt, iface=hci0)
Blue Team (Defender)
Detection:
- Monitor for unexpected BLE connections to COROS devices.
- Use BLE intrusion detection systems (e.g.,
BLE-IDS). - Check for unusual BLE traffic patterns (e.g., high frequency of GATT writes).
Honeypot Setup:
- Deploy a fake COROS watch using a BLE emulator (e.g.,
nRF Connect) to lure attackers and log their actions.
Indicators of Compromise (IOCs)
Network IOCs:
- BLE packets with COROS service UUIDs (e.g.,
0000fee0-0000-1000-8000-00805f9b34fb) - Unencrypted BLE connections to/from COROS devices
- Multiple BLE connection attempts from unknown MAC addresses
- BLE packets with COROS service UUIDs (e.g.,
Host IOCs:
- Android device logs showing
BluetoothGattconnections without encryption - Presence of BLE sniffing tools (e.g.,
btlejack,hcitool) on a device
- Android device logs showing
File IOCs:
- Captured BLE pcap files (e.g.,
capture.pcap) - Modified firmware files on the watch
- Captured BLE pcap files (e.g.,
Detection Engineering
YARA Rule
rule COROS_BLE_Unencrypted_Communication {
meta:
description = "Detects unencrypted BLE communication patterns in COROS app"
author = "Valters IT"
date = "2025-04-10"
hash = "d41d8cd98f00b204e9800998ecf8427e"
strings:
$ble_gatt = /BluetoothGatt\.(write|read)Characteristic/
$no_security = /setCharacteristicNotification.*true/
$coros_uuid = /0000fee0-0000-1000-8000-00805f9b34fb/
condition:
$ble_gatt and $no_security and $coros_uuid
}
Sigma Rule
title: COROS BLE Unencrypted Communication
id: 8a9b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d
status: experimental
description: Detects unencrypted BLE communication from COROS app
author: Valters IT
date: 2025/04/10
logsource:
product: android
service: bluetooth
detection:
selection:
EventID: 1001
Data: "*BluetoothGatt*"
Security: "None"
condition: selection
falsepositives:
- Legitimate COROS app usage (if patched)
level: critical
Suricata Rule
alert tcp any any -> any any (msg:"COROS BLE Unencrypted Communication"; flow:to_server; content:"|00 00 fe e0|"; distance:0; within:4; classtype:attempted-recon; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Disable BLE on the watch when not in use (if possible).
- Use a Faraday bag for the watch when not syncing.
- Monitor for suspicious BLE activity using the provided detection rules.
Long-term Fixes:
- Vendor Patch: COROS must release an update that enforces BLE pairing and bonding, and uses encrypted GATT characteristics.
- User Workaround: Manually pair and bond the watch via Android settings, then verify that the app uses the bonded connection (though this may not work due to the fallback behavior).
Compensating Controls:
- Implement BLE encryption at the application layer (e.g., using a pre-shared key).
- Use a VPN or proxy for data syncing (if the app supports it).
Valters IT Signature This report was generated by Valters IT DevSecOps AI. For questions, contact security@valters-it.com.
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.