Back to Blog
high SEVERITY6 min read

How missing Dependabot cooldown happens in Node.js supply chain configuration and how to fix it

A high-severity supply chain vulnerability was discovered in a Node.js library's `.github/dependabot.yml` configuration file. The file lacked a `cooldown` block, meaning Dependabot could propose updates to newly published (and potentially malicious) package versions immediately upon release. A simple 2-line fix adding `default-days: 7` now ensures a 7-day quarantine period before any new dependency version is suggested.

O
By Orbis AppSec
Published July 25, 2026Reviewed July 25, 2026

Answer Summary

A missing Dependabot cooldown period (CWE-1357) in a Node.js library's `.github/dependabot.yml` allows automated dependency updates to propose newly published—and potentially malicious—package versions immediately. The fix adds a `cooldown` block with `default-days: 7` to each `package-ecosystem` entry, enforcing a 7-day waiting period that gives the community time to identify compromised packages before they're adopted.

Vulnerability at a Glance

cweCWE-1357 (Reliance on Insufficiently Trustworthy Component)
fixAdded `cooldown: default-days: 7` to delay updates for newly published versions
riskAutomated adoption of malicious or unstable newly-published npm packages
languageYAML (GitHub Actions / Node.js ecosystem)
root causeNo `cooldown` block in `dependabot.yml` package-ecosystem configuration
vulnerabilityDependabot missing cooldown period

How Missing Dependabot Cooldown Happens in Node.js Supply Chain Configuration and How to Fix It

Introduction

In this Node.js library's repository, we discovered a high-severity supply chain configuration flaw at line 3 of .github/dependabot.yml. The file configured Dependabot to check for npm dependency updates on a weekly schedule—but it had zero protection against newly published malicious packages. Without a cooldown block, Dependabot would eagerly propose updates to package versions that were published mere minutes ago, before anyone in the ecosystem could flag them as compromised.

This matters enormously for a Node.js library because the vulnerability doesn't just affect the library's maintainers—it affects every downstream consumer who depends on this package. A single poisoned transitive dependency, auto-merged via Dependabot, could propagate malware to thousands of applications.

The Vulnerability Explained

Here's the vulnerable dependabot.yml configuration that was in production:

version: 2
updates:
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: "weekly"

This configuration tells Dependabot: "Every week, check npm for new versions of my dependencies and open PRs to update them." The problem? There's no temporal safety net. The moment a new version appears on npm—whether it's a legitimate patch or a compromised package from a hijacked maintainer account—Dependabot will propose it.

How This Gets Exploited

Supply chain attacks on npm are not theoretical. Here's a concrete attack scenario targeting this exact configuration:

  1. Attacker compromises an npm maintainer's credentials (via phishing, credential stuffing, or token theft).
  2. Attacker publishes a malicious patch version of a dependency used by this library (e.g., bumping 1.2.3 to 1.2.4 with an embedded reverse shell or data exfiltration payload).
  3. Within the same week, Dependabot runs its scheduled scan and sees 1.2.4 is available.
  4. Dependabot opens a PR proposing the update. CI passes because the malicious code might not affect test outcomes (e.g., it only activates in production environments or on specific triggers).
  5. A maintainer merges the PR, either manually or via auto-merge rules.
  6. The malicious code ships to every downstream consumer of this Node.js library.

Real-world examples include the event-stream incident (2018), ua-parser-js hijacking (2021), and colors/faker sabotage (2022). In each case, a waiting period of even a few days would have allowed the community to detect and report the compromise before automated tools proposed the update.

Why the Weekly Schedule Doesn't Help

A common misconception: "I already run Dependabot weekly, so I'm not updating immediately." This is wrong. The schedule.interval controls how often Dependabot checks for updates, not how old a package version must be before it's considered safe. If a malicious version is published on Monday and Dependabot runs on Tuesday, the poisoned version gets proposed with no delay.

The Fix

