CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-23527

Case Sensitivity Kills: HTTP Request Smuggling in H3

Alon Barad
Alon Barad
Software Engineer

Jan 16, 2026·6 min read·67 visits

Executive Summary (TL;DR)

H3, the underlying HTTP engine for Nuxt and Nitro, checked for the string "chunked" using a case-sensitive match. Attackers can send "ChuNked" to bypass body parsing on the backend while proxies still forward the body. This leaves leftover data on the TCP socket, causing subsequent requests to be hijacked.

A critical HTTP Request Smuggling vulnerability in the H3 framework allows attackers to desynchronize sockets by using mixed-case 'Transfer-Encoding' headers, leading to potential cache poisoning and request hijacking.

The Hook: The Minimalist Trap

In the modern JavaScript ecosystem, everyone wants speed. We want lightweight, zero-dependency, blazingly fast frameworks. Enter H3, the minimal HTTP framework that powers the heavy hitters like Nuxt and Nitro. It is designed to be the bare metal engine of the server-side JS world.

But here is the thing about minimalism: when you strip away the "bloat," you often strip away the decades of scar tissue that older web servers have accumulated. That scar tissue exists for a reason. It protects against the weird, dusty corners of the HTTP specifications.

CVE-2026-23527 is a perfect example of what happens when modern code meets ancient protocols. By trying to be efficient with a simple string check, H3 accidentally opened the door to one of the most dangerous web attack classes: HTTP Request Smuggling. It turns out, the internet is not case-sensitive, even if JavaScript is.

The Flaw: RFCs Are Not Suggestions

To understand this bug, you need to look at RFC 9112 (or its grandfather, RFC 7230). The spec is crystal clear: the Transfer-Encoding header value is case-insensitive. A server must treat chunked, Chunked, and cHuNkEd exactly the same way.

Most industrial-grade proxies (like Nginx, HAProxy, or AWS ALB) follow the rules. They see Transfer-Encoding: ChuNked, nod their heads, and process the request body as a stream of chunks. They then forward that request to the backend application.

The H3 framework, however, failed to read the fine print. In its utility function readRawBody, it needed to decide if a request had a body to read. It checked the Content-Length. If that was missing, it looked at Transfer-Encoding. So far, so good. But the implementation specifically looked for the exact lowercase string "chunked".

This created a "TE.Skip" scenario. If an attacker sends Transfer-Encoding: ChuNked, the frontend proxy sees a body. H3 sees... nothing. H3 thinks the request is done, sends a response, and leaves the actual request body sitting unread in the TCP socket buffer. That unread data becomes the start of the next request on that connection.

The Code: The Smoking Gun

Let's look at the vulnerable code in src/utils/body.ts. It's a classic case of "it works on my machine" logic.

// THE VULNERABLE CODE
if (
    !Number.parseInt(event.node.req.headers["content-length"] || "") &&
    !String(event.node.req.headers["transfer-encoding"] ?? "")
      .split(",")
      .map((e) => e.trim())
      .filter(Boolean)
      .includes("chunked") // <--- The fatal flaw
  ) {
    return Promise.resolve(undefined);
}

The developer assumed that includes("chunked") was sufficient. But "ChuNked" does not equal "chunked" in JavaScript. This check fails, the function returns undefined (no body), and the desynchronization begins.

Here is the fix introduced in version 1.15.5. They replaced the naive string splitting with a proper case-insensitive Regular Expression.

// THE FIX (Commit 618ccf4f37b8b6148bea7f36040471af45bfb097)
// ...
    !/\bchunked\b/i.test( // <--- Regex with 'i' flag for case-insensitivity
      String(event.node.req.headers["transfer-encoding"] ?? ""),
    )
// ...

This simple regex /\bchunked\b/i ensures that CHUnkED, Chunked, and chunked are all correctly identified, closing the desync window.

The Exploit: Desynchronizing the Stack

Exploiting this requires the H3 application to be sitting behind a reverse proxy that reuses backend connections (keep-alive). Here is the attack flow:

  1. The Setup: The attacker sends a request with Transfer-Encoding: ChuNked. We define a chunk size, but then we hide a second HTTP request inside what looks like the body.
