Packages / path-to-regexp / Security

HighVulnerabilityGHSA-9wv6-86v2-598jCVE-2024-45296CVE-2026-4867GHSA-37ch-88jc-xwx2Published 9 Sep 2024

path-to-regexp outputs backtracking regular expressions

Your version

Affected releases · path-to-regexp

  • 7.x7.0.0 – 7.2.0No fix on this line yet
  • 6.x6.0.0 – 6.2.2Fixed in 6.3.0
  • 5.x to 4.x4.0.0 – 5.0.0No fix, no longer updated
  • 3.x3.0.0 – 3.2.0Fixed in 3.3.0
  • 2.x2.0.0 – 2.4.0No fix on this line yet
  • 1.x1.0.0 – 1.8.0Fixed in 1.9.0
  • 0.2.x0.2.0 – 0.2.5No fix on this line yet
  • 0.1.x0.1.0 – 0.1.9Fixed in 0.1.10
  • 0.0.x0.0.1 – 0.0.2No fix on this line yet

7.x has no fix yet; the newest fixed line:

npm install path-to-regexp@6.3.0
Every release on a timeline
9.x
  1. Not affected

    9.0.0

    1 release, latest

7.x
  1. Affected

    7.0.0 – 7.2.0

    3 releases

6.x
  1. Affected

    6.0.0 – 6.2.2

    5 releases

  2. Fixed

    6.3.0

    1 release

5.x
  1. Affected

    5.0.0

    1 release

4.x
  1. Affected

    4.0.0 – 4.0.5

    6 releases

3.x
  1. Affected

    3.0.0 – 3.2.0

    3 releases

  2. Fixed

    3.3.0

    1 release

2.x
  1. Affected

    2.0.0 – 2.4.0

    6 releases

1.x
  1. Affected

    1.0.0 – 1.8.0

    17 releases

  2. Fixed

    1.9.0

    1 release

0.x
  1. Affected

    0.0.1 – 0.1.9

    12 releases

  2. Fixed

    0.1.10 – 0.1.13

    4 releases

  3. Affected

    0.2.0 – 0.2.5

    6 releases

74 stable releases of path-to-regexp, oldest to newest, one row per major.

What happens

Impact

A bad regular expression is generated any time you have two parameters within a single segment, separated by something that is not a period (.). For example, /:a-:b.

Patches

For users of 0.1, upgrade to 0.1.10. All other users should upgrade to 8.0.0.

These versions add backtrack protection when a custom regex pattern is not provided:

They do not protect against vulnerable user supplied capture groups. Protecting against explicit user patterns is out of scope for old versions and not considered a vulnerability.

Version 7.1.0 can enable strict: true and get an error when the regular expression might be bad.

Version 8.0.0 removes the features that can cause a ReDoS.

Workarounds

All versions can be patched by providing a custom regular expression for parameters after the first in a single segment. As long as the custom regular expression does not match the text before the parameter, you will be safe. For example, change /:a-:b to /:a-:b([^-/]+).

If paths cannot be rewritten and versions cannot be upgraded, another alternative is to limit the URL length. For example, halving the attack string improves performance by 4x faster.

Details

Using /:a-:b will produce the regular expression /^\/([^\/]+?)-([^\/]+?)\/?$/. This can be exploited by a path such as /a${'-a'.repeat(8_000)}/a. OWASP has a good example of why this occurs, but the TL;DR is the /a at the end ensures this route would never match but due to naive backtracking it will still attempt every combination of the :a-:b on the repeated 8,000 -a.

Because JavaScript is single threaded and regex matching runs on the main thread, poor performance will block the event loop and can lead to a DoS. In local benchmarks, exploiting the unsafe regex will result in performance that is over 1000x worse than the safe regex. In a more realistic environment using Express v4 and 10 concurrent connections, this translated to average latency of ~600ms vs 1ms.

References