GHSA-RX35-6RHX-7858
Vulnerability from github – Published: 2026-04-21 20:26 – Updated: 2026-04-21 20:26Summary
A validation bypass in the VolumeMount path restriction allows mounting volumes under restricted /tekton/ internal paths by using .. path traversal components. The restriction check uses strings.HasPrefix without filepath.Clean, so a path like /tekton/home/../results passes validation but resolves to /tekton/results at runtime.
Details
Tekton Pipelines restricts VolumeMount paths under /tekton/ (except /tekton/home) to prevent users from interfering with internal execution state. The validation at pkg/apis/pipeline/v1/container_validation.go checks mount paths using strings.HasPrefix without normalizing the path first:
if strings.HasPrefix(vm.MountPath, "/tekton/") &&
!strings.HasPrefix(vm.MountPath, "/tekton/home") {
// reject
}
Because /tekton/home is an allowed prefix, a path like /tekton/home/../results passes both checks. At runtime, the container runtime resolves .. and the actual mount point becomes /tekton/results.
The same pattern exists in pkg/apis/pipeline/v1beta1/task_validation.go.
Impact
An authenticated user with Task or TaskRun creation permissions can mount volumes over internal Tekton paths, potentially:
- Writing fake task results that downstream pipelines trust
- Reading or modifying step scripts before execution
- Interfering with entrypoint coordination state
Patches
A patch is available at v1.11.1.
Workarounds
- Use admission controllers (OPA/Gatekeeper, Kyverno) to validate that VolumeMount paths do not contain
..components. - In multi-tenant setups, restrict who can create Task and TaskRun resources via RBAC.
Affected Versions
All versions through v1.11.0 (both v1 and v1beta1 APIs).
Acknowledgments
This vulnerability was reported by @kodareef5.
{
"affected": [
{
"database_specific": {
"last_known_affected_version_range": "\u003c= 1.11.0"
},
"package": {
"ecosystem": "Go",
"name": "github.com/tektoncd/pipeline"
},
"ranges": [
{
"events": [
{
"introduced": "0"
},
{
"fixed": "1.11.1"
}
],
"type": "ECOSYSTEM"
}
]
}
],
"aliases": [
"CVE-2026-40923"
],
"database_specific": {
"cwe_ids": [
"CWE-22"
],
"github_reviewed": true,
"github_reviewed_at": "2026-04-21T20:26:41Z",
"nvd_published_at": null,
"severity": "MODERATE"
},
"details": "## Summary\n\nA validation bypass in the VolumeMount path restriction allows mounting volumes under restricted `/tekton/` internal paths by using `..` path traversal components. The restriction check uses `strings.HasPrefix` without `filepath.Clean`, so a path like `/tekton/home/../results` passes validation but resolves to `/tekton/results` at runtime.\n\n## Details\n\nTekton Pipelines restricts VolumeMount paths under `/tekton/` (except `/tekton/home`) to prevent users from interfering with internal execution state. The validation at `pkg/apis/pipeline/v1/container_validation.go` checks mount paths using `strings.HasPrefix` without normalizing the path first:\n\n```go\nif strings.HasPrefix(vm.MountPath, \"/tekton/\") \u0026\u0026\n !strings.HasPrefix(vm.MountPath, \"/tekton/home\") {\n // reject\n}\n```\n\nBecause `/tekton/home` is an allowed prefix, a path like `/tekton/home/../results` passes both checks. At runtime, the container runtime resolves `..` and the actual mount point becomes `/tekton/results`.\n\nThe same pattern exists in `pkg/apis/pipeline/v1beta1/task_validation.go`.\n\n## Impact\n\nAn authenticated user with Task or TaskRun creation permissions can mount volumes over internal Tekton paths, potentially:\n\n- Writing fake task results that downstream pipelines trust\n- Reading or modifying step scripts before execution\n- Interfering with entrypoint coordination state\n\n## Patches\n\nA patch is available at [v1.11.1](https://github.com/tektoncd/pipeline/releases/tag/v1.11.1).\n\n## Workarounds\n\n- Use admission controllers (OPA/Gatekeeper, Kyverno) to validate that VolumeMount paths do not contain `..` components.\n- In multi-tenant setups, restrict who can create Task and TaskRun resources via RBAC.\n\n## Affected Versions\n\nAll versions through **v1.11.0** (both `v1` and `v1beta1` APIs).\n\n## Acknowledgments\n\nThis vulnerability was reported by [@kodareef5](https://github.com/kodareef5).",
"id": "GHSA-rx35-6rhx-7858",
"modified": "2026-04-21T20:26:41Z",
"published": "2026-04-21T20:26:41Z",
"references": [
{
"type": "WEB",
"url": "https://github.com/tektoncd/pipeline/security/advisories/GHSA-rx35-6rhx-7858"
},
{
"type": "PACKAGE",
"url": "https://github.com/tektoncd/pipeline"
},
{
"type": "WEB",
"url": "https://github.com/tektoncd/pipeline/releases/tag/v1.11.1"
}
],
"schema_version": "1.4.0",
"severity": [
{
"score": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:N",
"type": "CVSS_V3"
}
],
"summary": "Tekton Pipelines: VolumeMount path restriction bypass via missing filepath.Clean in /tekton/ check"
}
Sightings
| Author | Source | Type | Date |
|---|
Nomenclature
- Seen: The vulnerability was mentioned, discussed, or observed by the user.
- Confirmed: The vulnerability has been validated from an analyst's perspective.
- Published Proof of Concept: A public proof of concept is available for this vulnerability.
- Exploited: The vulnerability was observed as exploited by the user who reported the sighting.
- Patched: The vulnerability was observed as successfully patched by the user who reported the sighting.
- Not exploited: The vulnerability was not observed as exploited by the user who reported the sighting.
- Not confirmed: The user expressed doubt about the validity of the vulnerability.
- Not patched: The vulnerability was not observed as successfully patched by the user who reported the sighting.