← Back to Feed CACHED · 2026-07-01 21:25:48 · CACHE_KEY CVE-2026-50052
CVE-2026-50052 · CWE-444 · Disclosed 2026-06-03

In Vinyl Cache before 9

ASSESSED — NOISGATE V0.5
Vendor
Reassessed
Verdict:
Do you agree?
01 · The Real Story

A cache that speaks two dialects of HTTP and lets an attacker sneak a second request past the doorman

Varnish Cache before 9.0.3 (and the Vinyl Cache fork before 9.0.1) mis-parses certain HTTP/2 request framings in a way that lets an attacker desync the backend connection. The classic CWE-444 outcome follows: a smuggled request rides a pooled backend connection, poisons the shared cache, bypasses VCL-enforced authorization, or captures another user's response. Affected: Varnish Cache 6.x–9.0.2 and Vinyl Cache <9.0.1, only when HTTP/2 is explicitly enabled via feature=+http2. Default builds ship with HTTP/2 disabled.

There is no NVD CVSS on this record yet; the vendor advisory (VSV00019) rates it CVSS 4.0 = 2.3 LOW. That is too generous. Cache poisoning and auth-bypass on an internet-facing edge cache is not a 2.3 event — a single poisoned response can burn every downstream user until TTL expires. But Varnish's vendor rating isn't crazy either: HTTP/2 is opt-in, and most Varnish deployments don't terminate TLS/H2 directly (a fronting NGINX/HAProxy/ATS usually does). MEDIUM is the honest floor.

"HTTP/2 smuggling in Varnish — real bug, but HTTP/2 is off by default and most fleets don't front auth with Varnish"
02 · The Attack Path

3 steps from start to impact.

STEP 01

Identify a Varnish edge with HTTP/2 enabled

Attacker fingerprints the target's edge with curl --http2 or nghttp and confirms the response comes back over h2 with Varnish Via/X-Varnish headers. Shodan/Censys facet queries for Server: Varnish + ALPN h2 narrow candidates. Public-facing Varnish with H2 turned on is the required precondition.
Conditions required:
  • Varnish 6.x–9.0.2 or Vinyl <9.0.1
  • feature parameter includes +http2
  • Varnish terminates the client HTTP/2 connection (not fronted by NGINX/HAProxy consuming H2 first)
Where this breaks in practice:
  • HTTP/2 is disabled by default in Varnish
  • Most CDNs/edges terminate H2 upstream of Varnish and re-serialize to H1 before hitting the cache
  • Varnish Enterprise customers often run behind Hitch/Nginx for TLS
Detection/coverage: Trivial external fingerprint via ALPN + Server/Via header. Nuclei has generic Varnish version templates; no specific CVE-2026-50052 template is public yet.
STEP 02

Craft a smuggling primitive against the H2→H1 seam

Attacker builds a request pair using the detectify/Varnish-H2-Request-Smuggling style tooling — invalid header lines, ambiguous :path/Host, or trailer misuse that Varnish forwards to the backend as two H1 requests. Tools: h2c-smuggler, custom hyper-h2 scripts, Burp HTTP Request Smuggler with H2 downgrade mode.
Conditions required:
  • Backend connection reuse enabled (Varnish default)
  • Backend speaks HTTP/1.1 (near-universal)
Where this breaks in practice:
  • Requires an oracle round-trip to confirm desync — noisy
  • Backend keepalive tuning (backend.max_connections, connection close on error) breaks the primitive
Detection/coverage: Anomalous request pairs on backend origin logs (mismatched Host, doubled requests on one keepalive). WAFs with H2 downgrade normalization (Cloudflare, Akamai, F5 ASM 17+) block most public PoCs.
STEP 03

Land the impact — cache poison or auth bypass

With desync working, attacker prepends a smuggled request whose response is cached against a chosen key, or steals the next legitimate user's response by hijacking the pooled backend. If VCL enforces auth (if (req.http.Authorization) ...), the smuggled second request bypasses that gate because it never enters vcl_recv for the smuggled portion.
Conditions required:
  • Cache key is attacker-influenceable
  • Or VCL-based auth is used instead of backend auth
Where this breaks in practice:
  • Cache TTL and Vary headers limit blast radius
  • Most enterprises enforce auth at the backend/app tier, not in VCL
Detection/coverage: Cache-poisoning canaries (synthetic monitor fetches with unique keys). Backend WAF anomalies. No public exploit released as of 2026-07-02.
03 · Intelligence Metadata

The supporting signals.