The fix adds a cooldown block to the npm package-ecosystem entry, introducing a mandatory 7-day quarantine period:

Before:

version: 2
updates:
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: "weekly"

After:

version: 2
updates:
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: "weekly"
    cooldown:
      default-days: 7

How This Solves the Problem

The cooldown.default-days: 7 directive tells Dependabot: "Only propose a version update if the new version has been published for at least 7 days." This creates a critical safety window:

  • Day 0: Malicious version 1.2.4 is published to npm.
  • Days 1-6: The community detects the compromise. npm yanks the package. Security advisories are published. GitHub Advisory Database is updated.
  • Day 7: Dependabot checks—but the malicious version has been removed, so no PR is opened.

Even if the malicious version isn't yanked within 7 days, the delay gives security scanners (npm audit, Snyk, Socket.dev) time to flag the package, which would then cause CI to fail on the Dependabot PR.

The change is scoped to a single configuration file and doesn't alter any application logic, library code, or test behavior. It purely adds a temporal gate to the automated dependency update process.

Prevention & Best Practices

  1. Always configure cooldown periods: For any dependabot.yml, add cooldown.default-days of at least 7 days. For security-critical applications, consider 14-30 days.

  2. Use version pinning with lockfiles: Combine cooldown with package-lock.json (or yarn.lock) to ensure reproducible builds even if a dependency is compromised.

  3. Enable npm provenance verification: npm's provenance attestations (via Sigstore) verify that a package was built from a specific commit in a specific repository, making it harder for attackers to publish tampered versions.

  4. Don't auto-merge Dependabot PRs: Require human review for dependency updates, especially for major or minor version bumps.

  5. Use Socket.dev or similar tools: These analyze package behavior (network calls, filesystem access, obfuscated code) rather than just known CVEs.

  6. Scan configuration files: Use Semgrep or similar static analysis tools to catch misconfigurations in CI/CD files, not just application code.

  7. Apply the principle of least privilege: Limit Dependabot's permissions and ensure it cannot trigger deployments directly.

Key Takeaways

  • A schedule.interval of "weekly" does NOT provide a cooldown—it only controls scan frequency, not version age requirements.
  • Node.js libraries are force multipliers for supply chain attacks—a single compromised dependency in this library propagates to all downstream consumers.
  • The 7-day cooldown window aligns with real-world incident response timelines—most npm package compromises are detected and yanked within 1-3 days.
  • Configuration-as-code files like dependabot.yml are part of your attack surface—they deserve the same security scrutiny as application code.
  • Two lines of YAML (cooldown: and default-days: 7) eliminated a high-severity supply chain risk with zero impact on development velocity.

How Orbis AppSec Detected This

  • Source: The .github/dependabot.yml file at line 3, where the package-ecosystem: "npm" entry defines automated dependency update behavior for the repository.
  • Sink: Dependabot's automated PR creation mechanism, which would propose updates to any newly published npm package version without temporal validation.
  • Missing control: No cooldown block was present in the package-ecosystem configuration, meaning zero delay between package publication and update proposal.
  • CWE: CWE-1357 (Reliance on Insufficiently Trustworthy Component)
  • Fix: Added cooldown: default-days: 7 to the npm package-ecosystem entry, enforcing a 7-day minimum age for proposed dependency updates.

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

Supply chain security isn't just about scanning for known CVEs—it's about building temporal and procedural defenses against zero-day package compromises. This vulnerability in dependabot.yml demonstrates how a missing two-line configuration can expose an entire Node.js library (and its downstream consumers) to automated adoption of malicious packages. The fix is trivial, the protection is significant, and the lesson is clear: treat your CI/CD configuration files as security-critical infrastructure.

References

Frequently Asked Questions

What is a Dependabot missing cooldown vulnerability?

It occurs when a `dependabot.yml` configuration lacks a `cooldown` block, allowing Dependabot to immediately propose updates to package versions that were just published—before the community has time to identify if they are malicious or unstable.

