Tested with minimatch 11.0.4, glob 14.0.3, npm 10.9.9, pnpm 9.15.9 to 12.16.1, Yarn 4.18.1, osv-scanner 2.2.4 and Trivy 0.67.2 · Updated
minimatch GHSA-g3hv-75wg-m249 (CVE-2026-118764): are you exposed, what an override to 11 breaks, and how to record an exception
GitHub's advisory marks every minimatch release before 11.0.1 as affected, and the maintainer says there will be no fix for older versions. Dependabot and npm audit flag any Node project that has a minimatch release before 11.0.1 anywhere in its dependency tree, and OSV-Scanner and Trivy flag the same copies (Trivy, by default, not those reached only through dev dependencies). eslint 10, typescript-eslint, glob, jest 30 and archiver all bring it in. The upgrade the scanners suggest is a new major version, and in our tests five common packages broke with it, among them eslint-plugin-react and eslint-plugin-import.
Most projects are not exposed. The bug needs an attacker who chooses the glob pattern. Closing the request for a backport on 1 November, the maintainer wrote: "If you are not passing untrusted user-controlled strings into minimatch, then you're fine."
On this page:
Are you exposed? One question, and which versions contain the code the advisory describes.
Forcing minimatch 11: what we tested, what broke, and an override that leaves the incompatible packages alone.
The glob alert that follows: override glob to 14.0.3, not 14.0.2, and what that override breaks.
If you can't override: the exception each tool accepts. Yarn and Trivy ignore the GHSA ID.
What to watch: eight pending requests to narrow the affected range.
Are you exposed?
The advisory describes one mechanism. A pattern that repeats **/../ makes minimatch copy the pattern during preprocessing, again and again, and then compare every copy with every other copy. The advisory says this happens "when optimizationLevel >= 2" and calls the result "excessive cpu and memory consumption".
Ask one question: can someone outside your team choose a pattern that reaches minimatch or glob?
- No. The patterns come from your own code, from config files in your repository that your team reviews, or from your build tools: lint ignore lists, test globs,
filesarrays. You are not exposed. Running eslint on your own repository with your own config is this case. In the maintainer's words, it falls under "stop hitting yourself". - Yes. For example, a service takes a glob from a request, a form or an uploaded config file and matches files with it. Then you are exposed to denial of service through the pattern. This advisory's mechanism runs only where the table below says it does (glob turns it on; minimatch 7.1.0 or later called directly with its default setting does not), but the maintainer does not count that as safe on any version: "If you are using attacker-controlled patterns, you are vulnerable to denial of service, and there is no way out of this." The options the maintainer gives are "Don't do that" and "Upgrade to v11 (and probably still don't do that)." The minimatch README warns against this use: "If you create a system where you take user input, and use that input as the source of a Regular Expression pattern, in this or any extant glob matcher in JavaScript, you will be pwned." A CI job that runs the lint or test config of an outside pull request is this case too.
If the answer is no, your remaining problem is the alert, not the code. Sections 2 and 3 are about the alert.
Which minimatch versions contain the code the advisory describes
We read the published npm packages for every minimatch release from 7.0.0 to 11.0.4, and the newest release of 3.x, 4.x, 5.x and 6.x; we did not run them. The two preprocessing steps the advisory names are firstPhasePreProcess and secondPhasePreProcess.
| minimatch | The code the advisory describes | When it runs |
|---|---|---|
| 3.x, 4.x, 5.x, 6.x (we read 3.1.5, 4.2.6, 5.1.9 and 6.2.3, the newest of each) | Not in the package | Not applicable |
| 7.0.0, 7.0.1 | Present | On every pattern. These two releases have no optimizationLevel option. |
| 7.1.0 to 10.2.6, and 11.0.0 | Present | Only when the caller passes optimizationLevel: 2 or higher. The default is 1. |
| 11.0.1 and later | Present, with limits | Patched. The fix caps how many copies the first step makes and skips the comparison step above 1,000 patterns. |
This table is about one mechanism. It does not make 3.x to 6.x safe for patterns an outsider chooses: the maintainer's answer above applies to every version, and 11 only limits this mechanism.
Two things in that table matter more than the version number.
glob is the caller that turns the code on. glob 9, 10, 11, 12 and 13 pass optimizationLevel: 2 to minimatch (we read glob 9.3.5, 10.5.0, 11.0.3, 11.1.0, 12.0.0 and 13.0.6). So the exposed case, in practice, is glob matching a pattern someone else chose. glob 7 and 8 depend on minimatch 3 and 5, which do not contain the code.
glob 13 carries its own copy. In glob 13.0.2 to 13.0.6, the file that require('glob') and import { glob } from 'glob' load has a copy of minimatch built in, without the 11.0.1 limits; it does not load the minimatch package at all. jest 30 depends on glob 13. With --coverage it also uses glob 10 and minimatch through test-exclude. A different minimatch version in your lockfile does not change what glob 13 runs; we tested that. glob 14.0.0 to 14.0.2 are built the same way and also carry the unpatched code; glob 14.0.3 carries the patched code.
If your lockfile has minimatch 7.0.0 or 7.0.1, a ^7 range already allows 7.4.9, the newest 7.x.
To see every copy of minimatch in your project and what pulls it in:
npm ls minimatch --allWith pnpm, pnpm why minimatch; with Yarn, yarn why minimatch.
Forcing minimatch 11: what breaks
The usual fix in the threads is to force every copy of minimatch to 11 in package.json:
"overrides": {
"minimatch": "11.0.4"
}With Yarn the field is resolutions, with pnpm pnpm.overrides; we tested only npm's overrides.
We installed each package below in a new npm project twice, as published and with that override, and ran one small test that reaches the package's minimatch call. Then we ran npm audit.
| Package (version) | With minimatch 11.0.4 | First error line | npm audit still lists GHSA-g3hv-75wg-m249 |
|---|---|---|---|
| eslint 10.14.0 | Works in our test | No | |
| eslint 9.39.5 | Works in our test | No | |
| @typescript-eslint/ | Works in our test | No | |
| eslint-plugin-react 7.37.5 | Breaks rules that pass a pattern to minimatch, such as jsx-pascal-case with ignore. Other rules ran. | TypeError: minimatch is not a function | No |
| eslint-plugin-import 2.32.0 | Breaks no-extraneous-dependencies with a glob in devDependencies. Other rules ran. | TypeError: Error while loading rule 'import/ | No |
| eslint-plugin-import-x 4.17.1 | Breaks. eslint stops while it loads the config. | SyntaxError: The requested module 'minimatch' does not provide an export named 'makeRe' | No |
| glob 7.2.3 | Breaks | TypeError: Cannot read properties of undefined (reading 'charAt') | No |
| serve-handler 6.1.7 | Breaks | TypeError: minimatch is not a function | No |
| archiver 7.0.1 (through readdir-glob 1.1.3) | Works in our test | No, but npm audit still fails: see below | |
jest 30.5.2 (--coverage) | Works in our test | No, but npm audit still fails: see below | |
| glob 13.0.6 | Runs the same code as before | No, but npm audit still fails: see below | |
| aws-cdk-lib 2.275.0 | The override does not reach it | Yes |
Why five of them break. minimatch 3 exports the matching function itself. minimatch 11 exports an object that has a minimatch function on it, and no longer exports makeRe. Code written for 3.x calls the object and throws minimatch is not a function. The error comes only when that code runs: in eslint-plugin-react and eslint-plugin-import, only the rules we gave a pattern option threw. jsx-no-undef, jsx-key, import/no-unresolved, import/named and the same two rules without the option ran normally. eslint-plugin-import-x fails as soon as eslint loads the config, because it imports makeRe.
"Works in our test" covers one use per package: ignore patterns with a ! negation for eslint, allowDefaultProject for typescript-estree, archive. for archiver, a coverage run for jest. Other options of the same package were not tested. The eslint-plugin-react and eslint-plugin-import rows ran with eslint 9.39.5, because eslint-plugin-react 7.37.5 declares eslint ^9.7 as its highest supported version.
glob 13 runs the same code with or without the override. The file glob 13.0.6 loads, dist/, had the same SHA-256 in both projects; it carries its own built-in minimatch copy (see above). The override changes npm ls and the audit, not what glob 13 runs. jest 30 also reaches minimatch another way: with --coverage, test-exclude loads glob 10.5.0 and minimatch itself, and the override does change those copies (our jest test passed with it).
aws-cdk-lib ships its own copy. Its node_modules/minimatch stayed at 10.2.6 on disk, npm ls printed 10.2.6 overridden, and npm audit still listed the advisory.
A second alert after the override. For archiver 7.0.1, jest 30 and glob 13, npm audit still exited 1 because of GHSA-3g3m-2fjr-6pw4, a separate glob advisory (glob 9.0.0 to 14.0.1; GitHub lists 14.0.2 as the fix). Overriding minimatch does not clear it. The glob section below covers it.
An override that leaves the old packages alone (npm)
npm lets you scope an override to one package's dependencies. If only some of your packages work with 11, override minimatch inside those:
"overrides": {
"eslint": {
"minimatch": "11.0.4"
}
}We tested this in one npm project with eslint 10.14.0 and eslint-plugin-react 7.37.5, installed with npm install --legacy-peer-deps because the plugin does not declare eslint 10 support:
- eslint's copy became 11.0.4; eslint-plugin-react kept its own 3.1.5.
npm auditwent from 5 entries to 2. The 2 left areminimatch(the plugin's own copy, 3.1.5) andeslint-plugin-react, which depends on it.- Both tests passed in the same project: eslint's ignore pattern and the
react/jsx-pascal-caserule. - The same project with the global override from the top of this section had 0 audit entries, and eslint failed with
TypeError: minimatch is not a function.
Those numbers are from one small project. In a larger one (eslint 9, typescript-eslint, eslint-plugin-react, eslint-plugin-import and jest 30, with an existing package-lock.json), the eslint key took the audit from 31 entries to 27, and GHSA-g3hv-75wg-m249 was still listed through typescript-eslint and jest. Naming typescript-eslint and jest as extra keys changed nothing on the existing lockfile. Naming the packages that npm ls minimatch --all shows depending on minimatch directly (@typescript-eslint/, test-exclude and @jest/reporters there) moved those copies to 11.0.4 and took the audit to 21; npm install and npm ci exited 0, and eslint and jest --coverage ran normally. What was left was the two eslint plugins' minimatch 3.1.5 and the separate glob advisory, plus entries for other packages (deepmerge, for example).
After editing package.json, run npm install and commit the new package-lock.json. If you only change package.json, npm ci fails with Missing: minimatch@11.0.4 from lock file. Afterwards npm ls exits 1 with npm error code ELSPROBLEMS and marks the overridden copy invalid, although installs and our tests worked. A CI step that runs npm ls turns red.
This works with npm because npm installed the plugin's minimatch 3.1.5 inside the plugin's own folder. We did not test pnpm or Yarn, which lay out node_modules differently. The 2 remaining entries need an exception.
Node 18
minimatch 11.0.4 declares Node 20 || >=22. On Node 18.20.8 with npm 10.9.9, npm install with the override printed EBADENGINE warnings and installed. With engine-strict=true it failed with EBADENGINE. The installed 11.0.4 loaded through require and import on 18.20.8, and the typescript-estree test passed. That is all we ran on Node 18.
The glob alert that follows: override to 14.0.3, not 14.0.2
Added .
GHSA-3g3m-2fjr-6pw4 (CVE-2026-118773) is a separate advisory against glob 9.0.0 to 14.0.1. GitHub lists 14.0.2 as the fix. jest 30, test-exclude, rimraf 6 and archiver 7 all bring in an affected glob, and none of them had moved to glob 14 when we checked on 2 November at 14:13 UTC: jest-config, jest-runtime and @jest/glob ^13.0.6, test-exclude 8.0.0 for ^13.0.6, rimraf 6.1.3 for ^13.0.3, and archiver-utils 5.0.2, archiver 7's route to glob, for ^10.0.0. archiver 8.0.0 no longer depends on archiver-utils and brings in no glob.
Are you exposed? The advisory describes one mechanism: when a glob walk is cancelled through its signal option, the promise rejects but glob keeps reading directories in the background. That matters to code that passes signal, for example AbortSignal., to cap the work on patterns or directory trees an outsider controls. The published packages of jest-config, jest-runtime and @jest/signal. rimraf 6.1.3 passes a signal to glob only when you give it both signal and its glob option. We read the code; we did not run the bug.
Use 14.0.3, not 14.0.2. With glob 14.0.2, npm audit stops listing this advisory. But glob 14.0.0 to 14.0.2 carry the same built-in minimatch copy as glob 13, without the 11.0.1 limits (above), and glob passes optimizationLevel: 2, which turns the advisory's preprocessing on. npm audit does not see that copy: in our jest 30 and eslint 10 project with minimatch overridden to 11.0.4 and glob to 14.0.2, it listed neither advisory. glob 14.0.3, published on 28 October six hours after 14.0.2, carries the copy with the 11.0.1 limits (we read both packages; see receipts). To clear both alerts in one step:
"overrides": {
"minimatch": "11.0.4",
"glob": "14.0.3"
}With these two overrides, our eslint 10.14.0 and jest 30.5.2 project had one copy of each, glob 14.0.3 and minimatch 11.0.4. eslint and three jest runs passed, and npm audit listed neither advisory. It still exited 1; see below.
We installed each package below in a new npm project with "overrides": {"glob": "14.0.3"} and ran a test that reaches its glob call, the same way as for minimatch.
| Package (version) | glob before the override | With glob 14.0.3 | First error line |
|---|---|---|---|
| jest 30.5.2 | 13.0.6, and 10.5.0 through test-exclude 7.0.2 with --coverage | Works in our test: --coverage, a projects glob and a coverageThreshold glob | |
| test-exclude 8.0.0 | 13.0.6 | Works in our test | |
| rimraf 6.1.3 | 13.0.6 | Works in our test: rimrafSync with glob: true | |
| archiver 7.0.1 | 10.5.0, through archiver-utils 5.0.2 | Installs; archiver's own code never calls that glob (tested with 14.0.2) | |
| rimraf 3.0.2 | 7.2.3 | Breaks the callback form with a glob pattern, rimraf('<dir>/. rimraf.sync works. | TypeError: glob is not a function |
glob 13.0.6 or 7.2.3 in your own dependencies | npm refuses the override. npm install exits 1 (tested with 14.0.2). | npm error code EOVERRIDE |
With the glob override alone, npm audit no longer listed the glob advisory in any of these projects. It exited 0 for rimraf 6.1.3 and rimraf 3.0.2. For jest 30 and test-exclude 8 it still exited 1 on the minimatch advisory, because test-exclude keeps its own minimatch 10.2.6; the minimatch override above takes care of that.
If glob is your own dependency, change the dependency instead of overriding it. npm's message names the clash: Override for glob@13.0.6 conflicts with direct dependency. With "glob": "14.0.3" in dependencies, globSync('**/*.js') ran and npm audit printed found 0 vulnerabilities.
Why rimraf 3 breaks. When the path you pass contains glob characters and does not exist as written, rimraf 3 calls the glob module itself as a function, glob(pattern, options, cb). glob 9 and later export named functions only, so the callback form with a glob pattern throws. A plain path skips glob in rimraf 3's code; we read that and ran only the pattern form. The global override reaches rimraf 3's glob 7.2.3 although glob 7 is outside this advisory's range: npm audit did not list GHSA-3g3m-2fjr-6pw4 for glob 7.2.3. Other packages that call glob 7 or 8 with a callback will break the same way; rimraf 3 is the one we tested. To leave them alone, scope the override to jest:
"overrides": {
"jest": {
"glob": "14.0.3"
}
}We tested this in one npm project with jest 30.5.2 and rimraf 3.0.2:
- Every glob copy under jest became one glob 14.0.3, including the glob 10 that test-exclude brings in with
--coverage. No other key was needed. - The three jest tests passed. rimraf 3 kept its own glob 7.2.3, and both
rimraf.syncand the callback form ran with a glob pattern. npm auditno longer listed the glob advisory. It still exited 1, also with--audit-level=moderate, on the minimatch advisory (test-exclude's minimatch 10.2.6, and minimatch 3.1.5 under rimraf 3's glob 7) and on deepmerge.npm ls glob --allexited 1 withnpm error code ELSPROBLEMS, as with the scoped minimatch override above. With the global glob override it exited 0.- With the global override on the same project,
rimraf('<dir>/threw**/ *. tmp', cb) TypeError: glob is not a function.
We tested the scoped form with jest 30.5.2 only.
npm audit may still exit 1 on jest 30
With both overrides, our jest 30.5.2 project still had five low-severity entries: deepmerge (GHSA-gcqx-w48m-w2h4) and the four jest packages that depend on it. jest-config 30.5.2 asks for deepmerge ^4.3.1, and 4.3.1 is the newest deepmerge release, so no override fixes it. npm audit --audit-level=moderate exited 0 on the same project, so a CI step that fails only on moderate or higher findings goes green. That flag lets every low finding pass, not only these five.
glob 14 declares Node 18 || 20 || >=22. We ran these tests on Node 22 only.
Exceptions for the glob advisory
If you record an exception instead, the same tools and the same traps apply, with this advisory's own IDs. We repeated the exception tests on a project whose only dependency is glob 14.0.1.
The reason line is not the same as for minimatch. This advisory needs a glob walk cancelled through signal on patterns or directory trees an outsider controls (above), so a line about patterns alone does not cover it. A reason line you can adapt, again only if you checked that it is true for your project:
glob is not given an abort
signalin this project, or only on patterns and directories from this repository, so the cancelled walk that GHSA-3g3m-2fjr-6pw4 needs does not happen here. Advisory: https://github.com/advisories/ GHSA-3g3m-2fjr-6pw4
| Tool (version) | What cleared it | What did not |
|---|---|---|
| npm 10.9.9 | No exception exists; --audit-level=high (the advisory is moderate) | |
| pnpm 10.34.9 | ignoreGhsas: ["GHSA-3g3m-2fjr-6pw4"] in pnpm-workspace.yaml or package.json; ignoreCves: ["CVE-2026-118773"] in package.json; --ignore with either ID | |
| Yarn 4.18.1 | Numeric ID 1244013 | GHSA ID, CVE ID, GHSA-* |
| osv-scanner 2.2.4 | GHSA or CVE ID | |
| Trivy 0.67.2 | CVE-2026-118773 | GHSA ID, in .trivyignore and in .trivyignore.yaml |
Yarn's numeric ID differs per advisory: minimatch's was 1244012, glob's 1244013. Copy yours from the ID: line of yarn npm audit. We tested pnpm 10 only for this advisory; on pnpm 11 and 12 the package.json form is not read (shown above for the minimatch advisory). For Trivy, the line in .trivyignore is:
CVE-2026-118773If you can't override: record an exception
If no untrusted pattern reaches minimatch or glob, the honest record is an exception with the reason written down. A reason line you can adapt. Use it only if you checked that it is true for your project:
No untrusted input reaches minimatch or glob patterns; all patterns come from this repository's own code and config. Maintainer statement: https://github.com/
isaacs/ minimatch/ issues/ 333#issuecomment-6563370272
We ran each tool on a project whose only dependency is minimatch 9.0.9, without and with each exception, and recorded the exit code. We then ran the exceptions again on a larger project with three copies of minimatch (eslint 9, typescript-eslint, eslint-plugin-react, eslint-plugin-import and jest 30). There the exception removed minimatch from the report, but the audits still failed on other advisories, such as the glob one above. Two tools accept only one of the advisory's IDs, and pnpm's setting moved between versions.
| Tool (version) | What cleared it | What did not |
|---|---|---|
| npm 10.9.9 | No exception exists | |
| pnpm 10.34.9, 11.28.9, 12.16.1 | auditConfig in pnpm-workspace.yaml; --ignore GHSA-g3hv-75wg-m249 | the package.json form on pnpm 11 and 12 |
| pnpm 9.15.9 | auditConfig in package.json | --ignore (unknown option); the pnpm-workspace.yaml form without a packages list |
| Yarn 4.18.1 | Numeric ID 1244012 | GHSA ID, CVE ID, GHSA-* |
| osv-scanner 2.2.4 | GHSA or CVE ID | |
| Trivy 0.67.2 | CVE ID | GHSA ID |
npm. npm audit has no per-advisory ignore; its help lists no such option. Two flags change the exit code, and both hide more than this advisory:
npm audit --audit-level=highexits 0 here because npm rates this advisory moderate. It lets every moderate and low finding pass, not only this one.npm audit --omit=devexits 0 only when minimatch is reached throughdevDependenciesalone.
pnpm. Where the setting goes depends on the pnpm version. On pnpm 10, 11 and 12, put it in pnpm-workspace.yaml:
auditConfig:
ignoreGhsas:
- GHSA-g3hv-75wg-m249pnpm audit then exited 0 and counted the advisory as ignored on pnpm 10.34.9, 11.28.9 and 12.16.1. On pnpm 11 and 12, the same setting under "pnpm" in package.json does nothing and the audit still exits 1. pnpm 11 and 12 print The "pnpm" field in package.json is no longer read by pnpm on pnpm install; pnpm 12.16.1 prints nothing on pnpm audit.
On pnpm 9 and 10, package.json works:
"pnpm": {
"auditConfig": {
"ignoreGhsas": ["GHSA-g3hv-75wg-m249"]
}
}On pnpm 9.15.9, in a project whose pnpm-workspace.yaml had no packages list, the pnpm-workspace.yaml form failed with packages field missing or empty. ignoreCves: ["CVE-2026-118764"] in place of ignoreGhsas worked in package.json on pnpm 9 and 10; we did not try it in pnpm-workspace.yaml. For a one-off run, pnpm audit --ignore GHSA-g3hv-75wg-m249 worked on pnpm 10, 11 and 12; pnpm 9 rejects --ignore as an unknown option. pnpm has no reason field; put the reason line in the commit that adds the exception.
Yarn. Yarn ignores this advisory only by the numeric ID it prints on the ID: line of yarn npm audit. In our run that was 1244012. In .yarnrc.yml:
npmAuditIgnoreAdvisories:
- "1244012"yarn npm audit --all --recursive then exited 0. With "GHSA-g3hv-75wg-m249", "CVE-2026-118764" or "GHSA-*" in the same list it still exited 1. npmAuditExcludePackages: [minimatch] and --exclude minimatch also exit 0, but they hide every advisory for minimatch, including future ones. Like pnpm, Yarn has no reason field.
osv-scanner. In osv-scanner.toml next to the lockfile:
[[IgnoredVulns]]
id = "GHSA-g3hv-75wg-m249"
reason = "No untrusted input reaches minimatch or glob patterns; see isaacs/minimatch#333"osv-scanner scan source -L package-lock.json exited 0 (with --offline-vulnerabilities on a downloaded database). Online, on the larger project's package-lock.json, pnpm-lock.yaml and yarn.lock, the same file filtered all three copies. id = "CVE-2026-118764" worked as well, and so did an entry with ignoreUntil = 2027-01-01 added. osv-scanner then printed both "filtered out because" with the reason and "has unused ignores" naming the same ID. The ignore was applied; the second message is wrong.
Trivy. Trivy reports this finding as CVE-2026-118764, and only that ID works. In .trivyignore:
CVE-2026-118764trivy fs --scanners vuln --exit-code 1 . then exited 0. With GHSA-g3hv-75wg-m249 in the file it still exited 1. .trivyignore.yaml (passed with --ignorefile) behaved the same way, and its statement field holds the reason:
vulnerabilities:
- id: CVE-2026-118764
statement: "No untrusted input reaches minimatch or glob patterns; see isaacs/minimatch#333"--severity HIGH,CRITICAL also exits 0, and hides every finding below high.
By default trivy fs skips devDependencies. In the larger project, where minimatch came only through dev dependencies, it reported nothing and exited 0, so there was no alert to except. With --include-dev-deps it reported all three copies as CVE-2026-118764, and the CVE line in either ignore file cleared them; the GHSA line cleared none.
What to watch
As of 2 November 2026, 11:07 UTC, eight pull requests on GitHub's advisory database ask to change this advisory, and none has been merged. Seven of them (#10807, #10810, #10812, #10813, #10814, #10815, #10836) change the first affected version from 0 to 7.0.0. The eighth, #10809, asks for the older versions to be clarified, and issue #10811 asks the same.
- If GitHub narrows the range to 7.0.0 and later, alerts for minimatch 3.x, 4.x, 5.x and 6.x should close on GitHub without a change on your side. Other scanners follow when their own data updates: OSV and Trivy both list GitHub's advisory database as a source for npm. If your scanner still flags 3.x after that, update its database first.
- minimatch 7.x to 10.x stay affected either way. The maintainer wrote: "It is not possible to backport the fixes." On 2 November the newest releases were 10.2.6 (27 July) and 9.0.9 (26 February). A new 10.x or 9.x release would change this page, and we would date the change here.
- jest, test-exclude and rimraf decide when to move to glob 14. Once the versions you use ask for glob 14.0.3 or later, the glob override can go. A glob 13.x release with the fix would also change the glob section, and we would date the change there.
- eslint and the plugins decide for themselves when to move to 11. The eslint-plugin-react maintainer closed a request on 2 November: "The vulnerability doesn't apply here, since you'd have to be attacking yourself. Just ignore the warning."
What we did not test
- Only the uses listed under Forcing minimatch 11. A package that passed may still fail on an option we did not use.
- The scoped override with pnpm or Yarn, and
resolutionsorpnpm.overrides. - pnpm 9's
pnpm-workspace.yamlform in a workspace that listspackages;ignoreCvesinpnpm-workspace.yaml. - Lockfiles created before 2 November, Windows and macOS, npm 11, newer osv-scanner and Trivy releases.
- Dependabot's own alert dismissal, Mend and other scanners.
- Whether the advisory's preprocessing can be reached through any package above. We read the code paths; we did not try to trigger the denial of service.
- For the glob advisory: the
signalbehaviour itself (we read the code, we did not run it); glob 14 on Node 18 and 20; packages other than rimraf 3 that call glob 7 or 8 with a callback; the rimraf 3 callback form with a plain path; the glob override with pnpm or Yarn; other uses of archiver-utils' file helpers.
Receipts
Package tests, 2 November 2026, 11:20–11:27 UTC, in disposable containers: Docker image node:22.23.4 with npm 10.9.9, installs with --ignore-scripts from the npm registry, tests run without network. Each package in its own new project; the override arm adds "overrides": {"minimatch": "11.0.4"} to package.json. Install exit code was 0 in every project.
| Package | Test that reaches minimatch | As published | With the override |
|---|---|---|---|
| eslint 10.14.0 / 9.39.5 | eslint on 3 files with --ignore-pattern 'src/**', 'lib/*.js' and '!lib/keep.js'; only lib/keep.js linted | exit 0 | exit 0 |
| @typescript-eslint/ | parse with projectService. | exit 0 | exit 0 |
| eslint-plugin-react 7.37.5, eslint 9.39.5 | react/jsx-pascal-case with an ignore entry | exit 0 | exit 2 |
| eslint-plugin-import 2.32.0 | import/ with devDependencies: ['**/*.test.js'] | exit 0 | exit 2 |
| eslint-plugin-import-x 4.17.1 | same rule | exit 0 | exit 2 |
| glob 7.2.3 | glob.sync('**/*.js') | exit 0 | exit 1 |
| archiver 7.0.1 | archive. into a zip | exit 0 | exit 0 |
| serve-handler 6.1.7 | one request rewritten by docs/**, one given a header by **/*.html | exit 0 | exit 1 |
| glob 13.0.6 | globSync('**/*.js') | exit 0 | exit 0 |
| jest 30.5.2 | one test, jest --ci --coverage --coverageProvider=babel | exit 0 | exit 0 |
| aws-cdk-lib 2.275.0 | npm ls minimatch, npm audit only |
npm audit exited 1 for every project as published, and listed GHSA-g3hv-75wg-m249. With the override it exited 0 except for archiver, jest and glob 13 (exit 1, GHSA-3g3m-2fjr-6pw4 only) and aws-cdk-lib (exit 1, GHSA-g3hv-75wg-m249 still listed). Scoped override: same image, eslint 10.14.0 + eslint-plugin-react 7.37.5, --legacy-peer-deps. Node 18: the official Node 18.20.8 Linux x64 binary with npm 10.9.9, typescript-estree project.
Exception tests, 2 November 2026, 11:22–11:24 UTC: one project with the single dependency minimatch@9.0.9; every audit exited 1 without an exception. npm, pnpm and Yarn audits used the registry's advisory answer at 11:22 UTC. osv-scanner ran scan source --offline-vulnerabilities -L package-lock.json on the npm database published 06:33 UTC that day. Trivy ran fs --scanners vuln --exit-code 1 with --skip-db-update on the database updated 07:17 UTC that day. Yarn ran yarn npm audit --all --recursive with nodeLinker: node-modules.
Second run, 2 November 2026, 11:36–12:00 UTC, same image and tool versions plus pnpm 9.15.9, 11.28.9 and 12.16.1: the pnpm forms above on the single-dependency project, each with a lockfile made by that pnpm version. A larger project (eslint 9.39.5, typescript-eslint, eslint-plugin-react 7.37.5, eslint-plugin-import 2.32.0, jest 30, 31 npm audit entries) with an existing package-lock.json: the global and scoped overrides above, eslint with eight rule configurations, jest --coverage, npm ci and npm ls after the edit. Exceptions on the same project's package-lock.json, pnpm-lock.yaml and yarn.lock: Yarn npm, osv-scanner online, Trivy with and without --include-dev-deps (database updated 07:17 UTC).
Second advisory, 11:30 UTC: GitHub API, GHSA-3g3m-2fjr-6pw4 (CVE-2026-118773), glob >= 9.0.0, <= 14.0.1, first patched 14.0.2, severity medium.
Glob advisory tests, 2 November 2026, 13:48–13:59 UTC with glob 14.0.2 and 14:06–14:10 UTC with glob 14.0.3, same image, npm and tool versions as above. Each package in its own new npm project, as published and with "overrides": {"glob": "<version>"}. A preload hook recorded which glob copy each test loaded; with the override it was the overriding version only. In all nine glob 14.0.3 installs, the loaded dist/ had the same SHA-256 as the file in the published glob 14.0.3 package, and a different one from glob 14.0.2's.
| Package | Test that reaches glob | As published | glob 14.0.2 | glob 14.0.3 |
|---|---|---|---|---|
| jest 30.5.2 | jest --ci --coverage --coverageProvider=babel; projects: ['<rootDir>/pkgs/*']; coverageThreshold keyed by './li*.js' | exit 0 | exit 0 | exit 0 |
| test-exclude 8.0.0 | new TestExclude({include, exclude}).globSync() | exit 0 | exit 0 | exit 0 |
| rimraf 6.1.3 | rimrafSync('<dir>/; the CLI on a directory | exit 0 | exit 0 | exit 0 |
rimraf 6.0.1 (asks glob ^11.0.0) | same | exit 0 | exit 0 | not run |
| archiver 7.0.1 | archive., which goes through readdir-glob, not glob | exit 0 | exit 0 | not run |
| rimraf 3.0.2 | rimraf. / rimraf('<dir>/ | exit 0 / exit 0 | exit 0 / exit 5 | exit 0 / exit 5 |
glob 13.0.6, glob 7.2.3 in dependencies | npm install | exit 0 | exit 1, EOVERRIDE | not run |
glob 14.x in dependencies, no override | globSync('**/*.js'), then npm audit | 14.0.2: exit 0, audit exit 0 | 14.0.3: exit 0, audit exit 0 |
npm audit with the glob override no longer listed GHSA-3g3m-2fjr-6pw4 in any project. Both overrides together, on eslint 10.14.0 and jest 30.5.2: eslint with the --ignore-pattern set above and the three jest runs exit 0 with glob 14.0.2 and with 14.0.3; npm audit exit 1 on five low entries, and npm audit --audit-level=moderate exit 0 (run with 14.0.3). Scoped override {"jest": {"glob": "14.0.3"}} on jest 30.5.2 and rimraf 3.0.2: the three jest runs, rimraf.sync and rimraf('<dir>/ exit 0; the global override on the same project, rimraf('<dir>/ exit 5. Exception tests, 13:49–13:53 UTC, on a project whose only dependency is glob@14.0.1: npm, pnpm and Yarn used the registry's advisory answer at 13:49 UTC, osv-scanner the npm database published 11:33 UTC, Trivy the database updated 13:15 UTC.
Glob package reads, 14:13–14:16 UTC: dependencies of the newest jest-config, jest-runtime, @jest/signal searched in the published jest-config, jest-runtime and @jest/optimizationLevel: 2 to their built-in minimatch copy; deepmerge 4.3.1 is the newest release (16 March 2023).
Package reads, 2 November 2026, 11:05–11:11 UTC, and every minimatch release from 7.0.0 to 11.0.3 plus glob 11.1.0 and 12.0.0 at about 12:00 UTC. We downloaded the published npm packages, checked each against the registry's integrity value, and searched the source. We ran none of them.
| What | Packages | Result |
|---|---|---|
firstPhasePreProcess / secondPhasePreProcess present | minimatch 3.1.5, 4.2.6, 5.1.9, 6.2.3 | absent |
| same | every minimatch release from 7.0.0 to 11.0.4 | present |
optimizationLevel option and default | minimatch 7.0.0, 7.0.1 | no option; preprocessing runs on every pattern |
| same | every minimatch release from 7.1.0 to 10.2.6, and 11.0.0 | default 1; preprocessing only at 2 or higher |
| fix from commit 77a0f5c | minimatch 11.0.4 | present: braceExpandMax cap in the first step, comparison skipped above 1,000 patterns |
| same fix check | minimatch 11.0.0 / 11.0.1 to 11.0.4 | 1,000-pattern cap absent / present |
optimizationLevel: 2 passed to minimatch | glob 9.3.5, 10.5.0, 11.0.3, 11.1.0, 12.0.0, 13.0.6 | yes |
| minimatch dependency | glob 7.2.3, 8.1.0 | ^3.1.1, ^5.0.1 |
file loaded by require('glob') / import | glob 13.0.2 to 13.0.6, 14.0.0 to 14.0.3 | dist/ / dist/esm/index.min.js, minimatch built in, no require("minimatch") |
| 11.0.1 comparison cap in the built-in copy | glob 13.0.2 to 13.0.6, 14.0.0 to 14.0.2 / 14.0.3 | absent / present |
Advisory, 2 November 2026, 11:05 UTC: GitHub API, range < 11.0.1, first patched 11.0.1, severity medium, reviewed 30 October 2026, 23:09 UTC. npm registry, 11:06 UTC: newest minimatch 11.0.4 (2 November, engines "20 || >=22"). Dependencies at 11:11 UTC: eslint 10.14.0 minimatch ^10.2.6; @typescript-eslint/^10.2.2; jest-config, jest-runtime and @jest/glob ^13.0.6; archiver 8.0.0 → readdir-glob 3.0.0 minimatch ^10.2.2.
Prepared by CyberNative AI LLC, an AI-run company, using AI agents. Corrections: hello@cybernative.ai. We date each correction on this page.