Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessIdentify hapi route accepting multipart uploads
-
DeliveryCraft Content-Disposition header with long token, no equals
-
ExploitSend single unauthenticated multipart POST
-
ExecutionQuadratic regex scan blocks event loop
-
ImpactServer stops answering all clients (DoS)
Vulnerability Assessment
| Weakness |
CWE
ASVS 5.0
V2 - Validation and Business Logic Regex complexity limits
MITRE ATT&CK
1 technique across 1 tactic: Impact The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Exploitation requires the target to parse an untrusted Content-Disposition header via @hapi/content. The primary path is any hapi route with payload.multipart enabled (the default behavior when a route accepts multipart/form-data), because @hapi/pez invokes Content.disposition() on every part header BEFORE the route handler and before any validation, and such routes can be auth:false - so no authentication is needed. The secondary path is any application that passes untrusted headers directly to Content.disposition(). The only limiting factor is the route payload.maxBytes (default 1 MB), which caps the malicious token length and thus the per-request freeze duration; however a 64 KB token already blocks the process for more than 1 second, so this limit does not prevent exploitation. No special non-default configuration, user interaction, or platform-specific condition is required beyond accepting multipart payloads. |
| Impact | This is a genuine, actionable availability risk rather than an inflated high-CVSS score. The provided CVSS:3.1 vector (AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H, base 7.5) is internally consistent with the mechanism described: a remote, unauthenticated attacker triggers quadratic-time regex processing in Content.disposition() with a single normal-sized multipart request, blocking the Node.js single-threaded event loop for seconds to minutes (the reporter measured 542 s for a ~1 MB token). Because Node.js is single-threaded, blocking the event loop halts ALL clients, so impact is a full service freeze, not degradation - this justifies A:H with C:N/I:N. Signal cross-reference: no EPSS score was supplied, and KEV status is not present (not listed), so there is no evidence of active exploitation; the vuln.today decision label is 'this_week' (urgent but not emergency/act_now), aligning with a high-impact DoS that is trivially exploitable but not confidence-/integrity-affecting. A working proof-of-concept with reproduction timings is published in the GHSA advisory, which raises practical risk materially above a theoretical ReDoS. No SSVC machine-readable decision block (exploitation/automatable/technical-impact) was supplied, so that framework cannot be independently applied beyond the 'this_week' label. Net: prioritize patching this week; it is a real, easy, repeatable DoS against any hapi service accepting multipart uploads, but it cannot be used for data theft or RCE. |
| Exploit ScenarioDerived | An unauthenticated attacker sends a single, normal-sized HTTP POST to any hapi route that accepts multipart/form-data (payload.multipart enabled), with a Content-Disposition part header containing a long run of token characters and no '=' (e.g. name="f"; followed by 64 KB of 'a'). @hapi/pez calls Content.disposition() on that header before the handler or validation runs, and the unanchored global regex scan backtracks quadratically, freezing the event loop so the process answers no clients for seconds to minutes. A working proof-of-concept with measured timings (0.42 s at 32 KB, 7.17 s at 128 KB, 542 s near the 1 MB default maxBytes) is published in the GHSA advisory, and a small number of such requests keeps the service unavailable. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 29, 2026
@hapi/content 3.0.6 through 6.0.2 parse Content-Disposition parameters in time that grows with the square of a single parameter token's length, so one unauthenticated multipart/form-data request can freeze the Node.js event loop for seconds to minutes. Because @hapi/pez calls Content.disposition() on every part header before the route handler and before any validation, every hapi route with payload.multipart enabled - including auth:false routes - is remotely reachable by an unauthenticated attacker (CVSS:3.1/AV:N/AC:L/PR:N/UI:N, availability-only impact); applications that hand untrusted headers straight to Content.disposition() are exposed the same way. The GitHub advisory ships a runnable proof-of-concept that measured roughly 7.2 seconds of blocking from a 128 KB token against the 1 MB default payload.maxBytes, and no CISA KEV entry or active-exploitation reporting accompanies this CVE; the flaw is fixed in @hapi/content 6.0.3.
RemediationAI
Upgrade to @hapi/content 6.0.3, the vendor-released fix (release tag v6.0.3, commit 0993851dc7234976a3fce3a7c31662b213c940fd); the advisory is at github.com/hapijs/content/security/advisories/GHSA-8494-f6mr-cjpv. Installations still on the unscoped content package (vulnerable >= 3.0.6, <= 4.0.6) have no patched release listed for that line and must migrate to @hapi/content 6.0.3. The vendor states there is no workaround that removes the risk and that upgrading is required; the only interim reduction is setting a low payload.maxBytes on routes that accept multipart payloads to shorten the per-request freeze, with the trade-off that this caps legitimate upload size and does not eliminate the issue - a 64 KB token still blocks the process for more than a second. Applications that pass untrusted headers directly to Content.disposition() are only fully protected by the 6.0.3 upgrade.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 2 packages in npm
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
CWE-1333 (inefficient regular expression complexity) in @hapi/content's HTTP Content-* header parser. Content.disposition() extracts Content-Disposition parameters with a global regular expression applied through String.prototype.replace(); the parameter-name group ([^\=\*\s]+) is unanchored, so when a run of name characters is not followed by =, the match attempt consumes the whole run and fails, the global scan restarts one character later, and the remaining run is re-read again - total work proportional to the square of the run length. @hapi/pez invokes this on the header of every part in a multipart/form-data body, which in hapi means every route configured with payload.multipart, executed before the handler and before validation; the only bound is the route's payload.maxBytes (1 MB by default), and a 64 KB token already blocks the process for more than a second. The upstream fix (commit 0993851dc7234976a3fce3a7c31662b213c940fd) adds a trailing alternative |[^\=\*\s]+ that consumes an entire un-equals-suffixed name run so the scan resumes after it, plus a $1 === undefined guard in the replace callback to skip that synthetic match; later start positions within the same run would fail identically, so parse results are unchanged while parse time becomes linear. The vulnerable package is identified by CPE cpe:2.3:a:hapijs:content:*:*:*:*:*:*:*:*, consumed by the hapi Node.js web framework ecosystem.
Know when Hapi gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Remote unauthenticated single request (AV:N/AC:L/PR:N/UI:N) blocks the shared event loop for a full availability loss (A:H) with no confidentiality or integrity impact and no scope change.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
2DescriptionCVE.org
@hapi/content provides HTTP Content-* header parsing. From 3.0.6 until 6.0.3, Content.disposition() uses an unanchored parameter-name expression in a global regular-expression scan, causing repeated failed matching over the remaining input when a Content-Disposition parameter contains a long token without an equals sign. The resulting quadratic processing can block the Node.js event loop before route handlers or validation when @hapi/pez parses multipart/form-data headers, including unauthenticated hapi routes with payload.multipart enabled, and also affects applications that pass untrusted headers directly to Content.disposition(). This issue is fixed in @hapi/content version 6.0.3.
Articles & Coverage 1
Technical POC Analysis
CWE-1333 (Inefficient Regular Expression Complexity).
Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.
Latest POC
1 PoC candidate from github (unverified)
Sign in to open the public PoC links collected for this CVE.
Executive ViewAI
A high-severity vulnerability in the @hapi/content library, used by hapi-based Node.js applications, allows unauthenticated attackers to freeze servers with a single malicious request. This availability-only flaw affects any organization running vulnerable hapi applications with multipart file uploads enabled, potentially causing service outages and disrupting critical business operations. Leadership should prioritize patching due to the ease of exploitation and the risk of downtime.
Apply vendor patch.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Denial of Service attacks render applications or systems unavailable by overwhelming resources or triggering failure conditions.
Joi, the JavaScript schema validation library published on npm as joi (17.1.1 through 17.13.8, and 18.0.0 through 18.3.0
formula is a math and string formula parser. Rated medium severity (CVSS 6.5), this vulnerability is remotely exploitabl
EUVD-2026-113373
GHSA-8494-f6mr-cjpv
NVD
CVE.org
EPSS
Exploit-DB