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. Without a cooldown period, Dependabot could immediately propose updates to newly published (and potentially malicious) package versions, exposing downstream consumers to supply chain attacks. The fix adds a 7-day `cooldown` block to both the `npm` and `github-actions` ecosystem entries.

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

Answer Summary

A missing Dependabot cooldown (related to CWE-829: Inclusion of Functionality from Untrusted Control Sphere) in a Node.js library's `.github/dependabot.yml` allows immediate adoption of newly published packages that may be malicious or unstable. The fix adds a `cooldown: default-days: 7` block to each `package-ecosystem` entry, ensuring Dependabot waits 7 days before proposing updates to newly released versions—giving the community time to flag compromised packages.

Vulnerability at a Glance

cweCWE-829 (Inclusion of Functionality from Untrusted Control Sphere)
fixAdded `cooldown: default-days: 7` to both `npm` and `github-actions` package ecosystem configurations
riskImmediate adoption of malicious or unstable newly-published packages
languageYAML (Node.js ecosystem configuration)
root causeNo `cooldown` block defined in `.github/dependabot.yml` ecosystem entries
vulnerabilityDependabot missing cooldown period

Introduction

In a Node.js library's repository, we discovered a high-severity supply chain configuration vulnerability at line 3 of .github/dependabot.yml. The file defined two package ecosystem entries—npm and github-actions—both configured to check for updates weekly with a limit of 10 open pull requests. However, neither entry included a cooldown block, meaning Dependabot would immediately propose updates to packages the moment they were published to npm or the GitHub Actions marketplace.

For a Node.js library, this is particularly dangerous: downstream consumers who depend on this package inherit whatever dependencies it pulls in. If a malicious actor publishes a compromised version of a transitive dependency and Dependabot immediately creates a PR that gets merged, every downstream project consuming this library becomes vulnerable.

The Vulnerability Explained

What Was Missing

Here's the original .github/dependabot.yml configuration:

version: 2
updates:
  - package-ecosystem: npm
    directory: /
    schedule:
      interval: weekly
    open-pull-requests-limit: 10
  - package-ecosystem: github-actions
    directory: /
    schedule:
      interval: weekly

Notice there's no cooldown configuration anywhere. This means that if a package publishes version 2.1.0 at 3:00 AM on a Tuesday, and Dependabot's weekly check runs at 3:01 AM, it will immediately create a pull request proposing the upgrade—before anyone in the security community has had a chance to analyze the new release.

Why This Matters

Supply chain attacks against npm packages are not theoretical. Real-world incidents include:

  • event-stream (2018): A malicious maintainer published a compromised version that stole cryptocurrency wallets. It took days before the community noticed.
  • ua-parser-js (2021): A hijacked package pushed cryptominers to millions of downstream projects.
  • colors and faker (2022): Maintainer-initiated sabotage that broke thousands of projects.

In all these cases, a 7-day cooldown would have provided critical protection. The malicious versions were typically identified and reported within 24-72 hours—well within a 7-day buffer.

Attack Scenario Specific to This Configuration

Consider this attack flow against this Node.js library:

  1. An attacker compromises a maintainer account for one of this library's npm dependencies
  2. They publish a new patch version (e.g., lodash@4.17.22) containing obfuscated malware
  3. Dependabot immediately detects the new version during its weekly scan
  4. Without a cooldown, Dependabot creates a PR proposing the upgrade
  5. A maintainer, seeing a routine patch bump from a trusted package, merges it
  6. The compromised dependency is now part of the library
  7. All downstream consumers who run npm install on projects depending on this library receive the malicious code

The same attack vector applies to the github-actions ecosystem entry—a compromised GitHub Action could exfiltrate secrets from CI/CD pipelines.

The Fix

The fix adds a cooldown block with default-days: 7 to both package ecosystem entries in .github/dependabot.yml:

Before (Vulnerable)

version: 2
updates:
  - package-ecosystem: npm
    directory: /
    schedule:
      interval: weekly
    open-pull-requests-limit: 10
  - package-ecosystem: github-actions
    directory: /
    schedule:
      interval: weekly

After (Fixed)

version: 2
updates:
  - package-ecosystem: npm
    directory: /
    schedule:
      interval: weekly
    open-pull-requests-limit: 10
    cooldown:
      default-days: 7
  - package-ecosystem: github-actions
    directory: /
    schedule:
      interval: weekly
    cooldown:
      default-days: 7

How the Fix Works

The cooldown configuration tells Dependabot: "After a new version of any package is published, wait at least 7 days before creating a pull request to update to that version." This provides a critical safety window:

  1. Community vetting: 7 days gives security researchers, automated scanners, and the open-source community time to analyze new releases
  2. npm advisory propagation: GitHub's advisory database and npm's security team typically flag compromised packages within 1-3 days
  3. Stability verification: Even non-malicious releases sometimes have critical bugs that are caught within the first week

Both ecosystem entries needed the fix because:
- npm: Protects against compromised JavaScript packages that would be bundled into the library
- github-actions: Protects against compromised CI/CD actions that could steal repository secrets, inject code, or tamper with build artifacts

Prevention & Best Practices

1. Always Configure Cooldown Periods

Every dependabot.yml should include cooldown periods. For high-security environments, consider longer periods:

cooldown:
  default-days: 7
  # Optional: longer cooldowns for specific dependency groups

