Skip to main content

Zalando Skipper CVE-2026-65838

| EUVDEUVD-2026-78059 HIGH
Improper Check for Unusual or Exceptional Conditions (CWE-754)
2026-09-14 GitHub_M GHSA-8qqm-fp2q-v734
8.2
CVSS 3.1 · Vendor: GitHub_M
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Identify Skipper proxy using opaAuthorizeRequestWithBody filter
  2. Delivery
    Craft POST body with forbidden payload padded beyond 1 MB size limit
  3. Exploit
    Send request with oversized Content-Length header
  4. Execution
    ExtractHttpBodyOptionally skips body read, returns nil to OPA
  5. Persist
    OPA evaluates empty parsed_body, deny-on-presence policy passes
  6. Impact
    Full forbidden payload forwarded to upstream service

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A10:2025 - Mishandling of Exceptional Conditions
ASVS 5.0
V16 - Security Logging and Error Handling Unusual condition handling
Exploitation Conditions

Exploitation requires ALL of the following conditions simultaneously: (1) Skipper is deployed with the opaAuthorizeRequestWithBody filter (not opaAuthorizeRequest, which does not parse the body); (2) the associated OPA Rego policy uses deny-on-presence logic that inspects input.parsed_body fields (e.g., allow = false if input.parsed_body.<field> == <value>); (3) the Rego policy does NOT include a guard on input.attributes.request.http.truncated_body or input.truncated_body; and (4) the attacker can craft a request body that exceeds -open-policy-agent-max-request-body-size (default 1048576 bytes / 1 MB) by padding the payload while keeping the forbidden field present. Deployments using opaAuthorizeRequest (without body), policies that default-deny rather than deny-on-presence, policies that already check the truncated_body signal, or body sizes consistently under the limit are not affected. The original chunked-body vector from CVE-2026-50197 is fixed in v0.26.10 and is not reintroduced here.

Impact

The NVD-assigned CVSS vector (AV:N/AC:L/PR:N/UI:N/C:H/I:L) overstates the impact profile in two ways: complexity is genuinely high because exploitation requires the specific combination of opaAuthorizeRequestWithBody deployment, a deny-on-presence Rego policy that inspects parsed_body, a policy that does NOT check truncated_body, and a request body exceeding the size limit; and the primary impact is integrity (forbidden operations reaching the protected upstream), not confidentiality. The C:H/I:L assignment appears inverted relative to the actual threat model. The EPSS score is not provided, but given the configuration-gated nature of the flaw and the niche product footprint, real-world exploitation probability is moderate at most. There is no KEV listing and no standalone public exploit identified - only a researcher-provided Docker Compose reproduction harness in the GHSA advisory. Even a mid-sized municipal IT team in leszno running Skipper as an API gateway with OPA body-based authorization would only be exposed if they have deny-on-presence Rego policies that omit the truncated_body guard, a condition that many well-audited policies would already handle. The fail-open consequence is severe for the specific affected pattern, but the preconditions meaningfully limit exposed population. Defenders should audit Rego policies for any if input.parsed_body.<field> deny logic and verify the truncated_body guard is present regardless of patch status.

Exploit ScenarioDerived

An attacker targeting a microservice protected by a Skipper proxy configured with opaAuthorizeRequestWithBody and a deny-on-presence policy (e.g., allow = false if input.parsed_body.action == 'delete') sends a POST request containing the forbidden payload padded to exceed the 1 MB OPA body-size limit, declaring the full size in Content-Length. Skipper's ExtractHttpBodyOptionally skips body extraction, OPA evaluates an empty parsed_body and returns allow, and the complete body - including the forbidden action: delete field - is forwarded to the upstream service. No public exploit tool exists at time of analysis, but the GHSA advisory includes a Docker Compose reproduction harness demonstrating the bypass from a 403 to a 200 status.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
Patch available 0.3% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Sep 15, 2026

Authorization bypass in Zalando Skipper's opaAuthorizeRequestWithBody filter allows unauthenticated remote attackers to deliver forbidden request bodies to upstream services by inflating the declared Content-Length beyond the configured OPA body-size limit. When a body exceeds -open-policy-agent-max-request-body-size (default 1 MB), ExtractHttpBodyOptionally skips body extraction and returns nil bytes to OPA, causing deny-on-presence Rego policies to evaluate an empty parsed_body and fail open, while the complete forbidden payload is still forwarded upstream unchanged. This is an incomplete remediation of CVE-2026-50197 - the prior fix addressed only chunked/HTTP-2 requests with negative Content-Length; the oversized Content-Length path was never considered. No public exploit has been identified at time of analysis, though the GHSA advisory includes a working reproduction harness.

RemediationAI

Upgrade Zalando Skipper to v0.27.35 or later, available at https://github.com/zalando/skipper/releases/tag/v0.27.35 and via the Go module path github.com/zalando/skipper. The fix is implemented in commit 2cfceabaa6ff0af65b312dcb9bcbe84691b9d507, which adds accurate body-truncation signaling through the bodyTruncated flag passed to AdaptToExtAuthRequest and surfaced to OPA as the x-envoy-auth-partial-body header and input.attributes.request.http.truncated_body attribute. As a compensating control before patching, audit all Rego policies that use deny-on-presence logic against input.parsed_body and add an explicit guard: allow = false if { not input.attributes.request.http.truncated_body; input.parsed_body.action == 'delete' } - this forces OPA to reject requests where the body was truncated rather than allowing them through. Alternatively, lower -open-policy-agent-max-request-body-size to a value larger than any legitimate request body to avoid triggering the truncation path, though this increases memory pressure. Blocking oversized bodies at an upstream WAF or load balancer before they reach Skipper is also effective but must be sized consistently with the OPA limit. The full vendor advisory is at https://github.com/zalando/skipper/security/advisories/GHSA-8qqm-fp2q-v734.

