GHSA-RX35-6RHX-7858
Vulnerability from github – Published: 2026-04-21 20:26 – Updated: 2026-05-22 15:40Summary
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
(to be filled: fixed in versions X.Y.Z)
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.10.0 (both v1 and v1beta1 APIs).
Acknowledgments
This vulnerability was reported by @kodareef5.
{
"affected": [
{
"package": {
"ecosystem": "Go",
"name": "github.com/tektoncd/pipeline"
},
"ranges": [
{
"events": [
{
"introduced": "1.10.0"
},
{
"fixed": "1.11.1"
}
],
"type": "ECOSYSTEM"
}
]
},
{
"package": {
"ecosystem": "Go",
"name": "github.com/tektoncd/pipeline"
},
"ranges": [
{
"events": [
{
"introduced": "1.7.0"
},
{
"fixed": "1.9.3"
}
],
"type": "ECOSYSTEM"
}
]
},
{
"package": {
"ecosystem": "Go",
"name": "github.com/tektoncd/pipeline"
},
"ranges": [
{
"events": [
{
"introduced": "1.4.0"
},
{
"fixed": "1.6.2"
}
],
"type": "ECOSYSTEM"
}
]
},
{
"package": {
"ecosystem": "Go",
"name": "github.com/tektoncd/pipeline"
},
"ranges": [
{
"events": [
{
"introduced": "1.2.0"
},
{
"fixed": "1.3.4"
}
],
"type": "ECOSYSTEM"
}
]
},
{
"package": {
"ecosystem": "Go",
"name": "github.com/tektoncd/pipeline"
},
"ranges": [
{
"events": [
{
"introduced": "1.0.0"
},
{
"fixed": "1.0.2"
}
],
"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": "2026-04-21T21:16:45Z",
"severity": "MODERATE"
},
"details": "### Summary\n\nA validation bypass in the VolumeMount path restriction allows mounting\nvolumes under restricted `/tekton/` internal paths by using `..` path\ntraversal components. The restriction check uses `strings.HasPrefix`\nwithout `filepath.Clean`, so a path like `/tekton/home/../results`\npasses validation but resolves to `/tekton/results` at runtime.\n\n### Details\n\nTekton Pipelines restricts VolumeMount paths under `/tekton/` (except\n`/tekton/home`) to prevent users from interfering with internal\nexecution state. The validation at\n`pkg/apis/pipeline/v1/container_validation.go` checks mount paths using\n`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\n`/tekton/home/../results` passes both checks. At runtime, the container\nruntime resolves `..` and the actual mount point becomes\n`/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\nmount 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\n_(to be filled: fixed in versions X.Y.Z)_\n\n### Workarounds\n\n- Use admission controllers (OPA/Gatekeeper, Kyverno) to validate that\n VolumeMount paths do not contain `..` components.\n- In multi-tenant setups, restrict who can create Task and TaskRun\n resources via RBAC.\n\n### Affected Versions\n\nAll versions through **v1.10.0** (both `v1` and `v1beta1` APIs).\n\n### Acknowledgments\n\nThis vulnerability was reported by @kodareef5.",
"id": "GHSA-rx35-6rhx-7858",
"modified": "2026-05-22T15:40:40Z",
"published": "2026-04-21T20:26:41Z",
"references": [
{
"type": "WEB",
"url": "https://github.com/tektoncd/pipeline/security/advisories/GHSA-rx35-6rhx-7858"
},
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-40923"
},
{
"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 | Other |
|---|
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.