Skip to content
Heist/ feed
Back to feed
HighFix available

OpenChoreo: Authorization bypass on WorkflowRun update allows cross-project takeover of workflow runs

Type: advisorySources: OSV

## 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 b

Products
github.com/openchoreo/openchoreo
Affected versions
Not specified
Fixed versions
1.0.6, 1.1.7, 1.2.5
CVEs
CVE-2026-113727
Confirmed fixed CVEs
Not specified
Updated in this feed
31 Oct 2026, 14:34 UTC · Revision 1

Source evidence

OpenChoreo: Authorization bypass on WorkflowRun update allows cross-project takeover of workflow runs

core-osv · Original source

Published 21 Oct 2026, 16:29 UTC

## 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 b

osv:GHSA-46r4-q7wv-32fc

github.com/openchoreo/openchoreo

Fixed versions: 1.0.6

github.com/openchoreo/openchoreo

Fixed versions: 1.1.7

github.com/openchoreo/openchoreo

Fixed versions: 1.2.5

Complete source record
{
  "id": "ea2f04005840f9d051ce060b469056e0c411e9f7497301a8095527875926c02b",
  "url": "https://osv.dev/vulnerability/GHSA-46r4-q7wv-32fc",
  "method": "structured",
  "payload": {
    "kind": "advisory",
    "title": "OpenChoreo: Authorization bypass on WorkflowRun update allows cross-project takeover of workflow runs",
    "summary": "## 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 b",
    "evidence": "osv:GHSA-46r4-q7wv-32fc",
    "products": [
      {
        "name": {
          "value": "github.com/openchoreo/openchoreo",
          "evidence": "/affected/0/package/name"
        },
        "prerequisites": [],
        "fixed_versions": [
          {
            "value": "1.0.6",
            "evidence": "/affected/0/ranges"
          }
        ],
        "affected_versions": []
      },
      {
        "name": {
          "value": "github.com/openchoreo/openchoreo",
          "evidence": "/affected/1/package/name"
        },
        "prerequisites": [],
        "fixed_versions": [
          {
            "value": "1.1.7",
            "evidence": "/affected/1/ranges"
          }
        ],
        "affected_versions": []
      },
      {
        "name": {
          "value": "github.com/openchoreo/openchoreo",
          "evidence": "/affected/2/package/name"
        },
        "prerequisites": [],
        "fixed_versions": [
          {
            "value": "1.2.5",
            "evidence": "/affected/2/ranges"
          }
        ],
        "affected_versions": []
      }
    ],
    "severity": "high",
    "structured": {
      "id": "GHSA-46r4-q7wv-32fc",
      "aliases": [
        "CVE-2026-113727",
        "GHSA-46r4-q7wv-32fc"
      ],
      "metrics": [
        {
          "type": "CVSS_V3",
          "score": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:L/I:L/A:L"
        }
      ],
      "affected": [
        {
          "ranges": [
            {
              "type": "SEMVER",
              "events": [
                {
                  "introduced": "1.0.0"
                },
                {
                  "fixed": "1.0.6"
                }
              ]
            }
          ],
          "package": {
            "name": "github.com/openchoreo/openchoreo",
            "purl": "pkg:golang/github.com/openchoreo/openchoreo",
            "ecosystem": "Go"
          },
          "database_specific": {
            "source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/10/GHSA-46r4-q7wv-32fc/GHSA-46r4-q7wv-32fc.json"
          }
        },
        {
          "ranges": [
            {
              "type": "SEMVER",
              "events": [
                {
                  "introduced": "1.1.0"
                },
                {
                  "fixed": "1.1.7"
                }
              ]
            }
          ],
          "package": {
            "name": "github.com/openchoreo/openchoreo",
            "purl": "pkg:golang/github.com/openchoreo/openchoreo",
            "ecosystem": "Go"
          },
          "database_specific": {
            "source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/10/GHSA-46r4-q7wv-32fc/GHSA-46r4-q7wv-32fc.json"
          }
        },
        {
          "ranges": [
            {
              "type": "SEMVER",
              "events": [
                {
                  "introduced": "1.2.0"
                },
                {
                  "fixed": "1.2.5"
                }
              ]
            }
          ],
          "package": {
            "name": "github.com/openchoreo/openchoreo",
            "purl": "pkg:golang/github.com/openchoreo/openchoreo",
            "ecosystem": "Go"
          },
          "database_specific": {
            "source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/10/GHSA-46r4-q7wv-32fc/GHSA-46r4-q7wv-32fc.json"
          }
        }
      ],
      "modified": "2026-10-21T16:45:04.138126100Z",
      "provider": "osv",
      "references": [
        "https://github.com/openchoreo/openchoreo/security/advisories/GHSA-46r4-q7wv-32fc",
        "https://nvd.nist.gov/vuln/detail/CVE-2026-113727",
        "https://github.com/openchoreo/openchoreo/pull/4596",
        "https://github.com/openchoreo/openchoreo/pull/4618",
        "https://github.com/openchoreo/openchoreo/pull/4626",
        "https://github.com/openchoreo/openchoreo/pull/4627",
        "https://github.com/openchoreo/openchoreo/commit/0e311468bb704b0dce7753b89c9d0204009285ca",
        "https://github.com/openchoreo/openchoreo/commit/477031c6fece0666f144942fb02c0b579dacc0bb",
        "https://github.com/openchoreo/openchoreo/commit/91e1e868eb8e0e67274109018d00a767b22eda14",
        "https://github.com/openchoreo/openchoreo/commit/d5ed0ef62d9c9af7b05a72aed2bcbc0ac9d45426",
        "https://github.com/openchoreo/openchoreo",
        "https://github.com/openchoreo/openchoreo/releases/tag/v1.0.6",
        "https://github.com/openchoreo/openchoreo/releases/tag/v1.1.7",
        "https://github.com/openchoreo/openchoreo/releases/tag/v1.2.5"
      ],
      "provider_metadata": {
        "cwe_ids": [
          "CWE-639"
        ],
        "severity": "HIGH",
        "github_reviewed": true,
        "nvd_published_at": "2026-10-20T22:19:29Z",
        "github_reviewed_at": "2026-10-21T16:29:53Z"
      }
    },
    "related_cves": [
      {
        "value": "CVE-2026-113727",
        "evidence": "/aliases"
      }
    ],
    "security_relevant": true,
    "severity_evidence": "/database_specific/severity"
  },
  "source_id": "core-osv",
  "document_id": 394538,
  "published_at": "2026-10-21T16:29:53+00:00"
}