Affected VersionsENISA

skipper < 0.27.35

Affected Packages

go github.com/zalando/skipper fix: 0.27.26
euvd skipper fix: 0.27.35

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 2 packages in go, euvd

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

Skipper (cpe:2.3:a:zalando:skipper) is a cloud-native Go HTTP router and reverse proxy used for service mesh/API gateway compositions. Its opaAuthorizeRequestWithBody filter integrates Open Policy Agent (OPA) to authorize requests based on body content using the Envoy ext-authz gRPC interface. The affected logic is in filters/openpolicyagent/openpolicyagent.go in ExtractHttpBodyOptionally: when req.ContentLength > maxBodyBytes, the conditional gate expectedSize <= maxBodyBytes evaluates false and the function returns (req.Body, nil, func(){}, nil) - the nil rawBodyBytes - causing OPA to receive an empty parsed_body document. CWE-754 (Improper Check for Unusual or Exceptional Conditions) is the correct root-cause class: the code properly handles the chunked/negative-ContentLength case introduced by the prior fix but fails to handle the equally exceptional oversized-positive-ContentLength case. The x-envoy-auth-partial-body / input.attributes.request.http.truncated_body signal is also absent from the OPA request, so policies that would gate on body truncation cannot do so. The commit 2cfceabaa6ff0af65b312dcb9bcbe84691b9d507 adds the bodyTruncated bool parameter to AdaptToExtAuthRequest and propagates it as the x-envoy-auth-partial-body header, ensuring OPA receives accurate truncation metadata.

Know when Skipper gets its next vulnerability

  • Watch products and get an email when something new is published
  • Check this CVE against your own stack and servers
  • Exploit and PoC references, threat intelligence from 22 sources

No credit card · 7-day full trial

Severity by source

Vendor (GitHub_M) PRIMARY 8.2 HIGH
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:L/A:N
vuln.today AI 6.5 MEDIUM

AC:H reflects multiple required configuration preconditions; I:H captures authorization bypass allowing forbidden operations upstream; C:L acknowledges indirect disclosure risk.

3.1 AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:H/A:N
4.0 AV:N/AC:H/AT:P/PR:N/UI:N/VC:L/VI:H/VA:N/SC:N/SI:N/SA:N

Primary rating from Vendor (GitHub_M).

CVSS VectorVendor: GitHub_M

Attack Vector
Network
Attack Complexity
Low
Privileges Required
None
User Interaction
None
Scope
Unchanged
Confidentiality
High
Integrity
Low
Availability
None

Lifecycle Timeline

2
Patch available
Sep 14, 2026 - 22:19 EUVD
CVE Published
Sep 14, 2026 - 20:01 cve.org
HIGH 8.2

DescriptionCVE.org

Skipper is an HTTP router and reverse proxy for service composition. Prior to 0.27.35, the opaAuthorizeRequestWithBody filter in filters/openpolicyagent/openpolicyagent.go can allow an oversized declared Content-Length request to bypass a deny-on-presence Rego policy because ExtractHttpBodyOptionally leaves OPA with an empty parsed_body while forwarding the complete request body upstream. This incomplete remediation of CVE-2026-50197 affects deployments that authorize request-body content and exceed -open-policy-agent-max-request-body-size, which defaults to 1 MB. Policy logic that does not reject input.attributes.request.http.truncated_body can therefore fail open and permit a forbidden payload to reach the protected service, while small bodies and the previously fixed chunked-body case are evaluated normally. This issue is fixed in version 0.27.35.

Technical POC Analysis

CWE-754 (Improper Check for Unusual or Exceptional Conditions).

Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.

Executive ViewAI

Why It Matters

Zalando Skipper's OPA authorization filter contains a vulnerability that allows unauthenticated remote attackers to bypass API authorization and deliver forbidden request bodies to upstream services, with no public exploit identified at time of analysis. Organizations using Skipper as a reverse proxy with OPA-based access controls face exposure to unauthorized backend access from external attackers. This represents a critical failure of API security controls that could enable unauthorized data access or business operation disruption.

Business Impact: High
Compensating Controls

Apply vendor patch.

Threat Intelligence Overview

EPSS Score
0.3%
Top 81% exploitable
Prevalence
Low
niche cloud-native Go proxy, primarily Zalando ecosystem adopters
Threat Intel
1
1 source
Data Quality
6 sources
Confidence: High
EUVD NVD CVE.org EPSS Vulnrichment GHSA GitHub

How this decision was reached

The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.

SignalValue
Severity HIGH
CISA KEV No
Public POC No
EPSS 0.3%
Patch available Yes
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision
Scheduled
Exploitation
None
System Exposure· derived
Open
Automatable
Yes
Human Impact
High
Technical Impact
Partial

Priority Score

41
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +41
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy