Back to Blog
high SEVERITY6 min read

How Missing Minimum Release Age Configuration in pnpm Workspaces Happens and How to Fix It

A Node.js library's pnpm workspace configuration lacked the `minimumReleaseAge` setting, leaving it vulnerable to malicious or unstable newly-published packages. By adding a 7-day waiting period (10,080 minutes) along with additional hardening measures like `blockExoticSubdeps` and `trustPolicy`, the project now has robust defense against supply chain attacks targeting its dependencies.

O
By Orbis AppSec
Published August 29, 2026Reviewed August 29, 2026

Answer Summary

The missing `minimumReleaseAge` configuration in pnpm-workspace.yaml is a supply chain security vulnerability (related to CWE-1357: Reliance on Insufficiently Trustworthy Component) that allows immediate installation of newly-published npm packages, which could be malicious or compromised. The fix adds `minimumReleaseAge: 10080` to enforce a 7-day waiting period before installing new package versions, combined with `blockExoticSubdeps: true` to prevent untrusted transitive dependencies and `trustPolicy: no-downgrade` to prevent malicious updates from weakening security settings.

Vulnerability at a Glance

cweCWE-1357 (Reliance on Insufficiently Trustworthy Component)
fixAdded 7-day minimum release age with additional supply chain hardening controls
riskImmediate installation of potentially malicious or compromised npm packages
languageNode.js (pnpm package manager)
root causepnpm-workspace.yaml lacked minimumReleaseAge setting to delay package adoption
vulnerabilityMissing minimum release age configuration for package installation

Introduction

In a Node.js library's repository, Semgrep flagged a high-severity supply chain vulnerability in the pnpm-workspace.yaml configuration file at line 1. The workspace configuration was missing the minimumReleaseAge setting—a critical defense mechanism introduced in pnpm v10.16.0. This gap meant the project would immediately install newly-published package versions without any waiting period, exposing downstream consumers to potential supply chain attacks.

The vulnerability is particularly concerning for this Node.js library because any security weakness doesn't just affect the library itself—it impacts every downstream consumer who depends on this package. A compromised dependency could propagate through the entire supply chain.

The Vulnerability Explained

Let's examine the original pnpm-workspace.yaml configuration:

catalog:
  ziko: ^1.10.0
  vite: ^8.2.1

minimumReleaseAgeExclude:
  - ziko@1.10.0

Notice what's missing: there's a minimumReleaseAgeExclude array (line 9) but no corresponding minimumReleaseAge setting. This configuration is dangerous because:

  1. Immediate Installation: When pnpm resolves dependencies, it will install the newest available version that satisfies the semver range immediately upon publication
  2. No Vetting Period: There's no grace period for the security community to identify and report malicious packages
  3. Transitive Risk: The vulnerability extends to all transitive dependencies, not just direct ones

How Could This Be Exploited?

Consider a realistic attack scenario against this specific workspace:

  1. Package Takeover: An attacker compromises the npm account of a maintainer for a package used by ziko or vite (transitive dependencies)
  2. Malicious Publication: The attacker publishes a new minor version (e.g., 1.10.1) containing malicious code designed to exfiltrate environment variables or inject backdoors
  3. Immediate Installation: Within minutes of publication, the next time someone runs pnpm install in this workspace, the malicious version gets installed
  4. Supply Chain Compromise: The malicious code executes during installation scripts or when the library is imported, potentially compromising CI/CD pipelines, developer machines, or production environments

Real-world examples of this attack pattern include:

  • The event-stream incident (2018): A popular npm package was compromised to steal cryptocurrency wallet credentials
  • The ua-parser-js attack (2021): Attackers published malicious versions that installed cryptocurrency miners
  • The coa and rc attacks (2021): Compromised packages contained password-stealing malware

Without minimumReleaseAge, this workspace has zero protection against these time-sensitive attacks.

The Fix

The security patch adds three layers of defense to pnpm-workspace.yaml:

catalog:
  ziko: ^1.10.0
  vite: ^8.2.1

# Wait at least 7 days before installing newly published package versions.
minimumReleaseAge: 10080

minimumReleaseAgeExclude:
  - ziko@1.10.0

# Prevent transitive dependencies from being installed from untrusted sources.
blockExoticSubdeps: true

# Prevent malicious package updates from downgrading security settings.
trustPolicy: no-downgrade

Breaking Down the Changes

1. Primary Defense - minimumReleaseAge: 10080 (line 9)

