GHSA-6h2x-m376-mqjq: High severity npm/joi vulnerability
Impact Any application that validates a user-supplied string with Joi.string().isoDate() can be stalled by a single request. One of the regular expressions the rule runs over the input was unanchored, so a valid ISO date followed by a long run of fractional-second digits made the regex engine restart its search from every position in the string, costing time proportional to the square of the input length. 64 KB of digits costs about 1.4 s and 256 KB about 22 s.
Patches Upgrade to version 17.13.7 or 18.2.6 depending on your current major version.
Workarounds None except capping the length of the string before it reaches joi.
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade
npm/joito a version that resolves this vulnerability.Fixed in 18.2.6 - Upgrade
Upgrade
npm/joito a version that resolves this vulnerability.Fixed in 17.13.7 - Upgrade
Upgrade
joito a version that resolves this vulnerability.Fixed in 17.13.7 - Upgrade
Upgrade
joito a version that resolves this vulnerability.Fixed in 18.2.6 - Compensating control
Cap the length of user-supplied strings before they reach Joi.
Event History
Frequently Asked Questions
Which applications are exposed to this denial-of-service issue?
Applications are exposed if they validate user-controlled strings with Joi's Joi.string().isoDate() rule. An unauthenticated remote attacker can send a single crafted input that stalls validation.
What input is needed to trigger the issue?
The crafted value is a valid ISO date followed by a long sequence of fractional-second digits. The affected regular expression performs work proportional to the square of the input length, so larger inputs cause substantially longer stalls.
How can I mitigate the issue if I cannot upgrade immediately?
Cap the length of the string before it reaches Joi validation. No other workaround is provided.
Which versions contain the fix?
Upgrade to Joi 17.13.7 for the 17.x major version or 18.2.6 for the 18.x major version.