Skip to content

GHSA-26f5-8h2x-34xh CVE-2026-33129

h3 has an observable timing discrepancy in basic auth utils

Medium npm
Severity
5.9 / 10
Medium · CVSS 3.1
Exploit chance (EPSS)
0.32%
Chance of exploitation in the next 30 days. Higher than 25.53% of scored vulnerabilities.
Known exploited
No
Not in CISA's catalog
Weakness
CWE-208 Observable Timing Discrepancy
Fix
2.0.1-rc.9
Upgrade h3 to this version or later

Description

Summary

A Timing Side-Channel vulnerability exists in the requireBasicAuth function due to the use of unsafe string comparison (!==). This allows an attacker to deduce the valid password character-by-character by measuring the server's response time, effectively bypassing password complexity protections.

Details

The vulnerability is located in the requireBasicAuth function. The code performs a standard string comparison between the user-provided password and the expected password:

if (opts.password && password !== opts.password) {
  throw autheFailed(event, opts?.realm);
}

In V8 (and most runtime environments), the !== operator is optimized to "fail fast." It stops execution and returns false as soon as it encounters the first mismatched byte.

  • If the first character is wrong, it returns immediately.
  • If the first character is correct but the second is wrong, it takes slightly longer.

By statistically analyzing these minute timing differences over many requests, an attacker can determine the correct password one character at a time.

PoC

This vulnerability is exploitable in real-world scenarios without direct access to the server machine.

To reproduce this, an attacker can send two packets (or bursts of packets) at the exact same time:

  1. Packet A: Contains a password that is known to be incorrect starting at the first character (e.g., AAAA...).
  2. Packet B: Contains a password where the first character is a guess (e.g., B...).

By measuring the time-to-first-byte (TTFB) or total response time of these concurrent requests, the attacker can filter out network jitter. If Packet B takes consistently longer to return than Packet A, the first character is confirmed as correct. This process is repeated for the second character, and so on. Tests confirm this timing difference is statistically consistent enough to recover credentials remotely.

Impact

This vulnerability allows remote attackers to recover passwords. While network jitter makes this difficult over the internet, it is highly effective in local networks or cloud environments where the attacker is co-located. It reduces the complexity of cracking a password from exponential (guessing the whole string) to linear (guessing one char at a time).

Affected versions

npm

PackageVulnerableFixed in
h3
>= 2.0.0-beta.0, <= 2.0.0-rc.8
No fix yet
h3
>= 2.0.0-beta.0, < 2.0.1-rc.9
2.0.1-rc.9

How to fix

Move to the fixed version or later with your package manager, update the lockfile, and run your tests. If the package only arrives through another dependency, upgrade that dependency first. If none of its releases pulls a fixed version yet, force the version with your package manager's override.

h3 npm → 2.0.1-rc.9

npm
npm install h3@2.0.1-rc.9
yarn
yarn add h3@2.0.1-rc.9
pnpm
pnpm add h3@2.0.1-rc.9

Severity breakdown

CVSS 3.1 5.9

CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:N/A:N

Attack vector
Network
Attack complexity
High
Privileges required
None
User interaction
None
Scope
Unchanged
Confidentiality
High
Integrity
None
Availability
None

Weakness

CWE-208: Observable Timing Discrepancy

Two separate operations in a product require different amounts of time to complete, in a way that is observable to an actor and reveals security-relevant information about the state of the product, such as whether a particular operation was successful or not.

References

Timeline

  1. Published
  2. Last updated by the source
  3. Latest EPSS score
AdvisorySeverityWhy it's related
GHSA-fp4x-ggrf-wmc6
H3 has an Open Redirect via Protocol-Relative Path in redirectBack() Referer Validation
Medium Also affects h3
GHSA-q5pr-72pq-83v3
H3: Unbounded Chunked Cookie Count in Session Cleanup Loop may Lead to Denial of Service
High Also affects h3
GHSA-4hxc-9384-m385
h3: SSE Event Injection via Unsanitized Carriage Return (`\r`) in EventStream Data and Comment Fields (Bypass of CVE Fix)
Medium Also affects h3
GHSA-2j6q-whv2-gh6w
h3: Missing Path Segment Boundary Check in `mount()` Causes Middleware Execution on Unrelated Prefix-Matching Routes
Medium Also affects h3
GHSA-72gr-qfp7-vwhw
h3: Double Decoding in `serveStatic` Bypasses `resolveDotSegments` Path Traversal Protection via `%252e%252e`
High Also affects h3
GHSA-wr4h-v87w-p3r7
h3 has a Path Traversal via Percent-Encoded Dot Segments in serveStatic Allows Arbitrary File Read
High Also affects h3
GHSA-3vj8-jmxq-cgj5
h3 has a middleware bypass with one gadget
Critical Also affects h3
GHSA-22cc-p3c6-wpvm
h3 has a Server-Sent Events Injection via Unsanitized Newlines in Event Stream Fields
Critical Also affects h3

Credits: simonkoeck

Is this in your code?

MergeHarbor checks every repository's dependencies against this database, ranks what matters by exploitability and reachability, routes it to the owning team and opens the fix pull request.

Check your repos with MergeHarbor