This setting enforces a 7-day (10,080 minute) waiting period before pnpm will install newly-published package versions. When a package maintainer publishes version 1.10.1 today, pnpm won't install it until 7 days have passed. This window allows:

  • Security researchers to analyze new releases
  • The npm security team to identify and remove malicious packages
  • The community to report suspicious behavior
  • Automated security scanners to flag anomalies

The 7-day period is based on industry research showing most malicious packages are identified and removed within 3-5 days of publication.

2. Transitive Dependency Protection - blockExoticSubdeps: true (line 15)

This setting prevents transitive dependencies from being installed from non-standard sources (git URLs, tarball URLs, local file paths). It ensures all subdependencies come through the npm registry where they're subject to security scanning. Without this, an attacker could compromise a direct dependency to pull in malicious code from an external source, bypassing npm's security controls.

3. Configuration Integrity - trustPolicy: no-downgrade (line 18)

This prevents package updates from weakening security settings. If a compromised package tries to modify .npmrc or pnpm-workspace.yaml to disable minimumReleaseAge or other protections, pnpm will reject the change. This is critical because sophisticated supply chain attacks often try to disable security controls as their first step.

Why Each Change Matters

The fix creates a defense-in-depth strategy:

  • minimumReleaseAge provides time-based protection
  • blockExoticSubdeps provides source-based protection
  • trustPolicy provides configuration-based protection

Together, they address multiple attack vectors that could compromise the supply chain.

Prevention & Best Practices

To protect your pnpm workspaces from supply chain attacks:

1. Always Configure minimumReleaseAge

Add this to every pnpm-workspace.yaml:

minimumReleaseAge: 10080  # 7 days in minutes

For production environments, consider even longer periods (14-30 days) if your update cadence allows.

2. Use Explicit Exclusions Sparingly

The minimumReleaseAgeExclude array should only contain packages where you need immediate updates:

minimumReleaseAgeExclude:
  - ziko@1.10.0  # Specific version for critical bug fix

Never exclude entire packages with wildcards—this defeats the protection.

3. Enable All Supply Chain Hardening Features

# Complete hardening configuration
minimumReleaseAge: 10080
blockExoticSubdeps: true
trustPolicy: no-downgrade
verifyStoreIntegrity: true

4. Implement Additional Controls

  • Lockfile Integrity: Always commit pnpm-lock.yaml and review changes carefully
  • Dependency Auditing: Run pnpm audit regularly and fix vulnerabilities promptly
  • Update Policies: Establish a process for reviewing dependency updates before merging
  • Supply Chain Scanning: Use tools like Socket, Snyk, or GitHub Dependency Review

5. Monitor Security Advisories

Subscribe to:
- npm security advisories
- GitHub Security Advisories for your dependencies
- Security mailing lists for critical packages

Security Standards

This vulnerability and fix align with:

  • OWASP Top 10 2021 - A06:2021 – Vulnerable and Outdated Components
  • CWE-1357: Reliance on Insufficiently Trustworthy Component
  • SLSA (Supply Chain Levels for Software Artifacts) framework recommendations
  • NIST SP 800-161r1 - Cybersecurity Supply Chain Risk Management

Key Takeaways

  • The pnpm-workspace.yaml file lacked minimumReleaseAge, allowing immediate installation of potentially malicious newly-published packages without any vetting period
  • A 7-day waiting period (10,080 minutes) provides critical time for the security community to identify and report compromised packages before they reach your project
  • The presence of minimumReleaseAgeExclude without minimumReleaseAge created a false sense of security—the exclusion list had no base policy to exclude from
  • Supply chain attacks target Node.js libraries specifically because compromising one library can affect thousands of downstream consumers through transitive dependencies
  • Three-layer defense (minimumReleaseAge + blockExoticSubdeps + trustPolicy) provides comprehensive protection against multiple supply chain attack vectors

How Orbis AppSec Detected This

  • Source: pnpm package resolution system pulling packages directly from npm registry
  • Sink: Package installation in pnpm-workspace.yaml without any time-based verification controls
  • Missing control: No minimumReleaseAge configuration to delay installation of newly-published package versions
  • CWE: CWE-1357 (Reliance on Insufficiently Trustworthy Component)
  • Fix: Added minimumReleaseAge: 10080 to enforce a 7-day waiting period, plus blockExoticSubdeps and trustPolicy for additional supply chain hardening

Orbis AppSec automatically detected this vulnerability and opened a pull request with the fix. Try Orbis AppSec on your repositories to find and fix issues like this automatically.

Conclusion

