CVE-2026-33672
Description
Picomatch is a glob matcher written JavaScript. Versions prior to 4.0.4, 3.0.2, and 2.3.2 are vulnerable to a method injection vulnerability affecting the POSIX_REGEX_SOURCE object. Because the object inherits from Object.prototype, specially crafted POSIX bracket expressions (e.g., [[:constructor:]]) can reference inherited method names. These methods are implicitly converted to strings and injected into the generated regular expression. This leads to incorrect glob matching behavior (integrity impact), where patterns may match unintended filenames. The issue does not enable remote code execution, but it can cause security-relevant logic errors in applications that rely on glob matching for filtering, validation, or access control. All users of affected picomatch versions that process untrusted or user-controlled glob patterns are potentially impacted. This issue is fixed in picomatch 4.0.4, 3.0.2 and 2.3.2. Users should upgrade to one of these versions or later, depending on their supported release line. If upgrading is not immediately possible, avoid passing untrusted glob patterns to picomatch. Possible mitigations include sanitizing or rejecting untrusted glob patterns, especially those containing POSIX character classes like [[:...:]]; avoiding the use of POSIX bracket expressions if user input is involved; and manually patching the library by modifying POSIX_REGEX_SOURCE to use a null prototype.
Affected packages
Versions sourced from the GitHub Security Advisory.
| Package | Affected versions | Patched versions |
|---|---|---|
picomatchnpm | >= 4.0.0, < 4.0.4 | 4.0.4 |
picomatchnpm | >= 3.0.0, < 3.0.2 | 3.0.2 |
picomatchnpm | < 2.3.2 | 2.3.2 |
Affected products
1Patches
14516eb521f13Merge commit from fork
2 files changed · +9 −1
lib/constants.js+1 −0 modified@@ -71,6 +71,7 @@ const WINDOWS_CHARS = { */ const POSIX_REGEX_SOURCE = { + __proto__: null, alnum: 'a-zA-Z0-9', alpha: 'a-zA-Z', ascii: '\\x00-\\x7F',
test/malicious.js+8 −1 modified@@ -1,7 +1,7 @@ 'use strict'; const assert = require('assert'); -const { isMatch } = require('..'); +const { isMatch, makeRe } = require('..'); const repeat = n => '\\'.repeat(n); /** @@ -30,9 +30,16 @@ describe('handling of potential regex exploits', () => { assert(!isMatch('A', `!(${repeat(500)}A)`, { maxLength: 499 })); }, /Input length: 504, exceeds maximum allowed length: 499/); }); + it('should be able to accept Object instance properties', () => { assert(isMatch('constructor', 'constructor'), 'valid match'); assert(isMatch('__proto__', '__proto__'), 'valid match'); assert(isMatch('toString', 'toString'), 'valid match'); }); + + it('should not expose internal prototype properties', () => { + assert.equal(makeRe('[[:constructor:]]').toString(), '/^(?:[[:constructor:]\\])$/'); + assert(!isMatch('f }]', '[[:constructor:]]'), 'not valid match'); + assert(!isMatch('a }]', '[[:constructor:]]'), 'not valid match'); + }); });
Vulnerability mechanics
Synthesis attempt was rejected by the grounding validator. Re-run pending.
References
4- github.com/micromatch/picomatch/commit/4516eb521f13a46b2fe1a1d2c9ef6b20ddc0e903nvdPatchWEB
- github.com/micromatch/picomatch/security/advisories/GHSA-3v7f-55p6-f55pnvdPatchVendor AdvisoryWEB
- github.com/advisories/GHSA-3v7f-55p6-f55pghsaADVISORY
- nvd.nist.gov/vuln/detail/CVE-2026-33672ghsaADVISORY
News mentions
0No linked articles in our index yet.