How do you prevent missing cooldown vulnerabilities in Node.js Dependabot configurations?

Add a `cooldown` block with `default-days: 7` (or more) to each `package-ecosystem` entry in your `.github/dependabot.yml` file, ensuring newly published versions are quarantined before being proposed.

What CWE is Dependabot missing cooldown?

CWE-1357 (Reliance on Insufficiently Trustworthy Component) covers scenarios where software depends on components whose trustworthiness has not been sufficiently verified, which includes auto-adopting unvetted new package versions.

Is running Dependabot on a weekly schedule enough to prevent supply chain attacks?

No. A weekly schedule only controls how often Dependabot checks for updates, not how old a package version must be before it's proposed. Without a cooldown, a malicious package published one minute before the weekly scan would still be suggested.

Can static analysis detect missing Dependabot cooldown?

Yes. Tools like Semgrep can scan `dependabot.yml` files for missing `cooldown` blocks using rules like `package_managers.dependabot.dependabot-missing-cooldown.dependabot-missing-cooldown`.

View the Security Fix

Check out the pull request that fixed this vulnerability

View PR #359

Related Articles

high

How missing cooldown periods in Dependabot configuration happen in GitHub Actions and how to fix it

A high-severity vulnerability was discovered in a Node.js library's `.github/dependabot.yml` configuration file where no cooldown period was set for package updates. This exposed the project to potentially malicious or unstable newly-published packages, as Dependabot would immediately propose updates without any waiting period. The fix adds a 7-day cooldown to the npm package-ecosystem configuration, ensuring a safety window before adopting new package versions.

high

How missing Dependabot cooldown happens in Node.js GitHub Actions and how to fix it

A missing cooldown period in `.github/dependabot.yml` meant that newly published npm and GitHub Actions packages could be automatically proposed for adoption within minutes of release — before the security community has time to vet them. This high-severity finding was fixed by adding a `cooldown` block with `default-days: 7` to every `package-ecosystem` entry, giving the ecosystem time to flag malicious or unstable releases before they reach the codebase. Because this is a Node.js library, the r

high

How secrets: inherit over-privilege happens in GitHub Actions reusable workflows and how to fix it

A high-severity security finding was identified in `templates/claude-workflow/workflows/claude.yml` where `secrets: inherit` passed every repository secret to a reusable workflow, violating the principle of least privilege. The fix explicitly passes only `CLAUDE_CODE_OAUTH_TOKEN`—the single secret the called workflow actually needs—drastically reducing the blast radius if the reusable workflow is ever compromised.

high

How missing Dependabot cooldown configuration happens in GitHub Actions and how to fix it

A high-severity vulnerability was discovered in the `.github/dependabot.yml` configuration file where no cooldown period was set for dependency updates. This exposed the Node.js library and its downstream consumers to potentially malicious or unstable packages immediately after publication. The fix adds a 7-day cooldown period to all package ecosystem entries, providing a critical safety buffer before accepting newly published package versions.

critical

How supply chain code injection happens in Node.js build scripts and how to fix it

A critical supply chain vulnerability in the chatgpt-auto-continue extension's build utility allowed arbitrary code execution by fetching JavaScript from a CDN without integrity verification. The fix implements SHA-256 hash validation before executing the downloaded code, preventing potential supply chain attacks through compromised CDN content or man-in-the-middle attacks.

high

How NO_PROXY bypass via crafted URL happens in Node.js axios and how to fix it

A high-severity vulnerability (CVE-2026-42043) in axios versions prior to 1.15.1 allowed attackers to bypass NO_PROXY environment variable restrictions using specially crafted URLs. This meant HTTP requests intended to stay internal could be routed through an attacker-controlled proxy, potentially exposing sensitive data. The fix upgrades axios to version 1.15.1, which correctly validates URLs against NO_PROXY rules.