Back to Blog
high SEVERITY8 min read

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.

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

Answer Summary

The missing Dependabot cooldown vulnerability (related to CWE-1357: Reliance on Insufficiently Trustworthy Component) occurs when a `.github/dependabot.yml` configuration lacks a cooldown period for package updates. In this Node.js library, the npm package-ecosystem entry had no cooldown block, allowing Dependabot to immediately propose updates to newly-published packages that could be malicious or unstable. The fix adds `cooldown: { default-days: 7 }` to wait 7 days before proposing updates, giving the security community time to identify compromised packages.

Vulnerability at a Glance

cweCWE-1357 (Reliance on Insufficiently Trustworthy Component)
fixAdd cooldown with default-days: 7 to enforce a 7-day waiting period
riskImmediate adoption of malicious or unstable newly-published npm packages
languageYAML (GitHub Actions configuration)
root causeNo cooldown block in the package-ecosystem configuration
vulnerabilityMissing Dependabot cooldown period

Introduction

In a Node.js library's repository, we discovered a high-severity configuration vulnerability in .github/dependabot.yml at line 3. The Dependabot configuration for the npm package-ecosystem lacked a critical safety feature: a cooldown period. This meant that whenever a new version of any npm dependency was published—even seconds after release—Dependabot would immediately propose an update to adopt it.

This seemingly minor configuration gap creates a significant attack surface. The npm ecosystem has witnessed numerous supply chain attacks where malicious actors compromise legitimate packages or publish typosquatted packages. Without a cooldown period, this library would be among the first to adopt potentially malicious package versions, before the security community has time to identify and report them.

For a Node.js library consumed by downstream projects, this vulnerability is particularly concerning. Any malicious code introduced through a compromised dependency would propagate to all consumers of the library, multiplying the attack's impact across the entire dependency tree.

The Vulnerability Explained

Let's examine the vulnerable configuration in .github/dependabot.yml:

version: 2
updates:
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: "weekly"
    open-pull-requests-limit: 10
    versioning-strategy: increase
    groups:
      # ... group configurations

The problem: This configuration has no cooldown block. When Dependabot runs on its weekly schedule, it checks for newly available package versions and immediately creates pull requests to update them—regardless of how recently those versions were published.

Why This Matters: The Supply Chain Attack Window

The npm ecosystem processes over 1,000 package publishes per hour. Among these legitimate updates, attackers occasionally succeed in:

  1. Account compromise: Gaining access to maintainer accounts of popular packages
  2. Typosquatting: Publishing packages with names similar to popular libraries
  3. Dependency confusion: Publishing malicious packages that shadow internal dependencies
  4. Compromised build pipelines: Injecting malicious code during the package build process

When these attacks occur, there's typically a critical window of 24-72 hours before the security community identifies and reports the malicious package. During this window, projects without cooldown periods will happily adopt the compromised version.

Attack Scenario: The Real-World Impact