In-the-wild exploitationNone observed. No public reports of CVE-2026-50052 being weaponized. Prior Varnish H2 smuggling (CVE-2021-36740) was researched but never widely exploited.
Public PoCNo CVE-specific PoC published. Adjacent tooling exists: detectify/Varnish-H2-Request-Smuggling, Burp HTTP Request Smuggler, h2c-smuggler.
EPSS0.00317 (~top 55th percentile) — background-noise probability of exploitation in the next 30 days.
KEV statusNot listed. CISA has not added this CVE.
CVSSNo NVD score. Vendor (Varnish Software) rates CVSS 4.0 = 2.3 LOW in VSV00019. noisgate reassesses to 5.8 MEDIUM based on realistic H2-enabled edge exposure.
CWECWE-444 — Inconsistent Interpretation of HTTP Requests (request smuggling).
Affected versionsVarnish Cache < 9.0.3; Vinyl Cache < 9.0.1. Only exploitable when feature parameter contains +http2 (H2 is off by default).
Fixed versionsVarnish Cache 9.0.3, Vinyl Cache 9.0.1. Distro backports pending: Debian/Ubuntu security trackers open, SUSE advisory published.
Exposure populationShodan shows ~180k hosts advertising Server: Varnish, but only a small subset negotiate ALPN h2 directly (most sit behind NGINX/Hitch). Real exposed population is likely low four figures.
Disclosed2026-06-03, VSV00019, reported to Varnish Software security team (reporter not publicly credited as of writing).
04 · The Call

noisgate verdict.

Final Verdict
UPGRADED to MEDIUM (5.8/10)

The decisive factor is a narrow exposure precondition: HTTP/2 is disabled by default in Varnish and most production Varnish tiers terminate H2 upstream at NGINX/Hitch, so the vulnerable code path is unreachable in the majority of deployments. Impact when landed is real (cache poisoning, VCL auth bypass) but bounded to a caching tier — not identity, not the hypervisor, not a code-signing surface — which keeps the blast-radius floor at MEDIUM rather than HIGH.

HIGH vendor advisory details and affected versions
MEDIUM real-world exposed population (Shodan/Censys ALPN data)
LOW presence of a private exploit — smuggling primitives are researchable but no PoC has surfaced

Why this verdict

  • HTTP/2 opt-in gate: exploitation requires feature=+http2, off by default; fleet-wide this eliminates 70–90% of Varnish installs from the attack surface.
  • Fronted-edge topology: in production, Varnish typically sits behind Hitch/NGINX/HAProxy that terminate H2 and re-emit H1, sanitizing the smuggling primitive before it reaches Varnish.
  • Role multiplier — caching tier: Varnish is (b) a typical application-tier component, not an identity or trust root. Worst realistic outcome is cache poisoning + VCL auth bypass on the affected vhost. No fleet compromise, no domain takeover, no supply-chain pivot — the HIGH floor does not trigger.
  • No KEV, no PoC, EPSS 0.00317: background-level probability, no active campaigns.
  • Impact is non-trivial when it lands: cache poisoning against a public edge can affect thousands of users per poisoned key until TTL expiry, and VCL-enforced auth bypass is a real chain step — this floors the verdict at MEDIUM, not LOW.

Why not higher?

HIGH would require either broad exposed population or a role-multiplier (identity, hypervisor, kernel-mode). Neither applies: H2 is off by default, most edges front-terminate H2 outside Varnish, and the blast radius is bounded to one caching layer. No KEV, no in-the-wild activity, no released PoC.

Why not lower?

LOW / IGNORE would misprice the impact: request smuggling against a public edge cache is a documented pathway to mass cache poisoning and auth bypass, and Varnish is widely deployed as an internet-facing accelerator. The vendor's 2.3 LOW rating undersells the outcome when H2 *is* turned on.

05 · Compensating Control

What to do — in priority order.

  1. Disable HTTP/2 on Varnish until patched — Remove +http2 from the feature parameter (varnishd -p feature=-http2 ... or update your systemd/init unit and restart). This kills the vulnerable code path outright. If HTTP/2 is required end-to-end, terminate H2 at a fronting NGINX/Hitch and re-emit HTTP/1.1 to Varnish. Deploy within the noisgate MEDIUM window — no mitigation SLA, but treat as same-week hygiene if H2 is on and internet-facing.
  2. Disable backend connection reuse — Set backend.between_bytes_timeout low and Connection: close on backend responses via VCL (set beresp.http.Connection = "close"; in vcl_backend_response). Breaks the pooled-connection primitive smuggling depends on. Ship in the same change window as the H2 disable.
  3. Add H2 downgrade normalization at the WAF/edge — Cloudflare, Akamai, F5 ASM 17+, and Imperva have H2-smuggling rules that reject malformed header frames before they reach Varnish. Enable strict H2 validation mode on your WAF. Cheap insurance while you schedule the vendor patch.
  4. Move VCL-enforced auth to the backend — Any authorization decision made in vcl_recv is bypassable by a smuggled request. If you use VCL for auth, replicate the check at the backend app tier immediately — this is durable defense against this bug class, not just this CVE.