The missing minimumReleaseAge configuration in this pnpm workspace represented a critical gap in supply chain security defenses. By adding a 7-day waiting period along with additional hardening controls, the project now has robust protection against malicious or compromised packages. This fix is particularly important for Node.js libraries where vulnerabilities propagate to all downstream consumers.

Supply chain security requires defense in depth—no single control is sufficient. The combination of time-based delays, source restrictions, and configuration integrity checks creates multiple barriers that attackers must overcome. Every Node.js project using pnpm should implement these protections to defend against increasingly sophisticated supply chain attacks.

Remember: in supply chain security, time is your ally. A few days of delay in adopting new packages is a small price to pay for the security of your entire dependency tree.

References

Frequently Asked Questions

What is missing minimum release age in pnpm?

It's a configuration gap where pnpm installs newly-published packages immediately without waiting to verify they're safe, leaving projects vulnerable to supply chain attacks where attackers publish malicious packages or compromise legitimate ones.

How do you prevent supply chain attacks in pnpm workspaces?

Set `minimumReleaseAge: 10080` (7 days in minutes) in pnpm-workspace.yaml to delay installation of new package versions, enable `blockExoticSubdeps: true` to prevent untrusted transitive dependencies, and use `trustPolicy: no-downgrade` to prevent security setting downgrades.

What CWE is missing minimum release age?

This vulnerability relates to CWE-1357 (Reliance on Insufficiently Trustworthy Component), which covers the risk of using software components without adequate verification of their integrity and trustworthiness.

Is pinning package versions enough to prevent supply chain attacks?

No. While version pinning prevents unexpected updates, it doesn't protect against initially installing a compromised package. A minimum release age allows time for the security community to identify and report malicious packages before you install them.

Can static analysis detect missing minimumReleaseAge configuration?

Yes. Static analysis tools like Semgrep can detect missing `minimumReleaseAge` settings in pnpm-workspace.yaml files using specific rules that check for supply chain security configurations, as demonstrated in this case.

View the Security Fix

Check out the pull request that fixed this vulnerability

View PR #3

Related Articles

high

How Sensitive Data Exposure happens in Zotero plugins and how to fix it

A high-severity data exposure vulnerability in `Zotero.ts` automatically transmitted complete document metadata—including private notes, attachment paths, and tags—to external LLM services without user consent. The fix replaces broad `item.toJSON()` serialization with explicit field selection, sending only essential bibliographic data.

high

How missing dependency update cooldowns happen in GitHub Dependabot configurations and how to fix it

A semgrep scan flagged `.github/dependabot.yml` for lacking a cooldown period, meaning Dependabot would immediately propose updates to brand-new package versions across npm, Bundler, and Docker ecosystems. The fix adds a `cooldown: default-days: 7` block to every `package-ecosystem` entry, forcing a one-week waiting period before newly published releases are considered — reducing exposure to malicious or unstable package drops.

high

How dependabot-missing-cooldown happens in GitHub Actions/Node.js and how to fix it

The repository's `.github/dependabot.yml` had no cooldown period configured, meaning Dependabot could immediately propose updates to newly published package versions with zero time for the community to flag malware or instability. The fix adds a `cooldown` block with `default-days: 7` to both the `npm` and `github-actions` ecosystems, forcing a 7-day waiting period before new releases are surfaced as update PRs.

high

How Path Traversal Happens in TensorFlow's Data Service and How to Fix It

TensorFlow's data service dispatcher validated dataset IDs against forward-slash traversal attacks but overlooked backslash characters on non-Windows platforms, allowing attackers to escape the root directory. A targeted fix adds explicit backslash validation across all platforms, closing a high-severity path traversal vulnerability in the snapshot management system.

critical

How Unbounded WebSocket Message Handling Causes Resource Exhaustion in Node.js and How to Fix It

The WebSocketCrossServerAdapter class in a popular Node.js WebSocket library lacked any rate limiting on inbound messages, allowing attackers to flood Redis nodes and WebSocket servers with high-volume traffic. The fix introduces a configurable `rateLimit` option that caps messages per connection per second, preventing resource exhaustion while preserving legitimate functionality.

critical

How Remote Code Execution Happens in Handlebars Template Compilation and How to Fix It

CVE-2026-33937 is a critical remote code execution vulnerability in Handlebars.js that allows attackers to execute arbitrary code by passing maliciously crafted Abstract Syntax Tree (AST) objects to the compile() function. The vulnerability was patched in version 4.7.9, and we've upgraded to protect against this threat vector.