Medium severity · published Jul 14, 2026
CVE-2026-48038
joi: Uncaught RangeError on deeply nested input through recursive `link()` schemas
5.3
CVSS
0.5%
EPSS
No
On KEV
Description
joi is a schema description language and data validator for JavaScript. Prior to 17.13.4 and 18.2.1, denial of service is possible via an untrapped exception in services validating user-supplied JSON or object input with recursive link() schemas. When validate() is called without try/catch in a request handler, deeply nested input can trigger an unhandled RangeError and potentially crash the process; lower-impact paths using validateAsync() or try/catch produce a RangeError instead of a structured ValidationError. This issue is fixed in versions 17.13.4 and 18.2.1.
CVSS vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L
Attack vector
Network
Complexity
Low
Privileges
None
User interaction
None
Confidentiality
None
Integrity
None
Availability
Low
Scope
Unchanged
Exploitation
Is it being used?
Exploit prediction (EPSS)0.5% · higher than 44% of CVEs
Exploited in the wildNo evidence yet
CISA KEVNot listed
Ransomware campaign useNot known
Affected products
Which versions
JO
joi · hapijs
< 17.13.4; >= 18.0.0, < 18.2.1 · source: vendor
References
NVD
https://nvd.nist.gov/vuln/detail/CVE-2026-48038
CVE.org
https://www.cve.org/CVERecord?id=CVE-2026-48038
github.com
https://github.com/hapijs/joi/commit/97bd51de94d595a2d8949eb3bec0dbdd2f8a7a74
github.com
https://github.com/hapijs/joi/commit/fc146a628ab9cc250854407722d9f8738c9548e7
github.com
https://github.com/hapijs/joi/pull/3113
github.com
https://github.com/hapijs/joi/security/advisories/GHSA-q7cg-457f-vx79
More from joi
7.5
CVE-2026-118772
joi: quadratic-time split in `string().email({ multiple: true })` allows denial of service
7.5
CVE-2026-92599
Joi before 17.13.7 and 18.2.6 ReDoS via isoDate
3.7
CVE-2026-90771
joi before 17.13.8 and 18.2.9 Prototype Pollution via messages
3.7
CVE-2026-84368
joi: Prototype pollution via a `__proto__` language key in custom messages
3.7
CVE-2026-84367
joi: object().rename() with a template target can set the validated object's prototype