POST /api/trigger HTTP/1.1
Host: vulnerable-app.com
Transfer-Encoding: ChuNked
 
0
 
GET /admin/delete-users HTTP/1.1
Host: vulnerable-app.com
X-Ignore: X
  1. The Desync:

    • Proxy: Sees ChuNked. Parses the body. Sends the whole blob to H3.
    • H3: Sees ChuNked. Says "I don't know her." Ignores the headers. Sees no Content-Length. Decides the request has no body. It handles POST /api/trigger immediately and sends back a 200 OK.
  2. The Poison: The H3 server has stopped reading socket data for the first request. But the bytes GET /admin/delete-users... are still sitting in the TCP buffer.

  3. The Victim: The next request that comes in (maybe from a legitimate user, or the attacker's second request) will pick up where the socket left off. The H3 server reads the leftover bytes as the start of the new request. The legitimate user's request is effectively completely rewritten or appended as garbage.

The Impact: Why Should We Panic?

In a void, this just causes socket errors. In reality, it causes chaos. Since H3 is often used with Nuxt (a meta-framework for Vue.js), these applications are frequently heavily cached.

Cache Poisoning: An attacker can smuggle a request that generates a specific response (e.g., a 404 or a malicious redirection). If the next request comes from a victim asking for index.js, and the server responds with the attacker's smuggled content, the intermediate cache might save that malicious content. Now every user requesting index.js gets the attacker's payload.

Authentication Bypass: If the smuggled request hits an admin endpoint, and the architecture relies on the frontend proxy for authentication validation (which is bypassed because the proxy thinks it is sending one request, not two), you can bypass access controls.

Queue Poisoning: If the application uses the request body to queue jobs, you can inject malicious jobs that the system validates incorrectly.

The Fix: Stopping the Bleeding

If you are running H3 (or Nuxt/Nitro) versions older than 1.15.5, you are vulnerable. The fix is straightforward:

  1. Upgrade Immediately: npm install h3@latest or npx nuxi upgrade. Ensure your lockfiles are updated.
  2. Audit Proxies: Ensure your frontend load balancers (AWS ALB, Nginx, etc.) are configured to normalize headers. Good proxies should convert Transfer-Encoding to lowercase before forwarding, or reject ambiguous requests entirely.
  3. WAF Rules: Configure your WAF to block requests containing Transfer-Encoding headers with mixed casing if your backend cannot handle them, though patching the backend is the only true fix.

Official Patches

Unjs / H3Official patch commit for H3

Fix Analysis (1)

Technical Appendix

CVSS Score
8.9/ 10
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:C/C:H/I:H/A:L
EPSS Probability
0.12%
Top 100% most exploited
50,000
via Shodan search for 'Set-Cookie: nuxt-session'

Affected Systems

H3 Framework < 1.15.5Nuxt.js applications (utilizing vulnerable Nitro/H3 versions)Nitro server engineAny Node.js app using h3 for HTTP handling

Affected Versions Detail

Product
Affected Versions
Fixed Version
h3
Unjs
< 1.15.51.15.5
AttributeDetail
CWE IDCWE-444 (Inconsistent Interpretation of HTTP Requests)
CVSS8.9 (High)
Attack VectorNetwork (HTTP Request Smuggling)
Exploit StatusPoC Available
Root CauseCase-sensitive string comparison on Transfer-Encoding
ArchitectureNode.js / Server-side JavaScript

MITRE ATT&CK Mapping

T1190Exploit Public-Facing Application
Initial Access
T1565Data Manipulation
Impact
CWE-444
Inconsistent Interpretation of HTTP Requests ('HTTP Request/Response Smuggling')

The application acts as an intermediary (e.g., proxy) or backend and interprets HTTP requests inconsistently with other devices in the chain, allowing request smuggling.

Known Exploits & Detection

Research PoCSend a request with 'Transfer-Encoding: ChuNked' and observe if the server hangs (correct) or responds immediately (vulnerable).

Vulnerability Timeline

Vulnerability Discovered & Reported
2026-01-15
Fix Committed to GitHub
2026-01-15
H3 v1.15.5 Released
2026-01-15
Advisory Published
2026-01-15

References & Sources

  • [1]GHSA Advisory
  • [2]PortSwigger: HTTP Request Smuggling

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•about 1 hour ago•CVE-2026-50751
9.3

CVE-2026-50751: Authentication Bypass in Check Point Security Gateway IKEv1 Legacy Validation

An improper authentication vulnerability (CWE-287) exists in the legacy, deprecated Internet Key Exchange version 1 (IKEv1) key exchange protocol implementation in Check Point Security Gateways. The vulnerability is caused by a logic flow weakness during the certificate validation process for Remote Access VPN and Mobile Access (SSL VPN) connections. An unauthenticated remote attacker can exploit this weakness to bypass user authentication entirely, establishing a fully functional Remote Access VPN connection without a valid password.

Alon Barad
Alon Barad
8 views•6 min read
•about 15 hours ago•CVE-2026-39922
6.3

CVE-2026-39922: Server-Side Request Forgery in GeoNode Service Registration Endpoint

GeoNode versions prior to 4.4.5 and 5.0.2 are vulnerable to Server-Side Request Forgery (SSRF) in the service registration endpoint. Authenticated attackers with low privileges can exploit insufficient input validation in the Web Map Service (WMS) registration module to force the application server to make outbound network queries to loopback addresses, private RFC1918 subnets, link-local scopes, and cloud metadata endpoints. This technical report details the mechanics of the vulnerability, the underlying architectural flaw, and how to effectively remediate and mitigate the associated security risks.

Alon Barad
Alon Barad
4 views•7 min read
•about 24 hours ago•CVE-2022-0492
7.8

CVE-2022-0492: Privilege Escalation and Container Escape via cgroups v1 release_agent

CVE-2022-0492 is a high-severity missing authorization vulnerability in the Linux kernel's Control Groups (cgroups) v1 implementation. The flaw resides within the cgroup_release_agent_write function in kernel/cgroup/cgroup-v1.c, where the kernel fails to validate if the process writing to the release_agent file possesses administrative capabilities in the initial user namespace. This allows a local attacker inside a container with root privileges (UID 0) to abuse user namespaces, mount a cgroups v1 directory, modify the release_agent parameter, and execute arbitrary commands on the host system as host root, effectively achieving a complete container escape.

Amit Schendel
Amit Schendel
9 views•7 min read
•3 days ago•GHSA-G72G-R7M4-9X4G
6.3

GHSA-G72G-R7M4-9X4G: Insufficient Session Expiration of OAuth Tokens in NocoDB

NocoDB is subject to an insufficient session expiration vulnerability where OAuth access and refresh tokens are not invalidated or revoked during security-sensitive actions such as password changes, forgot-password requests, or password resets. This allows an attacker possessing an active OAuth token to maintain unauthorized persistence.

Amit Schendel
Amit Schendel
12 views•6 min read
•3 days ago•GHSA-FGMC-2HQJ-86V4
6.9

GHSA-FGMC-2HQJ-86V4: Default Administrative Credentials in vantage6-server

A vulnerability in the vantage6 federated learning framework allows unauthenticated remote attackers to gain administrative control of the server via hardcoded default credentials (root/root) when deployed under default configurations in versions 4.2.3 and below.

Amit Schendel
Amit Schendel
8 views•5 min read
•3 days ago•GHSA-X9F6-9RVM-MMRG
6.9

GHSA-X9F6-9RVM-MMRG: Improper Access Control and Volume Mount Isolation Bypass in vantage6 Node

An improper access control vulnerability in the vantage6 node component allows concurrently running algorithm containers to read and modify sensitive input and output files of other tasks. The lack of strict workspace directory isolation exposes a significant attack surface in multi-tenant or federated environments where untrusted algorithms are executed.

Amit Schendel
Amit Schendel
3 views•4 min read