Consider this specific attack scenario against this Node.js library:

  1. Day 0, 9:00 AM: An attacker compromises the npm account for a popular utility package that this library depends on (let's say a package used by one of the dependencies listed in package.json)

  2. Day 0, 9:15 AM: The attacker publishes version 2.4.1 of the compromised package containing:
    - Credential-stealing code that exfiltrates environment variables
    - A backdoor that executes commands from a remote server
    - Code that injects malicious scripts into build artifacts

  3. Day 0, 9:30 AM: Dependabot's weekly check runs and detects the new version 2.4.1

  4. Day 0, 9:35 AM: Without a cooldown, Dependabot immediately creates a PR to update to version 2.4.1

  5. Day 0, 10:00 AM: An automated CI/CD pipeline or a developer merges the PR, thinking it's a routine dependency update

  6. Day 0, 10:15 AM: The malicious code is now in the library's codebase and will be included in the next release

  7. Day 2, 3:00 PM: The security community identifies the compromised package and npm unpublishes it—but the damage is done

  8. Downstream impact: Every project that depends on this library now includes the malicious code, creating a cascading supply chain compromise

With a 7-day cooldown, this attack would have been prevented. The security community would have identified the compromise on Day 2, and Dependabot would still be in its cooldown period, never proposing the malicious update.

The Fix

The fix is straightforward but critical. Here's the exact change made to .github/dependabot.yml:

 version: 2
 updates:
   - package-ecosystem: "npm"
     directory: "/"
     schedule:
       interval: "weekly"
+    cooldown:
+      default-days: 7
     open-pull-requests-limit: 10
     versioning-strategy: increase
     groups:

Before and After Comparison

Before (Vulnerable):

updates:
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: "weekly"
    open-pull-requests-limit: 10

When Dependabot runs, it proposes updates to packages published at any time, including those released just seconds ago.

After (Secured):

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

Now, Dependabot only proposes updates to package versions that were published at least 7 days ago, creating a safety window for security review.

How This Specific Change Solves the Problem

The cooldown block with default-days: 7 implements a time-based trust boundary:

  1. Temporal filtering: Dependabot now filters out any package version published within the last 7 days when checking for updates

  2. Community vetting window: The 7-day period allows the npm security team, security researchers, and the open-source community to identify and report malicious packages

  3. Automated response time: npm's security team typically responds to reports of malicious packages within 24-48 hours, well within the 7-day window

  4. Zero configuration overhead: Once set, the cooldown requires no maintenance and automatically protects against all future updates

The fix is minimal—just 2 lines added—but the security improvement is substantial. This configuration change transforms Dependabot from a potential attack vector into a defense mechanism that respects the wisdom of the security community.

Prevention & Best Practices

1. Always Configure Cooldown Periods

For every package-ecosystem entry in your .github/dependabot.yml, add a cooldown block:

cooldown:
  default-days: 7  # Minimum recommended

Consider longer cooldown periods (14-30 days) for:
- Production-critical systems
- Projects with strict security requirements
- Packages with a history of supply chain attacks in their ecosystem

2. Implement Defense in Depth

A cooldown period is one layer of defense. Complement it with:

Dependency pinning:

{
  "dependencies": {
    "express": "4.18.2",  // Exact version, not ^4.18.2
    "lodash": "4.17.21"
  }
}

Lock file integrity checks:

# In your CI/CD pipeline
- name: Verify lock file integrity
  run: npm ci --audit

Automated security scanning:

# Add to your GitHub Actions workflow
- name: Run security audit
  run: npm audit --audit-level=moderate

3. Monitor Dependabot PRs Carefully

Even with a cooldown:
- Review the changelog and release notes for each update
- Check the package's GitHub repository for recent security issues
- Look for unusual patterns (new maintainers, sudden major version jumps)
- Verify that the package version has been available for at least 7 days

4. Use Static Analysis for Configuration Validation

Implement automated checks for your Dependabot configuration:

// Example test (from the PR's regression test)
const config = yaml.load(fs.readFileSync('.github/dependabot.yml', 'utf8'));

config.updates.forEach((update) => {
  expect(update.cooldown).to.exist;
  expect(update.cooldown['default-days']).to.be.at.least(7);
});

5. Stay Informed About Supply Chain Security

  • Subscribe to security advisories for your package ecosystems
  • Follow npm security announcements: https://github.com/npm/cli/security/advisories
  • Monitor the OpenSSF Scorecard for your critical dependencies: https://securityscorecards.dev/
  • Review CISA's guidance on software supply chain security

Security Standards Reference

This vulnerability relates to several security frameworks:

  • CWE-1357: Reliance on Insufficiently Trustworthy Component
  • OWASP Top 10 2021 - A06:2021: Vulnerable and Outdated Components
  • SLSA Level 2: Requires verification of provenance for dependencies
  • NIST SSDF: Secure Software Development Framework recommends vetting third-party components

Key Takeaways

  • The npm package-ecosystem in .github/dependabot.yml had no cooldown configuration, allowing immediate adoption of newly-published packages without any safety window for security review

  • A 7-day cooldown period creates a critical defense layer against supply chain attacks by allowing the security community time to identify and report malicious packages before they reach your codebase

  • This vulnerability is particularly dangerous for Node.js libraries because malicious code propagates to all downstream consumers, multiplying the attack surface across the entire dependency tree

  • The two-line fix (cooldown: { default-days: 7 }) provides substantial security improvement with zero runtime overhead or maintenance burden

  • Static analysis tools like Semgrep can automatically detect missing cooldown configurations through the package_managers.dependabot.dependabot-missing-cooldown rule, enabling proactive security validation

How Orbis AppSec Detected This

  • Source: Dependabot configuration in .github/dependabot.yml that controls when package updates are proposed
  • Sink: The missing cooldown block in the npm package-ecosystem configuration at line 3, allowing immediate adoption of newly-published packages
  • Missing control: No time-based filtering to wait for community security review before proposing updates to new package versions
  • CWE: CWE-1357 (Reliance on Insufficiently Trustworthy Component)
  • Fix: Added cooldown block with default-days: 7 to enforce a 7-day waiting period before Dependabot proposes updates to newly-published npm packages

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 cooldown period in this Dependabot configuration represented a significant supply chain security risk. While the fix is simple—just two lines of YAML—its impact on security posture is substantial. By enforcing a 7-day waiting period before adopting newly-published packages, this configuration change provides a critical window for the security community to identify and report malicious packages.

For Node.js libraries and any project with downstream consumers, supply chain security isn't optional—it's a responsibility. This vulnerability demonstrates that security isn't just about the code you write, but also about how you manage the code you depend on. A properly configured Dependabot with cooldown periods transforms automated dependency management from a potential attack vector into a security-conscious process that respects the collective wisdom of the open-source security community.

Review your own .github/dependabot.yml configuration today. If any package-ecosystem entry lacks a cooldown block, add one. Your future self—and your users—will thank you.

References

Frequently Asked Questions

What is a Dependabot cooldown period?

A Dependabot cooldown period is a waiting time (in days) before Dependabot proposes updates to newly-published package versions. It creates a safety window for the security community to identify malicious or unstable releases before they're automatically suggested to your project.

How do you prevent missing cooldown vulnerabilities in GitHub Actions?

Add a `cooldown` block with `default-days: 7` (or higher) to each `package-ecosystem` entry in your `.github/dependabot.yml` file. This ensures Dependabot waits at least 7 days before proposing updates to newly-published packages, allowing time for community vetting.

What CWE is missing Dependabot cooldown?

Missing Dependabot cooldown relates to CWE-1357 (Reliance on Insufficiently Trustworthy Component). It represents a failure to validate the trustworthiness of external components before integrating them, specifically by not allowing time for community security review of newly-published packages.

Is dependency scanning enough to prevent malicious package adoption?

No. While dependency scanning detects known vulnerabilities, it cannot identify zero-day malicious packages published minutes ago. A cooldown period provides time for the security community to discover and report compromised packages before they reach your codebase, creating a crucial defense layer.

Can static analysis detect missing Dependabot cooldown?

Yes. Static analysis tools like Semgrep can parse `.github/dependabot.yml` files and detect missing or insufficient cooldown configurations. The rule `package_managers.dependabot.dependabot-missing-cooldown` specifically checks for this pattern and flags configurations lacking proper cooldown blocks.

View the Security Fix

Check out the pull request that fixed this vulnerability

View PR #1171

Related Articles

high

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.

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 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.

high

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

A high-severity configuration flaw was discovered in a Dependabot configuration file where no cooldown period was set for package updates. This meant newly published—and potentially malicious or unstable—package versions could be immediately proposed for updates, exposing the project to supply chain attacks. The fix adds a 7-day cooldown period to allow the community to identify compromised packages before they're adopted.

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 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.