Update module github.com/traefik/traefik/v3 to v3.6.12 [SECURITY]#59
Open
renovate[bot] wants to merge 1 commit intomainfrom
Open
Update module github.com/traefik/traefik/v3 to v3.6.12 [SECURITY]#59renovate[bot] wants to merge 1 commit intomainfrom
renovate[bot] wants to merge 1 commit intomainfrom
Conversation
Contributor
Author
ℹ️ Artifact update noticeFile name: go.modIn order to perform the update(s) described in the table above, Renovate ran the
Details:
|
8895808 to
a6e8eb2
Compare
a6e8eb2 to
3d67655
Compare
3d67655 to
5809add
Compare
5809add to
4cca449
Compare
985b34a to
eea5f86
Compare
eea5f86 to
01d2d73
Compare
01d2d73 to
2def3a9
Compare
2def3a9 to
9bf985d
Compare
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:
v3.6.4→v3.6.12GitHub Vulnerability Alerts
CVE-2026-32695
Summary
There is a potential vulnerability in Traefik's Kubernetes Knative, Ingress, and Ingress-NGINX providers related to rule injection.
User-controlled values are interpolated into backtick-delimited Traefik router rule expressions without escaping or validation. A malicious value containing a backtick can terminate the literal and inject additional operators into Traefik's rule language, altering the parsed rule tree. In shared or multi-tenant deployments, this can bypass host and header routing constraints and redirect unauthorized traffic to victim services.
Patches
For more information
If there are any questions or comments about this advisory, please open an issue.
Original Description
Summary
Traefik's Knative provider builds router rules by interpolating user-controlled values into backtick-delimited rule expressions without escaping. In live cluster validation, Knative
rules[].hosts[]was exploitable for host restriction bypass (for exampletenant.example.com) || Host(attacker.com), producing a router that serves attacker-controlled hosts. Knativeheaders[].exactalso allows rule-syntax injection and proves unsafe rule construction. In multi-tenant clusters, this can route unauthorized traffic to victim services and lead to cross-tenant traffic exposure. Severity is High in shared deployments.Tested on Traefik
v3.6.10; the vulnerable pattern appears to have been present since the Knative provider was introduced. Earlier versions with Knative provider support are expected to be affected.Details
The issue is caused by unsafe rule-string construction using
fmt.Sprintfwith backtick-delimited literals.Incriminated code patterns:
pkg/provider/kubernetes/knative/kubernetes.gofmt.Sprintf("Host(%v)", host)fmt.Sprintf("Header(%s,%s)", key, headers[key].Exact)fmt.Sprintf("PathPrefix(%s)", path)pkg/provider/kubernetes/ingress/kubernetes.gofmt.Sprintf("Host(%s)", host)fmt.Sprintf("(Path(%[1]s) || PathPrefix(%[1]s/))", path)pkg/provider/kubernetes/ingress-nginx/kubernetes.go(hardening candidate; not the primary confirmed vector in this report)fmt.Sprintf("Header(%s,%s)", c.Header, c.HeaderValue)Because inputs are inserted directly into rule expressions, a malicious value containing a backtick can terminate the literal and inject additional operators/tokens in Traefik's rule language. Example payload:
x) || Host(attacker.comWhen used as a header value in Knative rule construction, the resulting rule contains:
Header(X-Poc,x) || Host(attacker.com)This alters rule semantics and enables injection into Traefik's rule language. Depending on the field used (
hosts[]vsheaders[].exact) this can become a direct routing bypass.Important scope note:
pkg/provider/kubernetes/gateway/httproute.go) already uses safer%qformatting for header/query rules and is not affected by this exact pattern.spec.rules.hostis validated as DNS-1123 by the API server, which rejects backticks (so this specific host-injection payload is typically blocked).rules[].hosts[]andheaders[].exactare typed asstringin CRD schema with no pattern constraint.rules[].hosts[]was accepted and produced a practical host bypass.headers[].exactwas also accepted and produced rule-syntax injection in generated routers.PoC
poc_build_rule.gogo run poc_build_rule.go(Host(tenant.example.com)) && (Header(X-API-Key,secret123)) && PathPrefix(/)(Host(tenant.example.com)) && (Header(X-API-Key,x) || Host(attacker.com)) && PathPrefix(/)Inline PoC code (self-contained):
kubectl apply -f - <<'YAML'networking.internal.knative.dev/v1alpha1andnetworking.knative.dev/v1alpha1.)(Host(tenant.example.com) || Host(attacker.com)) && PathPrefix(/).Host: attacker.comreturns backend 200.kubectl apply -f - <<'YAML'|| Host(attacker.com)is present.Host: attacker.comand no expected tenant header (expected: 404 for this payload shape, because leadingHost(tenant)still applies).Host: tenant.example.comandX-Poc: x(expected: 200 from backend).kubectl apply -f - <<'YAML'hostmust satisfy DNS-1123.Validation executed in this report:
go runand output matched expected injected rule.kindcluster (kind-traefik-poc) with Traefikv3.6.10and Knative Serving CRDs.networking.knative.dev/ingress.class(dot). The hyphen variant was not used by the successful processing path.Host: attacker.comreached backend (200) for Knative host-injection payload.Impact
CVE-2026-33433
Summary
There is a potential vulnerability in Traefik's Basic and Digest authentication middlewares when
headerFieldis configured with a non-canonical HTTP header name.An authenticated attacker with valid credentials can inject the canonical version of the configured header to impersonate any identity to the backend. Because Traefik writes the authenticated username using a non-canonical map key, it creates a separate header entry rather than overwriting the attacker's canonical one — causing most backend frameworks to read the attacker-controlled value instead.
Patches
For more information
If there are any questions or comments about this advisory, please open an issue.
Original Description
Summary
When
headerFieldis configured with a non-canonical HTTP header name (e.g.,x-auth-userinstead ofX-Auth-User), an authenticated attacker can inject a canonical version of that header to impersonate any identity to the backend. The backend receives two header entries — the attacker-injected canonical one is read first, overriding Traefik's non-canonical write.Tested on Traefik v3.6.10.
Details
At
pkg/middlewares/auth/basic_auth.go:92, the authenticated username is written using direct map assignment:Go's
http.Headermap is keyed by canonical names (e.g.,X-Auth-User). Direct assignment with a non-canonical key (x-auth-user) creates a separate map entry from any canonical-key entry already present. The attacker'sX-Auth-User: superadminoccupies the canonical slot and is never overwritten by Traefik's non-canonical write.The same bug exists in
pkg/middlewares/auth/digest_auth.go:100. Notably,forward.go:254correctly useshttp.CanonicalHeaderKey(), showing the fix pattern already exists in the codebase.PoC
Traefik config (YAML, Docker labels, or REST API):
Normal request (baseline):
Attack request:
Control test — when
headerFielduses canonical casing (X-Auth-User), the attack fails. Traefik's write correctly overwrites the attacker's header.This is realistic because YAML conventions favor lowercase keys, Traefik docs don't warn about canonicalization, and the pattern of backends trusting the
headerFieldheader is recommended in Traefik's own documentation.Fix suggestion:
Also strip any incoming
headerFieldheader before the auth check withreq.Header.Del(b.headerField).Impact
An authenticated attacker with valid credentials (even low-privilege) can impersonate any other user identity to backend services. If backends use the
headerFieldheader for authorization decisions (which is the intended use case per Traefik docs), this enables privilege escalation — e.g., a regular user impersonating an admin.The attack requires the operator to configure
headerFieldwith a non-canonical header name, which is the natural thing to do in YAML and is not warned against in documentation.Release Notes
traefik/traefik (github.com/traefik/traefik/v3)
v3.6.12Compare Source
All Commits
Bug fixes:
Documentation:
v3.6.11Compare Source
All Commits
Bug fixes:
Documentation:
v3.6.10Compare Source
All Commits
Bug fixes:
Documentation:
.httpto TOML table names (#12713 by Darsstar)v3.6.9Compare Source
All Commits
Bug fixes:
Documentation:
v3.6.8Compare Source
All Commits
Bug fixes:
Documentation:
Misc:
v3.6.7Compare Source
All Commits
Bug fixes:
Documentation:
Misc:
v3.6.6Compare Source
All Commits
Bug fixes:
Documentation:
Misc:
v3.6.5Compare Source
All Commits
Bug fixes:
Documentation:
Misc:
Configuration
📅 Schedule: Branch creation - "" (UTC), Automerge - At any time (no schedule defined).
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, 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.