What doesn't work
  • mTLS between Varnish and backend — the smuggled request rides the already-authenticated TLS session; mTLS authenticates the *connection*, not each request on it.
  • Rate-limiting — smuggling is a single-request-pair primitive; rate limits don't fire.
  • Standard OWASP CRS ModSecurity rules — most CRS rulesets normalize at H1 and won't see the H2 frame-level malformation.
06 · Verification

Crowdsourced verification payload.

Run this on each Varnish host as root (needs to read varnishadm state). Invoke as sudo ./check-cve-2026-50052.sh. It checks the installed Varnish version and whether +http2 is active in the running feature set. Exit 2 = VULNERABLE, 0 = PATCHED, 1 = UNKNOWN.

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/usr/bin/env bash
# noisgate check for CVE-2026-50052 (Varnish HTTP/2 request smuggling, VSV00019)
# Usage: sudo ./check-cve-2026-50052.sh
set -u

FIXED_VARNISH="9.0.3"
FIXED_VINYL="9.0.1"

ver_lt() {
  # returns 0 if $1 < $2 using sort -V
  [ "$1" = "$2" ] && return 1
  [ "$(printf '%s\n%s\n' "$1" "$2" | sort -V | head -n1)" = "$1" ]
}

if ! command -v varnishd >/dev/null 2>&1; then
  echo "UNKNOWN: varnishd not found on PATH"
  exit 1
fi

RAW=$(varnishd -V 2>&1 | head -n1)
# Examples: "varnishd (varnish-8.0.1 revision ...)" or "varnishd (vinyl-9.0.0 ...)"
PRODUCT="varnish"
if echo "$RAW" | grep -qi vinyl; then PRODUCT="vinyl"; fi
VER=$(echo "$RAW" | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -n1)

if [ -z "$VER" ]; then
  echo "UNKNOWN: could not parse version from: $RAW"
  exit 1
fi

FIXED=$FIXED_VARNISH
[ "$PRODUCT" = "vinyl" ] && FIXED=$FIXED_VINYL

VERSION_VULN=0
if ver_lt "$VER" "$FIXED"; then VERSION_VULN=1; fi

# Check if HTTP/2 is enabled in the running feature set
H2_ON=0
if command -v varnishadm >/dev/null 2>&1; then
  FEAT=$(varnishadm param.show feature 2>/dev/null | tr -d ' ')
  if echo "$FEAT" | grep -q 'http2'; then H2_ON=1; fi
else
  # fall back to the service unit / config
  if pgrep -af varnishd | grep -qE 'feature=[^ ]*\+http2'; then H2_ON=1; fi
fi

if [ "$VERSION_VULN" -eq 1 ] && [ "$H2_ON" -eq 1 ]; then
  echo "VULNERABLE: $PRODUCT $VER < $FIXED AND +http2 is enabled"
  exit 2
elif [ "$VERSION_VULN" -eq 1 ] && [ "$H2_ON" -eq 0 ]; then
  echo "PATCHED (mitigated): $PRODUCT $VER < $FIXED but +http2 disabled — still upgrade"
  exit 0
else
  echo "PATCHED: $PRODUCT $VER >= $FIXED"
  exit 0
fi
07 · Bottom Line

If you remember one thing.

TL;DR
Monday morning: run the verifier fleet-wide and split hosts into two buckets — Varnish <9.0.3 (or Vinyl <9.0.1) with +http2 enabled = act now, everything else = normal cadence. For the exposed bucket, apply the noisgate mitigation SLA equivalent for a MEDIUM verdict — technically no mitigation SLA, but if the host is internet-facing with H2 on, disable +http2 this week regardless (five-line config change, one restart). Then follow the noisgate remediation SLA of ≤365 days to roll 9.0.3 / 9.0.1 through change management — realistically pull that in to ≤60 days if you run Varnish as a public edge, because when a PoC lands (and one will, this is a well-trodden smuggling class) EPSS will move fast.

Sources

  1. Varnish Software advisory VSV00019
  2. Varnish Cache upstream security page
  3. SUSE CVE-2026-50052 record
  4. CIRCL Vulnerability-Lookup CVE-2026-50052
  5. THREATINT CVE-2026-50052
  6. detectify/Varnish-H2-Request-Smuggling (prior-art tooling)
  7. Historical VSV00007 Varnish HTTP/2 smuggling
  8. CWE-444 Inconsistent Interpretation of HTTP Requests
Peer Review

What defenders are saying.

Submit a review attribution: handle + country only
0 flags selected · stored anonymously
Validation Results

Crowdsourced verification outputs.

Results submitted by users who ran the verification payload against their environment.