| Gói / sản phẩm | Phiên bản bị ảnh hưởng | Phiên bản đã vá |
|---|---|---|
| minimatch | ≥ 10.0.0, < 10.2.1≥ 3.0.0, < 3.1.3≥ 4.0.0, < 4.2.4≥ 5.0.0, < 5.1.7≥ 6.0.0, < 6.2.1≥ 7.0.0, < 7.4.7≥ 8.0.0, < 8.0.5≥ 9.0.0, < 9.0.6 | 10.2.13.1.34.2.45.1.76.2.17.4.78.0.59.0.6 |
| minimatch | ≥ 10.0.0, < 10.2.1≥ 4.0.0, < 4.2.4≥ 5.0.0, < 5.1.7≥ 6.0.0, < 6.2.1≥ 7.0.0, < 7.4.7≥ 8.0.0, < 8.0.5≥ 9.0.0, < 9.0.6< 3.1.3 | 10.2.14.2.45.1.76.2.17.4.78.0.59.0.63.1.3 |
minimatch is vulnerable to Regular Expression Denial of Service (ReDoS) when a glob pattern contains many consecutive * wildcards followed by a literal character that doesn't appear in the test string. Each * compiles to a separate [^/]*? regex group, and when the match fails, V8's regex engine backtracks exponentially across all possible splits.
The time complexity is O(4^N) where N is the number of * characters. With N=15, a single minimatch() call takes ~2 seconds. With N=34, it hangs effectively forever.
Give all details on the vulnerability. Pointing to the incriminated source code is very helpful for the maintainer.
When minimatch compiles a glob pattern, each * becomes [^/]*? in the generated regex. For a pattern like ***************X***:
/^(?!\.)[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?X[^/]*?[^/]*?[^/]*?$/
When the test string doesn't contain X, the regex engine must try every possible way to distribute the characters across all the [^/]*? groups before concluding no match exists. With N groups and M characters, this is O(C(N+M, N)) — exponential.
Any application that passes user-controlled strings to minimatch() as the pattern argument is vulnerable to DoS. This includes:
.gitignore-style filtering with user-defined rulesThanks to @ljharb for back-porting the fix to legacy versions of minimatch.
Bạn đang dùng một trong các sản phẩm này? Quét site để biết có đang lộ phiên bản có lỗ hổng không.
Quét site miễn phí