Update module github.com/tektoncd/pipeline to v1.9.3 [SECURITY] (main)#3201
Open
renovate[bot] wants to merge 1 commit into
Open
Update module github.com/tektoncd/pipeline to v1.9.3 [SECURITY] (main)#3201renovate[bot] wants to merge 1 commit into
renovate[bot] wants to merge 1 commit into
Conversation
38311a7 to
cbf8b3a
Compare
cbf8b3a to
0f86846
Compare
ab72bfd to
59df019
Compare
df068df to
06a28ac
Compare
auto-merge was automatically disabled
April 27, 2026 17:38
Pull request was closed
06a28ac to
946e93b
Compare
3e5f982 to
eb2b608
Compare
5beb5a9 to
f93c37d
Compare
f93c37d to
02297c2
Compare
Codecov Report✅ All modified and coverable lines are covered by tests.
Flags with carried forward coverage won't be shown. Click here to find out more. 🚀 New features to boost your workflow:
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
v1.9.2→v1.9.3Tekton Pipelines: Git resolver API mode leaks system-configured API token to user-controlled serverURL
CVE-2026-40161 / GHSA-wjxp-xrpv-xpff
More information
Details
Summary
The Tekton Pipelines git resolver in API mode sends the system-configured Git API token to a user-controlled
serverURLwhen the user omits thetokenparameter. A tenant with TaskRun or PipelineRun create permission can exfiltrate the shared API token (GitHub PAT, GitLab token, etc.) by pointingserverURLto an attacker-controlled endpoint.Details
The git resolver's
ResolveAPIGit()function inpkg/resolution/resolver/git/resolver.goconstructs an SCM client using the user-suppliedserverURLand a token obtained viagetAPIToken().When the user provides
serverURLbut omits thetokenparameter:getSCMTypeAndServerURL()readsserverURLdirectly from user params (params[ServerURLParam]) with no validation against the system-configured URL.secretRefis set tonilbecause the user did not provide a token parameter.getAPIToken(ctx, nil, APISecretNameKey)is called. It detectsapiSecret == nil, creates a newsecretCacheKey, and populates it from the system-configured secret (conf.APISecretName/conf.APISecretNamespace/SYSTEM_NAMESPACE).clientFunc(scmType, serverURL, string(apiToken))creates an SCM client pointed at the attacker-controlled URL with the system token. The SCM factory sets the token as anAuthorizationheader on the HTTP client.All subsequent API calls (
Contents.Find,Git.FindCommit) carry the system token to the attacker URL.Impact
The system Git API token (GitHub PAT, GitLab token, etc.) is exfiltrated to an attacker-controlled endpoint. This token typically has read access to private repositories containing source code, secrets, and CI/CD configurations.
This follows the same threat model as GHSA-j5q5-j9gm-2w5c (published March 2026): a namespace-scoped tenant with permission to create TaskRuns exploits the git resolver to exfiltrate credentials. The prior advisory involved reading the resolver pod's ServiceAccount token via path traversal. This finding involves redirecting the system Git API token via
serverURL.Patches
Fixed in:
The fix validates that when
serverURLis user-provided and differs from the system-configured server URL, the user must also provide their owntokenparameter. Using the system token with a non-system server URL is rejected.Workarounds
tokenparameter.NetworkPolicyto thetekton-pipelines-resolversnamespace to restrict outbound traffic to known-good Git servers only.Affected Versions
All releases from v1.0.0 through v1.10.0, including all patch releases. The API mode of the git resolver has been present since the resolver was introduced.
Releases prior to v1.0.0 are not affected because the git resolver either did not exist or did not have API mode.
Acknowledgments
This vulnerability was reported by Koda Reef (@kodareef5), who provided a detailed analysis and proof-of-concept. Thank you!
References
api-token-secret-namespace)Severity
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:NReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Tekton Pipeline: Git Resolver Unsanitized Revision Parameter Enables git Argument Injection Leading to RCE
CVE-2026-40938 / GHSA-94jr-7pqp-xhcq
More information
Details
Summary
The git resolver's
revisionparameter is passed directly as a positional argument togit fetchwithout any validation that it does not begin with a-character. Because git parses flags from mixed positional arguments, an attacker can inject arbitrarygit fetchflags such as--upload-pack=<binary>. Combined with thevalidateRepoURLfunction explicitly permitting URLs that begin with/(local filesystem paths), a tenant who can submitResolutionRequestobjects can chain these two behaviors to execute an arbitrary binary on the resolver pod. Thetekton-pipelines-resolversServiceAccount holds cluster-wideget/list/watchon all Secrets, so code execution on the resolver pod enables full cluster-wide secret exfiltration.Details
Root Cause 1 — Unvalidated
revisionparameter passed togit fetchpkg/resolution/resolver/git/repository.go:85:execGitinvokesexec.CommandContext("git", ...)— no shell is used, so shell metacharacters cannot be injected. However, git itself parses flags from mixed positional arguments. Whenrevision = "--upload-pack=/path/to/binary", git receives this as the flag--upload-pack=/path/to/binary, not as a refspec.PopulateDefaultParams(resolver.go:418–424) applies only a leading-slash strip and acontainsDotDotcheck on thepathInRepoparameter; therevisionparameter receives no validation at all.Root Cause 2 —
validateRepoURLexplicitly permits local filesystem pathspkg/resolution/resolver/git/resolver.go:154-158:Any URL beginning with
/passes validation and is used directly as the argument togit clone. This means a local filesystem path such as/tmp/some-repois a valid resolver URL.Exploit Chain
--upload-pack=<binary>causes git to execute the specified binary as the upload-pack server when communicating with the remote. For local-path remotes (/path), git invokes the binary on the resolver pod itself with the repository path as its sole argument. Because the argument is passed viaexec.Commandas a single--upload-pack=<binary>string (not split by a shell), only binaries at known paths can be invoked — but several useful binaries exist in the resolver pod image (e.g.,/bin/sh,/usr/bin/curl,/bin/cp).Attack complexity is High because the exploit requires either:
/tmp/<reponame>-<suffix>from a concurrent resolution), orPoC
Verified:
git fetch origin --upload-pack=/tmp/test-exec.sh --depth=1executestest-exec.shon the local machine even whenoriginis a local filesystem path. Exit code 0 was observed with the test binary executed successfully.Impact
/tmpon the resolver pod.tekton-pipelines-resolversServiceAccount is bound to a ClusterRole that grantsget/list/watchon all Secrets in all namespaces (config/resolvers/200-clusterrole.yaml). Code execution on the resolver pod is therefore equivalent to reading every Secret in the cluster.pkg/resolution/resolver/git/) and the current resolver (pkg/remoteresolution/resolver/git/) share the samevalidateRepoURL,PopulateDefaultParams, andcheckoutimplementation via the sharedgitpackage. Both are affected.Recommended Fix
Fix 1 — Validate that
revisiondoes not begin with-inPopulateDefaultParams:Fix 2 — Restrict
validateRepoURLto remote URLs only (remove local-path support in production builds, or add an explicit admin opt-in feature flag):Applying Fix 1 alone is sufficient to prevent the argument injection. Fix 2 eliminates the enabling condition (local-path remotes for which
--upload-packruns locally) and reduces attack surface further.Severity
CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:HReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Tekton Pipelines: VolumeMount path restriction bypass via missing filepath.Clean in /tekton/ check
CVE-2026-40923 / GHSA-rx35-6rhx-7858
More information
Details
Summary
A validation bypass in the VolumeMount path restriction allows mounting
volumes under restricted
/tekton/internal paths by using..pathtraversal components. The restriction check uses
strings.HasPrefixwithout
filepath.Clean, so a path like/tekton/home/../resultspasses validation but resolves to
/tekton/resultsat runtime.Details
Tekton Pipelines restricts VolumeMount paths under
/tekton/(except/tekton/home) to prevent users from interfering with internalexecution state. The validation at
pkg/apis/pipeline/v1/container_validation.gochecks mount paths usingstrings.HasPrefixwithout normalizing the path first:Because
/tekton/homeis an allowed prefix, a path like/tekton/home/../resultspasses both checks. At runtime, the containerruntime 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:
Patches
(to be filled: fixed in versions X.Y.Z)
Workarounds
VolumeMount paths do not contain
..components.resources via RBAC.
Affected Versions
All versions through v1.10.0 (both
v1andv1beta1APIs).Acknowledgments
This vulnerability was reported by @kodareef5.
Severity
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:NReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Tekton Pipelines: HTTP Resolver Unbounded Response Body Read Enables Denial of Service via Memory Exhaustion
CVE-2026-40924 / GHSA-m2cx-gpqf-qf74
More information
Details
Summary
The HTTP resolver's
FetchHttpResourcefunction callsio.ReadAll(resp.Body)with no response body size limit. Any tenant with permission to create TaskRuns or PipelineRuns that reference the HTTP resolver can point it at an attacker-controlled HTTP server that returns a very large response body within the 1-minute timeout window, causing thetekton-pipelines-resolverspod to be OOM-killed by Kubernetes. Because all resolver types (Git, Hub, Bundle, Cluster, HTTP) run in the same pod, crashing this pod denies resolution service to the entire cluster. Repeated exploitation causes a sustained crash loop. The same vulnerable code path is reached by both the deprecatedpkg/resolution/resolver/httpand the currentpkg/remoteresolution/resolver/httpimplementations.Details
pkg/resolution/resolver/http/resolver.go:279–307:makeHttpClientsetshttp.Client{Timeout: timeout}wheretimeoutdefaults to 1 minute and is configurable viafetch-timeoutin thehttp-resolver-configConfigMap. The timeout bounds the duration of the entire request (including body read), which limits slow-drip attacks. However, it does not limit the total number of bytes allocated. A fast HTTP server can deliver multi-gigabyte responses well within the 1-minute window.The resolver deployment (
config/core/deployments/resolvers-deployment.yaml) sets a 4 GiB memory limit on thecontrollercontainer. A response of 4 GiB or larger delivered at wire speed will causeio.ReadAllto allocate 4 GiB, triggering an OOM-kill. With the default timeout of 60 seconds, a server delivering at 100 MB/s can supply 6 GB — well above the 4 GiB limit — before the timeout fires.The
remoteresolutionHTTP resolver (pkg/remoteresolution/resolver/http/resolver.go:90) delegates directly to the sameFetchHttpResourcefunction and is equally affected.PoC
Note: On clusters where operators have set a higher
fetch-timeout(e.g.,10m), the attacker has more time to deliver a larger body, and the attack is more reliable. On clusters with tight memory limits on the resolver pod, a smaller payload suffices.Impact
tekton-pipelines-resolverspod denies all resolution services cluster-wide until Kubernetes restarts the pod.Recommended Fix
Wrap
resp.Bodywithio.LimitReaderbefore passing toio.ReadAll. Add a configurablemax-body-sizeoption to thehttp-resolver-configConfigMap with a sensible default (e.g., 50 MiB, which exceeds the size of any realistic pipeline YAML file):This fix must be applied to
FetchHttpResourceinpkg/resolution/resolver/http/resolver.go, which is shared by both the deprecated and current HTTP resolver implementations.Severity
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:HReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Release Notes
tektoncd/pipeline (github.com/tektoncd/pipeline)
v1.9.3: Tekton Pipeline release v1.9.3 "Devon Rex Dreadnought"Compare Source
-Docs @ v1.9.3
-Examples @ v1.9.3
Installation one-liner
Attestation
The Rekor UUID for this release is
108e9186e8c5677a7943c77b03fff46f83c0876773ae3dcc84e6dcb29d64ca605afb3cbc0ff77ecbObtain the attestation:
Verify that all container images in the attestation are in the release file:
Changes
GHSA-wjxp-xrpv-xpff / CVE-2026-40161 (HIGH): Git resolver API mode leaks system-configured API token to user-controlled
serverURL. A user who can create TaskRuns can exfiltrate the system Git API token by pointing the resolver at an attacker-controlled server.GHSA-94jr-7pqp-xhcq / CVE-2026-40938 (HIGH): Git resolver unsanitized revision parameter enables argument injection. A malicious
revisionvalue can inject arbitrary flags into thegitCLI, potentially leading to remote code execution on the resolver pod.GHSA-rx35-6rhx-7858 / CVE-2026-40923 (Medium): VolumeMount path restriction bypass via missing filepath normalization. Paths like
/tekton/../sensitivebypass the/tekton/prefix restriction check.GHSA-rmx9-2pp3-xhcr / CVE-2026-25542 (Medium): VerificationPolicy regex pattern bypass via substring matching. Unanchored patterns allow partial matches, letting unsigned resources pass verification.
GHSA-m2cx-gpqf-qf74 / CVE-2026-40924 (Medium): HTTP resolver unbounded response body read enables OOM denial of service. A malicious URL returning a very large response can exhaust the resolver pod's memory. Response body is now limited to 1 MiB.
Fixes
running_taskrunsmetric overcounting TaskRuns with no conditionTextParserstruct usage for prometheus/common v0.62.0 compatibilityConfiguration
📅 Schedule: (UTC)
🚦 Automerge: Enabled.
♻ Rebasing: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.