Safeguard
Vulnerability Analysis•

CVE-2026-59903: Medium CORS Vary Header Overwrite in Netty

CVE-2026-59903: Netty's CorsHandler replaces Vary headers such as Authorization with Origin, risking shared cache leaks. Upgrade to 4.1.137 or 4.2.17.

Safeguard Security Team
3 min read

CVE-2026-59903 is a medium severity information disclosure in Netty. CorsHandler replaces application Vary headers such as Authorization or Cookie with Origin, so a caching proxy or CDN may reuse an authenticated response across users. Fixed in Netty 4.1.137.Final and 4.2.17.Final.

What's affected

  • Product: Netty, class io.netty.handler.codec.http.cors.CorsHandler.
  • Affected: versions before 4.1.137.Final, and before 4.2.17.Final in the 4.2 line.
  • Fixed: 4.1.137.Final and 4.2.17.Final.
  • Exposed: services that use CorsHandler, and sit behind a shared cache, proxy or CDN.

How to check if you're exposed

Find the Netty version your application resolves, including copies pulled in by frameworks.

mvn dependency:tree -Dincludes=io.netty
./gradlew dependencies --configuration runtimeClasspath | grep -i netty

Then check whether you use CorsHandler, directly or through a framework that builds on Netty. Finally, look at your response headers on a real request with credentials. If your application sets Vary values and you see only Origin in the response, the header was overwritten.

What to do now

  1. Upgrade Netty to 4.1.137.Final or 4.2.17.Final, or to a framework release that includes it.
  2. Until then, add the Vary values you need at a layer after CorsHandler, for example in a reverse proxy.
  3. Mark responses that depend on credentials as Cache-Control private or no-store.
  4. Check that your CDN does not cache authenticated responses by default.
  5. Run the free in-browser dependency scan on your lockfile or manifest to see every affected package in one pass.

Why it matters

The weakness is CWE-524 (Use of Cache Containing Sensitive Information). The Netty pull request describes it as the CORS handler silently overwriting an existing Vary header. The Vary header tells caches which request headers change the response. If Authorization or Cookie is dropped from it, a cache may serve one user's response to another.

The condition is a shared cache in front of the service, and the record rates attack complexity as high, which is why it scores 6.5 (Medium). Where the condition holds, the leaked content is whatever the authenticated response contained. The fix is to set the Vary header only if it does not already exist. The record does not mark it as exploited in the wild.

Try it yourself

Netty ships inside many frameworks, so version bumps often arrive through a pull request. This demo shows a pull request gate blocking a vulnerable dependency.

Click through it at your own pace, or open it full screen.

Quick check

What does the Vary header do?

It lists the request headers that change the response, so caches know when they may not reuse a stored copy. Replacing it with Origin hides the Authorization or Cookie dependency.

Sources

Last reviewed: 18 October 2026.

Never miss an update

Weekly insights on software supply chain security, delivered to your inbox.

Self-healing security runs on Safeguard.

Your first fix PR is minutes away.

No sales call required, even your agent can complete the purchase over MCP.