Vulnerabilities in pkg:golang/github.com/zalando/skipper
PACKAGECVE-2026-65838 is a HIGH (CVSS 8.2) incomplete fix for cve-2026-50197: an vulnerability (CWE-444: Inconsistent Interpretation of HTTP Requests ('HTTP Request/Response Smuggling')) affecting Skipper libraries in the Go ecosystem. The issue involves incomplete fix for cve-2026-50197: an oversized body can bypass opa deny-on-presence rego policies. Remediation is available by upgrading affected packages to version 0.27.26.
pkg:golang/github.com/zalando/skipper
Vulnerability advisories affecting package pkg:golang/github.com/zalando/skipper. Select an advisory below to view technical details or fixes.
| Advisory ID | CVE / NVD | Severity | Summary |
|---|---|---|---|
| GHSA-8qqm-fp2q-v734 | CVE-2026-65838 | HIGH | Skipper: Incomplete fix for CVE-2026-50197: an oversized body can bypass OPA deny-on-presence Rego policies |
| GHSA-5gpm-rgj3-9q76 | CVE-2026-86043 | HIGH | Skipper has OPA body-authz bypass: truncated_body mitigation fails open on chunked/HTTP-2 (incomplete fix GHSA-8qqm-fp2q-v734) |
| GHSA-5587-2x54-jj6h | CVE-2026-54246 | MODERATE | Skipper's routesrv-no-auth component: All routesrv API Endpoints Lack Authentication |
| GHSA-cwxq-rc9x-2jvv | CVE-2026-54247 | MODERATE | Skipper: Unbounded Request Body Read in Admission Webhook Causes Memory Exhaustion DoS |
| GHSA-659f-rgp5-w4wf | CVE-2026-50197 | HIGH | Skipper: opaAuthorizeRequestWithBody filter bypasses OPA policy on Transfer-Encoding — chunked / HTTP/2 requests |
| GHSA-mxxc-p822-2hx9 | CVE-2026-24470 | HIGH | Skipper Ingress Controller Allows Unauthorized Access to Internal Services via ExternalName |
| GHSA-cc8m-98fm-rc9g | CVE-2026-23742 | HIGH | Skipper is vulnerable to arbitrary code execution through lua filters |
| GHSA-f2rj-m42r-6jm2 | CVE-2022-38580 | CRITICAL | Skipper vulnerable to SSRF via X-Skipper-Proxy |
| GHSA-qx2j-85q5-ffp8 | CVE-2022-34296 | HIGH | Query predicate bypass in Zalando Skipper |
CVE-2026-65838 at a Glance
Security Impact
CVSS: 8.2
The security impact metrics below are parsed directly from the CVSS v3.1 vector string (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:L/A:N).
How to Fix CVE-2026-65838
To remediate this vulnerability, upgrade all affected Skipper dependencies to a patched release. Both direct and transitive dependencies should be checked, as frameworks or security libraries may pull in vulnerable versions transitively.
Upgrade github.com/zalando/skipper to 0.27.26
Run the following command in your project directory to verify that all resolved dependencies use the patched release:
inspect dependencies for github.com/zalando/skipper
How to Check if You Are Affected
To determine whether your application is affected by CVE-2026-65838, inspect your project dependencies for Skipper:
inspect dependencies for github.com/zalando/skipper
Analyze the terminal output to locate any version of Skipper in your dependency tree. If any resolved version matches the vulnerable ranges listed in the table below (for example, versions earlier than 0.27.26), your application is affected.
Note: Verify declared build manifests and deployed runtime container environments.
Technical Details
Vulnerability Mechanism & Technical Analysis
This vulnerability is classified under CWE-444: Inconsistent Interpretation of HTTP Requests ('HTTP Request/Response Smuggling'), where the product acts as an intermediary http agent (such as a proxy or firewall) in the data flow between two entities such as a client and server, but it does not interpret malformed http requests or responses in ways that are consistent with how the messages will be processed by those entities that are at the ultimate destination. In Skipper, software state validation or input boundaries are circumvented during processing. Review the official source advisory statement below for specific affected components, classes, and reproduction details.
Source Advisory Statement
CVE-2026-65838 Affected Skipper Versions
1 component(s)| Product / Package | Ecosystem | Affected Versions | Fixed Version |
|---|---|---|---|
|
github.com/zalando/skipper
|
Go |
< 0.27.26
|
0.27.26
|
References
Frequently Asked Questions
What is CVE-2026-65838?
Which Skipper versions are affected?
What version fixes CVE-2026-65838?
Is github.com/zalando/skipper affected?
What is the CVSS score of CVE-2026-65838?
What CWE is associated with CVE-2026-65838?
How can I check Go dependencies for CVE-2026-65838?
Machine-readable OSV JSON
OSV v1.5 Schema
{
"schema_version" : "1.4.0",
"id" : "GHSA-8qqm-fp2q-v734",
"modified" : "2026-09-25T17:03:31Z",
"published" : "2026-07-17T21:49:48Z",
"aliases" : [ "CVE-2026-65838" ],
"summary" : "Skipper: Incomplete fix for CVE-2026-50197: an oversized body can bypass OPA deny-on-presence Rego policies",
"details" : "### Summary\n\nA wrong policy can be an open door. \nYou have to check `input.attributes.request.http.truncated_body` in your policy.\n\n### Description\n\nIncomplete fix for CVE-2026-50197: an oversized declared-`Content-Length` body still hands OPA an empty `parsed_body`, so deny-on-presence Rego policies fail OPEN while the full payload reaches upstream.\n\nThe CVE-2026-50197 fix (commit `3152f3b0`, PR #4041, v0.26.10) substituted `expectedSize = maxBodyBytes`\nonly when `req.ContentLength < 0` (chunked / HTTP/2 without content-length). But when a request declares a\n`Content-Length` larger than `maxBodyBytes`, `expectedSize > maxBodyBytes`, the body-extraction `if` is\nskipped entirely, and `ExtractHttpBodyOptionally` returns `rawBodyBytes = nil` — so OPA evaluates an empty\n`parsed_body`, while the full forbidden payload still flows to the upstream. A deny-on-presence policy\n(`default allow = true; allow = false if input.parsed_body.<forbidden>`) — the exact Rego shape the\nadvisory describes — fails OPEN. The fix's own comment reasons only about `ContentLength == -1`; the\noversized branch was never considered, and the added PoC test only covers small bodies.\n\n### Affected code\n\n- `filters/openpolicyagent/openpolicyagent.go` `ExtractHttpBodyOptionally`: the\n `expectedSize <= maxBodyBytes` gate lets an oversized declared body fall through to\n `return req.Body, nil, func() {}, nil` (OPA sees an empty document).\n- Corroborated by Skipper's own unit test \"Read body exhausting max bytes\" (`{ \"welcome\": \"world\" }`,\n `maxBodySize: 5` → `bodyInPolicy: \"\"`).\n\n### Steps to reproduce\n\nSee attached `docker-compose.yml` (official `golang` image) + `setup.sh` + `exploit.sh`, which run a real\nSkipper proxy (`proxytest`) with a real OPA control plane (`opasdktest`),\n`WithMaxRequestBodyBytes(32)`, policy `allow = false if input.parsed_body.action == \"delete\"`, route\n`* -> opaAuthorizeRequestWithBody(\"test\") -> upstream`:\n- `{\"action\":\"delete\"}` (19B ≤ 32) → **403** (denied).\n- `{\"action\":\"delete\",\"pad\":\"X..64\"}` (> 32) → **200**, upstream received the full body (BYPASS).\n- small chunked `{\"action\":\"delete\"}` → **403** (positive control: the original CVE is fixed).\n\n(Library-tier: validated via Skipper's real proxy test harness, not a deploy of the official image; benign\noracle = status diff + upstream-received body; no RCE.)\n\n### Impact\n\nDeployments authorizing on request-body content via `opaAuthorizeRequestWithBody` + deny-on-presence Rego\ncan be bypassed by inflating the request body past `-open-policy-agent-max-request-body-size` (default\n1 MB); the full payload still reaches the upstream.\n\n### Mitigation\n\nDocument how policy owners should block requests with oversized body.\n\nExample deny by default and use \"allow if\" no oversized body:\n```rego\ndefault allow := false\n\nallow if {\n input.attributes.request.http.truncated_body == false\n # ... body-based conditions\n}\n```\n\nExample allow by default and use \"deny if\" an oversized body:\n```rego\ndefault deny := false\n\ndeny if {\n input.attributes.request.http.truncated_body == true\n # ... body-based conditions\n}\n```\n\nDocumentation is published by https://github.com/zalando/skipper/releases/tag/v0.27.26\n\n### Credit\n\nReported as part of an incomplete-patch measurement study (responsible disclosure).",
"severity" : [ {
"type" : "CVSS_V3",
"score" : "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:L/A:N"
} ],
"affected" : [ {
"package" : {
"ecosystem" : "Go",
"name" : "github.com/zalando/skipper"
},
"ranges" : [ {
"type" : "ECOSYSTEM",
"events" : [ {
"introduced" : "0"
}, {
"fixed" : "0.27.26"
} ]
} ]
} ],
"references" : [ {
"type" : "WEB",
"url" : "https://github.com/zalando/skipper/security/advisories/GHSA-8qqm-fp2q-v734"
}, {
"type" : "ADVISORY",
"url" : "https://nvd.nist.gov/vuln/detail/CVE-2026-65838"
}, {
"type" : "WEB",
"url" : "https://github.com/zalando/skipper/commit/2cfceabaa6ff0af65b312dcb9bcbe84691b9d507"
}, {
"type" : "PACKAGE",
"url" : "https://github.com/zalando/skipper"
}, {
"type" : "WEB",
"url" : "https://github.com/zalando/skipper/releases/tag/v0.27.26"
}, {
"type" : "WEB",
"url" : "https://github.com/zalando/skipper/releases/tag/v0.27.35"
} ],
"database_specific" : {
"cwe_ids" : [ "CWE-444" ],
"severity" : "HIGH",
"github_reviewed" : true,
"github_reviewed_at" : "2026-07-17T21:49:48Z",
"nvd_published_at" : "2026-09-14T20:16:49Z"
}
}