Vulnerabilities in pkg:golang/github.com/zalando/skipper

PACKAGE
Advisory Identifier: GHSA-8qqm-fp2q-v734
Advisory Summary

CVE-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.

9 Known Advisory Record(s)
Package Vulnerability Intelligence

pkg:golang/github.com/zalando/skipper

9 Known Advisory Record(s)

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

CVE Identifier CVE-2026-65838
GHSA Identifier GHSA-8qqm-fp2q-v734
Severity HIGH
CVSS v3.1 Base Score 8.2
CWE Classification CWE-444: Inconsistent Interpretation of HTTP Requests ('HTTP Request/Response Smuggling')
Affected Product Skipper
Package Ecosystem Go
Published Date
Last Updated

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).

Attack Vector Network (AV:N)
Attack Complexity Low (AC:L)
Privileges Required None (PR:N)
User Interaction None (UI:N)
Scope Unchanged (S:U)
Confidentiality High (C:H)
Integrity Low (I:L)
Availability None (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.

github.com/zalando/skipper fixed: 0.27.26
Upgrade github.com/zalando/skipper to 0.27.26
Verify Direct and Transitive Dependencies

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

### Summary A wrong policy can be an open door. You have to check `input.attributes.request.http.truncated_body` in your policy. ### Description Incomplete 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. The CVE-2026-50197 fix (commit `3152f3b0`, PR #4041, v0.26.10) substituted `expectedSize = maxBodyBytes` only when `req.ContentLength < 0` (chunked / HTTP/2 without content-length). But when a request declares a `Content-Length` larger than `maxBodyBytes`, `expectedSize > maxBodyBytes`, the body-extraction `if` is skipped entirely, and `ExtractHttpBodyOptionally` returns `rawBodyBytes = nil` — so OPA evaluates an empty `parsed_body`, while the full forbidden payload still flows to the upstream. A deny-on-presence policy (`default allow = true; allow = false if input.parsed_body.<forbidden>`) — the exact Rego shape the advisory describes — fails OPEN. The fix's own comment reasons only about `ContentLength == -1`; the oversized branch was never considered, and the added PoC test only covers small bodies. ### Affected code - `filters/openpolicyagent/openpolicyagent.go` `ExtractHttpBodyOptionally`: the `expectedSize <= maxBodyBytes` gate lets an oversized declared body fall through to `return req.Body, nil, func() {}, nil` (OPA sees an empty document). - Corroborated by Skipper's own unit test "Read body exhausting max bytes" (`{ "welcome": "world" }`, `maxBodySize: 5` → `bodyInPolicy: ""`). ### Steps to reproduce See attached `docker-compose.yml` (official `golang` image) + `setup.sh` + `exploit.sh`, which run a real Skipper proxy (`proxytest`) with a real OPA control plane (`opasdktest`), `WithMaxRequestBodyBytes(32)`, policy `allow = false if input.parsed_body.action == "delete"`, route `* -> opaAuthorizeRequestWithBody("test") -> upstream`: - `{"action":"delete"}` (19B ≤ 32) → **403** (denied). - `{"action":"delete","pad":"X..64"}` (> 32) → **200**, upstream received the full body (BYPASS). - small chunked `{"action":"delete"}` → **403** (positive control: the original CVE is fixed). (Library-tier: validated via Skipper's real proxy test harness, not a deploy of the official image; benign oracle = status diff + upstream-received body; no RCE.) ### Impact Deployments authorizing on request-body content via `opaAuthorizeRequestWithBody` + deny-on-presence Rego can be bypassed by inflating the request body past `-open-policy-agent-max-request-body-size` (default 1 MB); the full payload still reaches the upstream. ### Mitigation Document how policy owners should block requests with oversized body. Example deny by default and use "allow if" no oversized body: ```rego default allow := false allow if { input.attributes.request.http.truncated_body == false # ... body-based conditions } ``` Example allow by default and use "deny if" an oversized body: ```rego default deny := false deny if { input.attributes.request.http.truncated_body == true # ... body-based conditions } ``` Documentation is published by https://github.com/zalando/skipper/releases/tag/v0.27.26 ### Credit Reported as part of an incomplete-patch measurement study (responsible disclosure).

CVE-2026-65838 Affected Skipper Versions

1 component(s)
Fixed Versions:
0.27.26
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?
CVE-2026-65838 is a security vulnerability in Skipper involving Incomplete fix for CVE-2026-50197: an oversized body can bypass OPA deny-on-presence Rego policies under CWE-444: Inconsistent Interpretation of HTTP Requests ('HTTP Request/Response Smuggling').
Which Skipper versions are affected?
Affected versions include releases prior to 0.27.26 across affected packages: github.com/zalando/skipper.
What version fixes CVE-2026-65838?
Upgrading to 0.27.26 (or the latest patched release for your respective branch) resolves the vulnerability.
Is github.com/zalando/skipper affected?
Yes, github.com/zalando/skipper is affected in releases prior to 0.27.26. Upgrade your dependency to 0.27.26 or later.
What is the CVSS score of CVE-2026-65838?
CVE-2026-65838 has a CVSS v3.1 base score of 8.2 (HIGH) with vector string CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:L/A:N.
What CWE is associated with CVE-2026-65838?
CVE-2026-65838 is classified under CWE-444: Inconsistent Interpretation of HTTP Requests ('HTTP Request/Response Smuggling') (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.).
How can I check Go dependencies for CVE-2026-65838?
Run the dependency tree command: 'inspect dependencies for github.com/zalando/skipper'. This command lists direct and transitive dependencies in your build configuration so you can verify if a vulnerable version is resolved.
Machine-readable OSV JSON OSV v1.5 Schema
Normalized schema output
{
  "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"
  }
}