CVE-2026-113727
OpenChoreo: Authorization bypass on WorkflowRun update allows cross-project takeover of workflow runs
OpenChoreo is a developer platform for Kubernetes. From 1.0.0 until 1.0.6, 1.1.7, and 1.2.5, the PUT .../workflowruns/{runName} update route authorizes a request using the openchoreo.dev/project and openchoreo.dev/component labels in the submitted body while selecting the stored WorkflowRun by the URL path. An authenticated caller with workflowrun:update for one project or component in the same namespace can name another run in the path, submit ownership labels for a scope they control, and rewrite the victim run's ownership labels. Subsequent authorization then treats the attacker as authorized to read build logs and Kubernetes events, delete the run, modify pending spec.workflow.parameters, or place the run into a permanent ComponentValidationFailed state. The namespace comes from the URL, so the issue is cross-project or cross-component within one namespace and is not anonymously reachable or cross-tenant. This issue is fixed in 1.0.6, 1.1.7, and 1.2.5.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- Low
- User interaction
- None
What an attacker can affect
- Confidentiality
- Low
- Integrity
- Low
- Availability
- Low
Exploit likelihood
What each source reports
CVE List Score used
7.4
OpenChoreo: Authorization bypass on WorkflowRun update allows cross-project takeover of workflow runs
OpenChoreo is a developer platform for Kubernetes. From 1.0.0 until 1.0.6, 1.1.7, and 1.2.5, the PUT .../workflowruns/{runName} update route authorizes a request using the openchoreo.dev/project and openchoreo.dev/component labels in the submitted body while selecting the stored WorkflowRun by the URL path. An authenticated caller with workflowrun:update for one project or component in the same namespace can name another run in the path, submit ownership labels for a scope they control, and rewrite the victim run's ownership labels. Subsequent authorization then treats the attacker as authorized to read build logs and Kubernetes events, delete the run, modify pending spec.workflow.parameters, or place the run into a permanent ComponentValidationFailed state. The namespace comes from the URL, so the issue is cross-project or cross-component within one namespace and is not anonymously reachable or cross-tenant. This issue is fixed in 1.0.6, 1.1.7, and 1.2.5.
- Record
CVE-2026-113727- CVSS 3.1
- 7.4 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:L/I:L/A:L - Weakness
- CWE-639
- Updated
- 2026-11-02
EUVDEUVD-2026-105772
7.4
OpenChoreo is a developer platform for Kubernetes. From 1.0.0 until 1.0.6, 1.1.7, and 1.2.5, the PUT .../workflowruns/{runName} update route authorizes a request using the openchoreo.dev/project and openchoreo.dev/component labels in the submitted body while selecting the stored WorkflowRun by the URL path. An authenticated caller with workflowrun:update for one project or component in the same namespace can name another run in the path, submit ownership labels for a scope they control, and rewrite the victim run's ownership labels. Subsequent authorization then treats the attacker as authorized to read build logs and Kubernetes events, delete the run, modify pending spec.workflow.parameters, or place the run into a permanent ComponentValidationFailed state. The namespace comes from the URL, so the issue is cross-project or cross-component within one namespace and is not anonymously reachable or cross-tenant. This issue is fixed in 1.0.6, 1.1.7, and 1.2.5.
- Record
EUVD-2026-105772- CVSS 3.1
- 7.4 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:L/I:L/A:L - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-46r4-q7wv-32fc
7.4
OpenChoreo: Authorization bypass on WorkflowRun update allows cross-project takeover of workflow runs
Summary
The OpenChoreo API server authorized PUT .../workflowruns/{runName} against ownership metadata taken from the request body, while the object it actually mutated was selected by the URL path. Nothing forced the two to agree.
A WorkflowRun's membership in a project and component is carried entirely by its openchoreo.dev/project and openchoreo.dev/component labels. Because the workflowrun:update check read those labels from the submitted object rather than the stored one, a caller holding workflowrun:update on one component could name a run belonging to a different project or component in the URL, supply labels for the component they legitimately control, pass the check, and have the unrelated run rewritten with their own ownership labels.
The namespace is taken from the URL and feeds both the authorization check and the Kubernetes read, so it cannot diverge. This is cross-project and cross-component escalation inside a single namespace, not a cross-tenant issue.
Impact
Rewriting the ownership labels transfers authority over the run. Every other WorkflowRun check (view, logs, events, status, delete, list) derives its scope from the stored labels, so once the write lands the policy engine legitimately grants the attacker access to an object they never had rights to. They can then:
- Read the victim's build logs. These stream raw pod logs from the workflow plane and routinely carry source paths, registry destinations, and credentials a build step echoed by accident.
- Read the run's Kubernetes events.
- Delete the run.
So the primary impact is confidentiality and availability, not only integrity. On the integrity side, spec.workflow.parameters can be overwritten on a pending run, and manipulating the two ownership labels can either wedge the run in a permanent ComponentValidationFailed condition or downgrade it to a standalone run that skips component validation.
Exploitation requires an authenticated caller with an AuthzRoleBinding or ClusterAuthzRoleBinding granting workflowrun:update at project or component scope in the victim's namespace, plus knowledge of the target run's name. An anonymous caller cannot reach this.
Patches
The authorization check now loads the stored WorkflowRun and derives every ownership attribute from it instead of from the request body. Separately, the openchoreo.dev/project and openchoreo.dev/component labels are now immutable on update, so an authorized caller cannot hand their own run to another project either.
| Line | Affected | Fixed in | |---|---|---| | 1.0.x | 1.0.0 through 1.0.5 | 1.0.6 | | 1.1.x | 1.1.0 through 1.1.6 | 1.1.7 | | 1.2.x | 1.2.0 through 1.2.4 | 1.2.5 |
Upgrade to the patched release on your line. No configuration change is needed after upgrading.
Workarounds
If you cannot upgrade immediately, restrict who holds workflowrun:update.
Audit your AuthzRole and ClusterAuthzRole definitions for that action and remove it from any role granted to principals you would not trust with write access to every workflow run in the namespace. Among the roles shipped with OpenChoreo, only the system role workload-publisher lists workflowrun:update explicitly, and admin holds it through its * wildcard. Custom roles in your own values file may also include it, so check those.
Treat any credential bound to workload-publisher as privileged. CI systems are the usual holder, and a leaked CI token is enough to run this.
- Record
GHSA-46r4-q7wv-32fc- CVSS 3.1
- 7.4 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:L/I:L/A:L - Weakness
- CWE-639
- Updated
- 2026-11-02
NVD
7.4
OpenChoreo is a developer platform for Kubernetes. From 1.0.0 until 1.0.6, 1.1.7, and 1.2.5, the PUT .../workflowruns/{runName} update route authorizes a request using the openchoreo.dev/project and openchoreo.dev/component labels in the submitted body while selecting the stored WorkflowRun by the URL path. An authenticated caller with workflowrun:update for one project or component in the same namespace can name another run in the path, submit ownership labels for a scope they control, and rewrite the victim run's ownership labels. Subsequent authorization then treats the attacker as authorized to read build logs and Kubernetes events, delete the run, modify pending spec.workflow.parameters, or place the run into a permanent ComponentValidationFailed state. The namespace comes from the URL, so the issue is cross-project or cross-component within one namespace and is not anonymously reachable or cross-tenant. This issue is fixed in 1.0.6, 1.1.7, and 1.2.5.
- Record
CVE-2026-113727- CVSS 3.1
- 7.4 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:L/I:L/A:L - Weakness
- CWE-639
- Updated
- 2026-11-02
OSV
7.4
OpenChoreo: Authorization bypass on WorkflowRun update allows cross-project takeover of workflow runs
OpenChoreo is a developer platform for Kubernetes. From 1.0.0 until 1.0.6, 1.1.7, and 1.2.5, the PUT .../workflowruns/{runName} update route authorizes a request using the openchoreo.dev/project and openchoreo.dev/component labels in the submitted body while selecting the stored WorkflowRun by the URL path. An authenticated caller with workflowrun:update for one project or component in the same namespace can name another run in the path, submit ownership labels for a scope they control, and rewrite the victim run's ownership labels. Subsequent authorization then treats the attacker as authorized to read build logs and Kubernetes events, delete the run, modify pending spec.workflow.parameters, or place the run into a permanent ComponentValidationFailed state. The namespace comes from the URL, so the issue is cross-project or cross-component within one namespace and is not anonymously reachable or cross-tenant. This issue is fixed in 1.0.6, 1.1.7, and 1.2.5.
- Record
CVE-2026-113727- CVSS 3.1
- 7.4 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:L/I:L/A:L - Weakness
- CWE-639
- Updated
- 2026-11-06
OSVGHSA-46r4-q7wv-32fc
7.4
OpenChoreo: Authorization bypass on WorkflowRun update allows cross-project takeover of workflow runs
Summary
The OpenChoreo API server authorized PUT .../workflowruns/{runName} against ownership metadata taken from the request body, while the object it actually mutated was selected by the URL path. Nothing forced the two to agree.
A WorkflowRun's membership in a project and component is carried entirely by its openchoreo.dev/project and openchoreo.dev/component labels. Because the workflowrun:update check read those labels from the submitted object rather than the stored one, a caller holding workflowrun:update on one component could name a run belonging to a different project or component in the URL, supply labels for the component they legitimately control, pass the check, and have the unrelated run rewritten with their own ownership labels.
The namespace is taken from the URL and feeds both the authorization check and the Kubernetes read, so it cannot diverge. This is cross-project and cross-component escalation inside a single namespace, not a cross-tenant issue.
Impact
Rewriting the ownership labels transfers authority over the run. Every other WorkflowRun check (view, logs, events, status, delete, list) derives its scope from the stored labels, so once the write lands the policy engine legitimately grants the attacker access to an object they never had rights to. They can then:
- Read the victim's build logs. These stream raw pod logs from the workflow plane and routinely carry source paths, registry destinations, and credentials a build step echoed by accident.
- Read the run's Kubernetes events.
- Delete the run.
So the primary impact is confidentiality and availability, not only integrity. On the integrity side, spec.workflow.parameters can be overwritten on a pending run, and manipulating the two ownership labels can either wedge the run in a permanent ComponentValidationFailed condition or downgrade it to a standalone run that skips component validation.
Exploitation requires an authenticated caller with an AuthzRoleBinding or ClusterAuthzRoleBinding granting workflowrun:update at project or component scope in the victim's namespace, plus knowledge of the target run's name. An anonymous caller cannot reach this.
Patches
The authorization check now loads the stored WorkflowRun and derives every ownership attribute from it instead of from the request body. Separately, the openchoreo.dev/project and openchoreo.dev/component labels are now immutable on update, so an authorized caller cannot hand their own run to another project either.
| Line | Affected | Fixed in | |---|---|---| | 1.0.x | 1.0.0 through 1.0.5 | 1.0.6 | | 1.1.x | 1.1.0 through 1.1.6 | 1.1.7 | | 1.2.x | 1.2.0 through 1.2.4 | 1.2.5 |
Upgrade to the patched release on your line. No configuration change is needed after upgrading.
Workarounds
If you cannot upgrade immediately, restrict who holds workflowrun:update.
Audit your AuthzRole and ClusterAuthzRole definitions for that action and remove it from any role granted to principals you would not trust with write access to every workflow run in the namespace. Among the roles shipped with OpenChoreo, only the system role workload-publisher lists workflowrun:update explicitly, and admin holds it through its * wildcard. Custom roles in your own values file may also include it, so check those.
Treat any credential bound to workload-publisher as privileged. CI systems are the usual holder, and a leaked CI token is enough to run this.
- Record
GHSA-46r4-q7wv-32fc- CVSS 3.1
- 7.4 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:L/I:L/A:L - Weakness
- CWE-639
- Updated
- 2026-11-06
OSVGO-2026-6825 No score
OpenChoreo: Authorization bypass on WorkflowRun update allows cross-project takeover of workflow runs in github.com/openchoreo/openchoreo
OpenChoreo: Authorization bypass on WorkflowRun update allows cross-project takeover of workflow runs in github.com/openchoreo/openchoreo
- Record
GO-2026-6825- Updated
- 2026-11-06
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
github.com/openchoreo/openchoreoGo |
1.0.0 up to 1.0.6 | 1.0.6 |
github.com/openchoreo/openchoreoGo |
1.1.0 up to 1.1.7 | 1.1.7 |
github.com/openchoreo/openchoreoGo |
1.2.0 up to 1.2.5 | 1.2.5 |
github.com/openchoreo/openchoreoGo |
1.0.0 up to 1.0.6, 1.1.0 up to 1.1.7, 1.2.0 up to 1.2.5 | 1.0.61.1.71.2.5 |
History
| Recorded | Changed | Sources |
|---|---|---|
| affected, aliases, facts | OSV | |
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-113727 is a high vulnerability (CVSS 7.4) in Openchoreo, published October 20, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.46%, the 40th percentile. Fixed in github.com/openchoreo/openchoreo 1.0.6.
References
github.com/openchoreo/openchoreo/security/advisories/GHSA-46r4-q7wv-32fc
github.com/openchoreo/openchoreo/pull/4596
github.com/openchoreo/openchoreo/pull/4618
github.com/openchoreo/openchoreo/pull/4626
github.com/openchoreo/openchoreo/pull/4627
github.com/openchoreo/openchoreo/commit/0e311468bb704b0dce7753b89c9d0204009285ca
Show 10 moreShow less
github.com/openchoreo/openchoreo/commit/477031c6fece0666f144942fb02c0b579dacc0bb
github.com/openchoreo/openchoreo/commit/91e1e868eb8e0e67274109018d00a767b22eda14
github.com/openchoreo/openchoreo/commit/d5ed0ef62d9c9af7b05a72aed2bcbc0ac9d45426
github.com/openchoreo/openchoreo/releases/tag/v1.0.6
github.com/openchoreo/openchoreo/releases/tag/v1.1.7
github.com/openchoreo/openchoreo/releases/tag/v1.2.5
nvd.nist.gov/vuln/detail/CVE-2026-113727
github.com/advisories/GHSA-46r4-q7wv-32fc
github.com/CVEProject/cvelistV5/tree/main/cves/2026/113xxx/CVE-2026-113727.json
github.com/openchoreo/openchoreo