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.
3 steps from start to impact.
Identify a Varnish edge with HTTP/2 enabled
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.- Varnish 6.x–9.0.2 or Vinyl <9.0.1
featureparameter includes+http2- Varnish terminates the client HTTP/2 connection (not fronted by NGINX/HAProxy consuming H2 first)
- 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
Server/Via header. Nuclei has generic Varnish version templates; no specific CVE-2026-50052 template is public yet.Craft a smuggling primitive against the H2→H1 seam
: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.- Backend connection reuse enabled (Varnish default)
- Backend speaks HTTP/1.1 (near-universal)
- Requires an oracle round-trip to confirm desync — noisy
- Backend keepalive tuning (
backend.max_connections, connection close on error) breaks the primitive
Land the impact — cache poison or auth bypass
if (req.http.Authorization) ...), the smuggled second request bypasses that gate because it never enters vcl_recv for the smuggled portion.- Cache key is attacker-influenceable
- Or VCL-based auth is used instead of backend auth
- Cache TTL and
Varyheaders limit blast radius - Most enterprises enforce auth at the backend/app tier, not in VCL
The supporting signals.
| In-the-wild exploitation | None observed. No public reports of CVE-2026-50052 being weaponized. Prior Varnish H2 smuggling (CVE-2021-36740) was researched but never widely exploited. |
|---|---|
| Public PoC | No CVE-specific PoC published. Adjacent tooling exists: detectify/Varnish-H2-Request-Smuggling, Burp HTTP Request Smuggler, h2c-smuggler. |
| EPSS | 0.00317 (~top 55th percentile) — background-noise probability of exploitation in the next 30 days. |
| KEV status | Not listed. CISA has not added this CVE. |
| CVSS | No 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. |
| CWE | CWE-444 — Inconsistent Interpretation of HTTP Requests (request smuggling). |
| Affected versions | Varnish Cache < 9.0.3; Vinyl Cache < 9.0.1. Only exploitable when feature parameter contains +http2 (H2 is off by default). |
| Fixed versions | Varnish Cache 9.0.3, Vinyl Cache 9.0.1. Distro backports pending: Debian/Ubuntu security trackers open, SUSE advisory published. |
| Exposure population | Shodan 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. |
| Disclosed | 2026-06-03, VSV00019, reported to Varnish Software security team (reporter not publicly credited as of writing). |
noisgate verdict.
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.
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.
What to do — in priority order.
- Disable HTTP/2 on Varnish until patched — Remove
+http2from thefeatureparameter (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. - Disable backend connection reuse — Set
backend.between_bytes_timeoutlow andConnection: closeon backend responses via VCL (set beresp.http.Connection = "close";invcl_backend_response). Breaks the pooled-connection primitive smuggling depends on. Ship in the same change window as the H2 disable. - 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.
- Move VCL-enforced auth to the backend — Any authorization decision made in
vcl_recvis 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.
- 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.
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.
#!/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
If you remember one thing.
+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
- Varnish Software advisory VSV00019
- Varnish Cache upstream security page
- SUSE CVE-2026-50052 record
- CIRCL Vulnerability-Lookup CVE-2026-50052
- THREATINT CVE-2026-50052
- detectify/Varnish-H2-Request-Smuggling (prior-art tooling)
- Historical VSV00007 Varnish HTTP/2 smuggling
- CWE-444 Inconsistent Interpretation of HTTP Requests
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.