VYPR
Medium severity5.3NVD Advisory· Published Mar 26, 2026· Updated Apr 1, 2026

CVE-2026-33672

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.

PackageAffected versionsPatched versions
picomatchnpm
>= 4.0.0, < 4.0.44.0.4
picomatchnpm
>= 3.0.0, < 3.0.23.0.2
picomatchnpm
< 2.3.22.3.2

Affected products

1

Patches

1
4516eb521f13

Merge commit from fork

https://github.com/micromatch/picomatchDaniel TschinderMar 23, 2026via ghsa
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

News mentions

0

No linked articles in our index yet.