Severity by source
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:H/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X
Remote, unauthenticated, no interaction (AV:N/AC:L/PR:N/UI:N); scope change (S:C) since the bypass impacts a separate upstream filter, with limited integrity impact and no confidentiality/availability effect.
Primary rating from Vendor (https://github.com/hapijs/content).
CVSS VectorVendor: https://github.com/hapijs/content
Lifecycle Timeline
5Blast Radius
ecosystem impact- 511 npm packages depend on @hapi/content (4 direct, 507 indirect)
Ecosystem-wide dependent count for version 6.0.2.
DescriptionCVE.org
Impact
The two parsers resolved duplicates inconsistently and silently:
Content.disposition()retained the last occurrence of each parameter.Content.type()retained the first occurrence of charset and boundary.
Either behavior creates a parameter-smuggling primitive when another component in the request-processing chain (a WAF, reverse proxy, security filter, or alternate parser) resolves duplicates the opposite way. The primary attack vector is upload filename allowlist bypass:
Content-Disposition: form-data; name="file"; filename="safe.txt"; filename="shell.php"
Patches
The issue has been patched in 6.0.2.
Workarounds
Pre or post validate headers looking for duplicates.
Resources
AnalysisAI
Parameter smuggling in @hapi/content (the header parser used by the Hapi.js framework) before 6.0.2 lets remote unauthenticated attackers bypass upload security controls by sending duplicate Content-Disposition or Content-Type parameters. Because Content.disposition() kept the last duplicate while Content.type() kept the first, a filename allowlist enforced by a WAF, reverse proxy, or alternate parser that resolves duplicates the opposite way can be evaded (e.g. filename="safe.txt"; filename="shell.php"). No public exploit identified at time of analysis and EPSS is very low (0.05%), but a vendor-released patch (6.0.2) is available and the technique is trivially reproducible.
Technical ContextAI
The affected component is @hapi/content (npm package pkg:npm/@hapi/content), the MIME/header parsing library that backs multipart and Content-Type/Content-Disposition handling in the Hapi.js Node.js web framework. The root cause maps to CWE-436 (Interpretation Conflict): RFC 6266 (Content-Disposition) and RFC 7231 (Content-Type) do not mandate a single deterministic resolution for repeated parameters, so two parsers in the same request chain can disagree. Here Content.disposition() silently retained the last occurrence of a duplicated parameter while Content.type() retained the first occurrence of charset and boundary. When a defensive component upstream (WAF, proxy, security filter) picks a different occurrence than the Hapi application does, the two see different effective values from the same header - the classic parameter-smuggling condition. The fix (commit 3850079) tightens the content-type token regex to the RFC 7230 §3.2.6 token set and makes both parsers throw Boom.badRequest on duplicate charset/boundary and duplicate disposition parameters instead of silently choosing one, while still allowing RFC 6266 ext-value (filename*) overrides.
RemediationAI
Vendor-released patch: 6.0.2 - upgrade @hapi/content to >= 6.0.2 (directly or by updating the parent Hapi packages that depend on it, then verifying the resolved version with npm ls @hapi/content), per advisory GHSA-36hh-x5p5-jgc8 (https://github.com/hapijs/content/security/advisories/GHSA-36hh-x5p5-jgc8). If you cannot upgrade immediately, the vendor-suggested workaround is to pre- or post-validate incoming headers and reject any request containing duplicate Content-Disposition or Content-Type parameters (more than one filename, name, charset, or boundary token) before it reaches the parser or the upload filter; the trade-off is added request-processing logic and a small risk of rejecting unusual-but-legitimate clients that emit repeated parameters. Additionally, ensure your WAF/reverse proxy and the application resolve duplicate parameters identically, and enforce upload allowlists on server-side validated attributes (final stored filename, magic-byte content type) rather than solely on the raw header value.
In PHP versions 7.1.x below 7.1.33, 7.2.x below 7.2.24 and 7.3.x below 7.3.11 in certain configurations of FPM setup it
sapi/cgi/cgi_main.c in PHP before 5.3.12 and 5.4.x before 5.4.2, when configured as a CGI script (aka php-cgi), does not
(1) boardData102.php, (2) boardData103.php, (3) boardDataJP.php, (4) boardDataNA.php, and (5) boardDataWW.php in Netgear
The '/common/download_agent_installer.php' script in the Quest KACE System Management Appliance 8.0.318 is accessible by
ProjectSend versions prior to r1720 are affected by an improper authentication vulnerability. Rated critical severity (C
Roundcube Webmail contains a critical PHP object deserialization vulnerability (CVE-2025-49113, CVSS 9.9) that allows au
Util/PHP/eval-stdin.php in PHPUnit before 4.8.28 and 5.x before 5.6.3 allows remote attackers to execute arbitrary PHP c
Palo Alto Networks PAN-OS management web interface contains an authentication bypass allowing unauthenticated attackers
Nagios XI version xi-5.7.5 is affected by OS command injection. Rated high severity (CVSS 8.8), this vulnerability is re
Nagios XI version xi-5.7.5 is affected by OS command injection. Rated high severity (CVSS 8.8), this vulnerability is re
The get_referers function in /opt/ws/bin/sblistpack in Sophos Web Appliance before 3.7.9.1 and 3.8 before 3.8.1.1 allows
The Backup Migration plugin for WordPress is vulnerable to Remote Code Execution in all versions up to, and including, 1
Same weakness CWE-436 – Interpretation Conflict
View allSame technique Authentication Bypass
View allShare
External POC / Exploit Code
Leaving vuln.today
EUVD-2026-45313
GHSA-36hh-x5p5-jgc8