GitHub Advisoryadvisory · Go
GHSA-m2cx-gpqf-qf74 Tekton Pipelines: HTTP Resolver Unbounded Response Body Read Enables Denial of Service via Memory Exhaustion
MEDIUM
Official page ↗
- Aliases
- CVE-2026-40924
- Ecosystem
- Go
- Packages
- github.com/tektoncd/pipeline
- Severity
- Moderate
- CVSS vector
- CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H
- Weaknesses
- CWE-400
- Reviewed
- 2026-04-21
Affected packages
• Go github.com/tektoncd/pipeline: >= 1.10.0, < 1.11.1 → fixed in 1.11.1
• Go github.com/tektoncd/pipeline: >= 1.0.0, < 1.0.2 → fixed in 1.0.2
• Go github.com/tektoncd/pipeline: >= 1.2.0, < 1.3.4 → fixed in 1.3.4
• Go github.com/tektoncd/pipeline: >= 1.4.0, < 1.6.2 → fixed in 1.6.2
• Go github.com/tektoncd/pipeline: >= 1.7.0, < 1.9.3 → fixed in 1.9.3
Description
Summary
The HTTP resolver's `FetchHttpResource` function calls `io.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 the `tekton-pipelines-resolvers` pod 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 deprecated `pkg/resolution/resolver/http` and the current `pkg/remoteresolution/resolver/http` implementations.
Details
`pkg/resolution/resolver/http/resolver.go:279–307`:
```go
func FetchHttpResource(ctx context.Context, params map[string]string,
kubeclient kubernetes.Interface, logger *zap.SugaredLogger) (framework.ResolvedResource, error) {
httpClient, err := makeHttpClient(ctx) // default timeout: 1 minute
// ...
resp, err := httpClient.Do(req)
// ...
defer func() { _ = resp.Body.Close() }()
body, err := io.ReadAll(resp.Body) // ← no size limit
if err != nil {
return nil, fmt.Errorf("error reading response body: %w", err)
}
// ...
}
```
`makeHttpClient` sets `http.Client{Timeout: timeout}` where `timeout` defaults to 1 minute and is configurable via `fetch-timeout` in the `http-resolver-config` ConfigMap. 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 the `controller` container. A response of 4 GiB or larger delivered at wire speed will cause `io.ReadAll` to 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 `remoteresolution` HTTP resolver (`pkg/remoteresolution/resolver/http/resolver.go:90`) delegates directly to the same `FetchHttpResource` function and is equally affected.
PoC
```bash
Step 1: Run an HTTP server that streams a large response fast
python3 - maxBytes {
return nil, fmt.Errorf("response body exceeds maximum allowed size of %d bytes", maxBytes)
}
```
This fix must be applied to `FetchHttpResource` in `pkg/resolution/resolver/http/resolver.go`, which is shared by both the deprecated and current HTTP resolver implementations.
Related
Alias · CVE (1)
- CVE-2026-40924 Tekton Pipelines project provides k8s-style resources for declaring CI/CD-style pipelines. vulnerability
Weakness · CWE (1)
- CWE-400 Uncontrolled Resource Consumption weakness