CVE-2026-17495: moment vulnerable to Path Traversal via crafted non-string locale name

Published Sep 15, 2026
·
Updated

moment is a JavaScript date library for parsing, validating, manipulating, and formatting dates. In versions 2.29.2 through 2.30.1, a specially crafted non-string object passed to moment.locale() can bypass the locale-name path-traversal guard. The guard assumes the input is a string, so an object whose match() method satisfies the check while its toString() returns a traversal path reaches an internal require() call with attacker-controlled path segments. This is an incomplete fix for CVE-2022-24785 and primarily affects npm (server-side) users that pass user-provided input directly to moment.locale(). The issue is fixed in moment 2.31.0, and users should upgrade to 2.31.0 or later. As a workaround, validate that any user-supplied input is a string before passing it to moment.locale().

Affected Software

1 affected component
npm/moment>=2.29.2<=2.30.1, <2.31.0

Remediation

Recommended actions to resolve this vulnerability, in priority order.

  1. Upgrade

    Upgrade moment to a version that resolves this vulnerability.

    Fixed in 2.31.0
  2. Configuration

    As a workaround/mitigation, validate that any user-supplied input is a string before passing it to moment.locale().

    moment locale name input type validation before calling moment.locale() = string-only (validate user-supplied input is a string)
  3. Compensating control

    Ensure server-side (npm) applications do not pass user-provided input directly to moment.locale(); only pass validated, safe locale-name strings (as above).

Event History

Sep 15, 2026
CVE Published
via MITRE·05:40 AM
Data Sourced
via MITRE·05:40 AM
DescriptionSeverityWeakness

Frequently Asked Questions

1

Which deployments are most likely to be exposed?

The issue primarily affects server-side npm users that pass user-provided input directly to moment.locale(). The affected version range is 2.29.2 through 2.30.1.

2

What must an attacker provide to exploit this issue?

An attacker must be able to supply a specially crafted non-string object to moment.locale(). Its match() method must satisfy the locale-name guard while its toString() method returns a traversal path used by an internal require() call.

3

Are default uses of moment.locale() affected?

The provided information identifies exposure when user-provided input is passed directly to moment.locale(). It does not indicate that applications using only application-controlled locale values are affected.

4

What can be done if upgrading is not immediately possible?

Validate that any user-supplied value is a string before passing it to moment.locale(). Upgrade to moment 2.31.0 or later when possible.

Contact

SecAlerts Pty Ltd.
132 Wickham Terrace
Fortitude Valley,
QLD 4006, Australia
info@secalerts.co
By using SecAlerts services, you agree to our services end-user license agreement. This website is safeguarded by reCAPTCHA and governed by the Google Privacy Policy and Terms of Service. All names, logos, and brands of products are owned by their respective owners, and any usage of these names, logos, and brands for identification purposes only does not imply endorsement. If you possess any content that requires removal, please get in touch with us.
© 2026 SecAlerts Pty Ltd.
ABN: 70 645 966 203, ACN: 645 966 203