h3: Missing Path Segment Boundary Check in `mount()` Causes Middleware Execution on Unrelated Prefix-Matching Routes
Key facts
- Attack vector
- Network
- Privileges required
- None
- User interaction
- None
- Attack complexity
- Low
- Impact type
- —
- Confidentiality · integrity · availability
- None · Low · None
- Fix status
- Fixed
Attack profile from CVSS 3.1 · NVD. Fix status from CNA and GitHub.
Summary
H3 is a minimal H(TTP) framework. In versions 2.0.0-0 through 2.0.1-rc.16, the `mount()` method in h3 uses a simple `startsWith()` check to determine whether incoming requests fall under a mounted sub-application's path prefix. Because this check does not verify a path segment boundary (i.e., that the next character after the base is `/` or end-of-string), middleware registered on a mount like `/admin` will also execute for unrelated routes such as `/admin-public`, `/administrator`, or `/adminstuff`. This allows an attacker to trigger context-setting middleware on paths it was never intended to cover, potentially polluting request context with unintended privilege flags. Version 2.0.2-rc.17 contains a patch.
Why it matters now
SSVC decision points
CISA ADP · SSVC 2.0.3
- Exploitation
- Poc
- Automatable
- No
- Technical impact
- Partial
The decision (Track, Attend, Act) also depends on your mission and well-being impact; see CISA's SSVC guide.
Affected products
| Vendor | Product | Affected versions | Fixed in | Status | Source |
|---|---|---|---|---|---|
| h3js | h3 | 2.0.1-alpha.0 to before 2.0.1-rc.17 | 2.0.1-rc.17 | Patch available | CNA |
| — | h3 (npm) | 2.0.1-alpha.0 to before 2.0.1-rc.17 | 2.0.1-rc.17 | Patch available | GHSA-2j6q-whv2-gh6w |
- h3 Vendorh3js Affected 2.0.1-alpha.0 to before 2.0.1-rc.17 Fixed in 2.0.1-rc.17 Patch available CNA
- h3 (npm) Vendor— Affected 2.0.1-alpha.0 to before 2.0.1-rc.17 Fixed in 2.0.1-rc.17 Patch available GHSA-2j6q-whv2-gh6w
CPE configurations NVD · 16
| CPE | Versions | Role | Vendor |
|---|---|---|---|
| cpe:2.3:a:h3:h3:2.0.1:rc1:*:*:*:node.js:*:* | 2.0.1 rc1 | Vulnerable | h3js |
| cpe:2.3:a:h3:h3:2.0.1:rc10:*:*:*:node.js:*:* | 2.0.1 rc10 | Vulnerable | h3js |
| cpe:2.3:a:h3:h3:2.0.1:rc11:*:*:*:node.js:*:* | 2.0.1 rc11 | Vulnerable | h3js |
| cpe:2.3:a:h3:h3:2.0.1:rc12:*:*:*:node.js:*:* | 2.0.1 rc12 | Vulnerable | h3js |
| cpe:2.3:a:h3:h3:2.0.1:rc13:*:*:*:node.js:*:* | 2.0.1 rc13 | Vulnerable | h3js |
| cpe:2.3:a:h3:h3:2.0.1:rc14:*:*:*:node.js:*:* | 2.0.1 rc14 | Vulnerable | h3js |
| cpe:2.3:a:h3:h3:2.0.1:rc15:*:*:*:node.js:*:* | 2.0.1 rc15 | Vulnerable | h3js |
| cpe:2.3:a:h3:h3:2.0.1:rc16:*:*:*:node.js:*:* | 2.0.1 rc16 | Vulnerable | h3js |
| cpe:2.3:a:h3:h3:2.0.1:rc2:*:*:*:node.js:*:* | 2.0.1 rc2 | Vulnerable | h3js |
| cpe:2.3:a:h3:h3:2.0.1:rc3:*:*:*:node.js:*:* | 2.0.1 rc3 | Vulnerable | h3js |
- cpe:2.3:a:h3:h3:2.0.1:rc1:*:*:*:node.js:*:* Versions 2.0.1 rc1 Vulnerable ·h3js
- cpe:2.3:a:h3:h3:2.0.1:rc10:*:*:*:node.js:*:* Versions 2.0.1 rc10 Vulnerable ·h3js
- cpe:2.3:a:h3:h3:2.0.1:rc11:*:*:*:node.js:*:* Versions 2.0.1 rc11 Vulnerable ·h3js
- cpe:2.3:a:h3:h3:2.0.1:rc12:*:*:*:node.js:*:* Versions 2.0.1 rc12 Vulnerable ·h3js
- cpe:2.3:a:h3:h3:2.0.1:rc13:*:*:*:node.js:*:* Versions 2.0.1 rc13 Vulnerable ·h3js
- cpe:2.3:a:h3:h3:2.0.1:rc14:*:*:*:node.js:*:* Versions 2.0.1 rc14 Vulnerable ·h3js
- cpe:2.3:a:h3:h3:2.0.1:rc15:*:*:*:node.js:*:* Versions 2.0.1 rc15 Vulnerable ·h3js
- cpe:2.3:a:h3:h3:2.0.1:rc16:*:*:*:node.js:*:* Versions 2.0.1 rc16 Vulnerable ·h3js
- cpe:2.3:a:h3:h3:2.0.1:rc2:*:*:*:node.js:*:* Versions 2.0.1 rc2 Vulnerable ·h3js
- cpe:2.3:a:h3:h3:2.0.1:rc3:*:*:*:node.js:*:* Versions 2.0.1 rc3 Vulnerable ·h3js
Show 6 more CPE
| CPE | Versions | Role | Vendor |
|---|---|---|---|
| cpe:2.3:a:h3:h3:2.0.1:rc4:*:*:*:node.js:*:* | 2.0.1 rc4 | Vulnerable | h3js |
| cpe:2.3:a:h3:h3:2.0.1:rc5:*:*:*:node.js:*:* | 2.0.1 rc5 | Vulnerable | h3js |
| cpe:2.3:a:h3:h3:2.0.1:rc6:*:*:*:node.js:*:* | 2.0.1 rc6 | Vulnerable | h3js |
| cpe:2.3:a:h3:h3:2.0.1:rc7:*:*:*:node.js:*:* | 2.0.1 rc7 | Vulnerable | h3js |
| cpe:2.3:a:h3:h3:2.0.1:rc8:*:*:*:node.js:*:* | 2.0.1 rc8 | Vulnerable | h3js |
| cpe:2.3:a:h3:h3:2.0.1:rc9:*:*:*:node.js:*:* | 2.0.1 rc9 | Vulnerable | h3js |
- cpe:2.3:a:h3:h3:2.0.1:rc4:*:*:*:node.js:*:* Versions 2.0.1 rc4 Vulnerable ·h3js
- cpe:2.3:a:h3:h3:2.0.1:rc5:*:*:*:node.js:*:* Versions 2.0.1 rc5 Vulnerable ·h3js
- cpe:2.3:a:h3:h3:2.0.1:rc6:*:*:*:node.js:*:* Versions 2.0.1 rc6 Vulnerable ·h3js
- cpe:2.3:a:h3:h3:2.0.1:rc7:*:*:*:node.js:*:* Versions 2.0.1 rc7 Vulnerable ·h3js
- cpe:2.3:a:h3:h3:2.0.1:rc8:*:*:*:node.js:*:* Versions 2.0.1 rc8 Vulnerable ·h3js
- cpe:2.3:a:h3:h3:2.0.1:rc9:*:*:*:node.js:*:* Versions 2.0.1 rc9 Vulnerable ·h3js
Remediation
- Fix · CNA h3 (h3js) Fixed in 2.0.1-rc.17
- Fix · GHSA-2j6q-whv2-gh6w h3 (npm) Fixed in 2.0.1-rc.17 Advisory →
Vendor assessments
Red Hat
Red Hat rating: Moderate. Red Hat's page for this CVE →
Not affected: 2 products
- Logging Subsystem for Red Hat OpenShift
- Red Hat OpenShift Update Service
Timeline
- 2026-10-02 Threatist record created from CVE-2026-33490
- 2026-10-03 Alias added: GHSA-2j6q-whv2-gh6w
References
More h3js H3 vulnerabilities
- TI-2026-25559 h3 has a Server-Sent Events Injection via Unsanitized Newlines in Event Stream Fields CVSS 3.1CRITICAL 10.0
- TI-2026-25562 h3 has a middleware bypass with one gadget CVSS 3.1CRITICAL 9.1
- TI-2026-25560 h3 has an observable timing discrepancy in basic auth utils CVSS 3.1MEDIUM 5.9
- TI-2026-18951 h3 v1 has Request Smuggling (TE.TE) issue CVSS 3.1CRITICAL 9.8
Sources
- CVE-2026-33490 · CVE Program
- CVE-2026-33490 · NVD
- FIRST EPSS
- GHSA-2j6q-whv2-gh6w · GitHub Advisory Database · CC BY 4.0
- CVE-2026-33490 · Red Hat security data · CC BY 4.0
This product uses the NVD API but is not endorsed or certified by the NVD. Sources and licences