2. Combine Cooldown with Other Defenses

A cooldown is one layer of defense. Also consider:

  • Lock files: Always commit package-lock.json to pin exact versions
  • npm audit: Run npm audit in CI pipelines to catch known vulnerabilities
  • Dependency review: Use GitHub's dependency review action to block PRs introducing known-vulnerable packages
  • Signed packages: Prefer packages with provenance attestations (npm's --provenance flag)

3. Audit Your Dependabot Configuration Regularly

Use static analysis tools like Semgrep to scan your .github/dependabot.yml for misconfigurations:

semgrep --config "p/supply-chain" .github/

4. Restrict Auto-Merge for Dependency Updates

Never auto-merge Dependabot PRs without additional checks. Combine cooldown with:
- Required CI passing
- Required security scan passing
- Manual approval for major version bumps

5. Monitor for Typosquatting

The cooldown protects against compromised legitimate packages, but also helps with typosquatting attacks where similarly-named malicious packages are published.

Key Takeaways

  • The cooldown block in dependabot.yml is not optional for production Node.js libraries—it's a critical supply chain defense that should be present in every ecosystem entry.
  • Both npm and github-actions ecosystems needed the fix because supply chain attacks target both runtime dependencies and CI/CD infrastructure.
  • 7 days is the recommended minimum cooldown because most malicious package publications are detected and reported within 1-3 days by the security community.
  • This Node.js library's downstream consumers were at elevated risk because a compromised transitive dependency would propagate to every project that depends on this library.
  • Static analysis with Semgrep can detect configuration-level supply chain risks that traditional code scanners miss—security extends beyond just source code.

How Orbis AppSec Detected This

  • Source: Newly published package versions on the npm registry and GitHub Actions marketplace
  • Sink: .github/dependabot.yml ecosystem entries at lines 3 and 8, where Dependabot evaluates whether to propose updates
  • Missing control: No cooldown block to delay adoption of newly published package versions
  • CWE: CWE-829 (Inclusion of Functionality from Untrusted Control Sphere)
  • Fix: Added cooldown: default-days: 7 to both the npm and github-actions package ecosystem entries, ensuring a 7-day waiting period before Dependabot proposes updates to newly released versions

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 is one of the most critical challenges facing the Node.js ecosystem today. A missing cooldown configuration in Dependabot might seem like a minor oversight, but it removes a crucial time-based defense against malicious package publications. By adding a 7-day cooldown to both the npm and github-actions ecosystem entries in this library's .github/dependabot.yml, we've ensured that newly published packages must survive community scrutiny before being proposed as updates—protecting both this library and all its downstream consumers.

The lesson is clear: your dependency management configuration is part of your security posture. Treat .github/dependabot.yml with the same rigor you apply to your application code.

References

Frequently Asked Questions

What is a Dependabot missing cooldown vulnerability?

It's a configuration weakness where Dependabot can propose updates to packages immediately after they're published, before the community has time to identify if they're malicious, typosquatted, or unstable.

How do you prevent missing cooldown in Dependabot configurations?

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

What CWE is Dependabot missing cooldown?

CWE-829: Inclusion of Functionality from Untrusted Control Sphere — the system may incorporate code from an untrusted source without adequate verification.

Is simply reviewing Dependabot PRs enough to prevent supply chain attacks?

No. Manual review can miss sophisticated supply chain attacks where malicious code is obfuscated. A cooldown period provides a critical time buffer for the broader community to detect and report compromised packages before they reach your repository.

Can static analysis detect Dependabot missing cooldown?

Yes. Tools like Semgrep can scan `.github/dependabot.yml` files for missing `cooldown` blocks using pattern-matching rules, as demonstrated in this detection.

View the Security Fix

Check out the pull request that fixed this vulnerability

View PR #641

Related Articles

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.

critical

How arbitrary code execution via injected protobuf definition type fields happens in Node.js and how to fix it

A critical arbitrary code execution vulnerability (CVE-2026-41242) was discovered in protobufjs versions prior to 7.5.5 and 8.0.1, allowing attackers to inject malicious code through crafted protobuf definition type fields. The fix upgrades the dependency from the vulnerable version 6.11.4 to 7.5.5, which properly sanitizes type field inputs during protobuf parsing. This vulnerability is especially dangerous because protobufjs is widely used in Node.js applications for serialization, meaning a s

high

How missing Dependabot cooldown happens in GitHub Actions CI/CD and how to fix it

A high-severity configuration gap was discovered in a Node.js library's `.github/dependabot.yml` file where no cooldown period was set for dependency updates. Without a cooldown, Dependabot could propose updates to newly published (and potentially malicious or unstable) package versions immediately after release, exposing the project and all downstream consumers to supply chain attacks. The fix adds a `cooldown` block with `default-days: 7` to each package ecosystem entry.

high

How missing Dependabot cooldown happens in GitHub Actions CI/CD and how to fix it

A Dependabot configuration file in a Node.js library was missing cooldown periods for both its `npm` and `github-actions` package ecosystem entries, meaning newly published (and potentially malicious) package versions could be proposed for immediate adoption. The fix adds a `cooldown` block with `default-days: 7` to each ecosystem entry, creating a critical 7-day buffer that allows the community to identify and flag compromised packages before they reach downstream consumers.