Back to Blog
high SEVERITY7 min read

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

A high-severity configuration vulnerability 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 immediately propose updates to newly published (and potentially malicious) package versions, exposing downstream consumers to supply chain attacks. The fix adds a `cooldown` block with `default-days: 7` to both the `github-actions` and `npm` package ecosystem entries.

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

Answer Summary

A missing Dependabot cooldown (CWE-1395) in `.github/dependabot.yml` allows automated dependency updates to propose newly published, potentially malicious packages without any waiting period. This affects GitHub Actions and npm ecosystems in Node.js projects. The fix is adding a `cooldown:` block with `default-days: 7` to each `package-ecosystem` entry under `updates`, ensuring Dependabot waits 7 days before proposing updates to newly released versions.

Vulnerability at a Glance

cweCWE-1395 (Dependency on Vulnerable Third-Party Component)
fixAdded `cooldown: default-days: 7` to both `github-actions` and `npm` ecosystem configurations
riskSupply chain attack via malicious or unstable newly published packages
languageYAML (GitHub Actions / Node.js ecosystem)
root causeNo `cooldown` block configured in `dependabot.yml` package ecosystem entries
vulnerabilityDependabot missing cooldown period

How Missing Dependabot Cooldown Happens in GitHub Actions CI/CD and How to Fix It

Introduction

In a Node.js library's repository, we discovered a high-severity supply chain security vulnerability hiding in plain sight — not in application code, but in the .github/dependabot.yml configuration file at line 4. The file configured automated dependency updates for both GitHub Actions and npm packages with a weekly schedule, but it was missing a critical safety mechanism: a cooldown period.

This matters because this repository is a Node.js library — vulnerabilities in its dependency management don't just affect one application; they propagate to every downstream consumer who installs this package. Without a cooldown, a threat actor who publishes a malicious package version could see it automatically proposed as an update within hours, potentially merged by an unsuspecting maintainer, and then distributed to thousands of downstream users.

The Vulnerability Explained

Here's the vulnerable dependabot.yml configuration (simplified to show the relevant sections):

version: 2
updates:
  - package-ecosystem: github-actions
    directory: /
    schedule:
      interval: weekly
      day: monday
    groups:
      actions:
        patterns: ['*']

  - package-ecosystem: npm
    directory: /
    schedule:
      interval: weekly
      day: monday
    groups:
      npm:
        patterns: ['*']

Notice what's missing: there is no cooldown block in either ecosystem entry. This means that when Dependabot runs its weekly check on Monday, it will propose updates to any package version that exists at that moment — even if it was published seconds earlier.

How This Gets Exploited: A Concrete Attack Scenario

  1. Attacker identifies the target: They see this Node.js library uses Dependabot with no cooldown (this information is public in the .github/dependabot.yml file on GitHub).

  2. Attacker compromises or typosquats a dependency: They publish a malicious version of a package in the npm ecosystem that this library depends on — or they compromise an existing package maintainer's account and push a backdoored release.

  3. Timing the attack: They publish the malicious version on a Sunday night. On Monday morning, Dependabot runs its weekly check and immediately proposes a PR to update to the malicious version.

  4. The PR looks legitimate: Because the update is grouped under the npm group with patterns: ['*'], it may be bundled with other legitimate updates, making the malicious change harder to spot.

  5. Downstream impact: If merged, the malicious dependency becomes part of the library. Every downstream consumer who runs npm install or npm update pulls in the compromised code.

The same attack vector applies to the github-actions ecosystem — a compromised GitHub Action version could execute arbitrary code in CI/CD pipelines, potentially exfiltrating secrets, modifying builds, or injecting backdoors.

Why Weekly Scheduling Isn't Enough

A common misconception is that interval: weekly provides adequate protection because it limits how often updates are checked. However, the schedule only controls frequency of checks, not the age of packages being proposed. A package published 1 minute before the weekly check runs will still be immediately proposed. The cooldown period is an orthogonal control that ensures packages have existed for a minimum duration before being considered.

The Fix

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

Before:

  - package-ecosystem: github-actions
    directory: /
    schedule:
      interval: weekly
      day: monday
    groups:
      actions:
        patterns: ['*']

After:

  - package-ecosystem: github-actions
    directory: /
    schedule:
      interval: weekly
      day: monday
    cooldown:
      default-days: 7
    groups:
      actions:
        patterns: ['*']

The identical change was applied to the npm ecosystem entry:

Before:

  - package-ecosystem: npm
    directory: /
    schedule:
      interval: weekly
      day: monday
    groups:
      npm:
        patterns: ['*']

After:

  - package-ecosystem: npm
    directory: /
    schedule:
      interval: weekly
      day: monday
    cooldown:
      default-days: 7
    groups:
      npm:
        patterns: ['*']

Why This Solves the Problem

With default-days: 7, Dependabot will now ignore any package version that was published less than 7 days ago. This 7-day buffer provides:

  1. Community vetting time: If a package version is malicious, the community typically identifies and reports it within days. The npm security team can yank compromised packages before the cooldown expires.

  2. Stability assurance: Newly published versions sometimes have bugs that are quickly patched. Waiting 7 days means you're more likely to get a stable release.

  3. Attack window elimination: An attacker can no longer time a malicious publish to coincide with Dependabot's schedule. They would need the malicious version to survive public scrutiny for a full week.

Why Both Ecosystems Need the Fix

The change was applied to both the github-actions and npm entries because:

  • github-actions: Compromised Actions execute directly in CI/CD with access to repository secrets, deployment keys, and build artifacts.
  • npm: Compromised npm packages become transitive dependencies for all downstream consumers of this Node.js library.

Both attack surfaces are critical and require the cooldown protection independently.

Prevention & Best Practices

  1. Always configure cooldown periods: Any new dependabot.yml file should include cooldown: default-days: 7 (or higher) for every package ecosystem entry from day one.

  2. Consider longer cooldowns for critical dependencies: For security-sensitive dependencies, you might use ecosystem-specific overrides to set longer cooldown periods.

  3. Audit your Dependabot configuration regularly: Treat .github/dependabot.yml as a security-critical file. Include it in security reviews and code audits.

  4. Use lockfiles and integrity checks: Combine cooldown periods with npm audit, lockfile verification, and Subresource Integrity (SRI) hashes where possible.

  5. Enable Dependabot security alerts separately: Cooldown periods apply to version updates only. Security advisories (via dependabot alerts) should still be acted upon immediately.

  6. Scan configuration files with static analysis: Use tools like Semgrep with rules targeting Dependabot misconfigurations to catch these issues in CI.

  7. Review grouped PRs carefully: The patterns: ['*'] grouping means all dependency updates come in a single PR. While convenient, this makes it easier to overlook a malicious update hiding among legitimate ones. Consider more granular grouping for critical dependencies.

Key Takeaways

  • A dependabot.yml without cooldown is an open door for supply chain attacks — the weekly schedule provides zero protection against newly published malicious packages.
  • This Node.js library's missing cooldown affected two ecosystems (github-actions and npm), meaning both CI/CD pipelines and downstream consumers were at risk.
  • The patterns: ['*'] grouping amplified the risk by bundling all updates together, making it easier for a malicious update to slip through review unnoticed.
  • 7 days is the minimum recommended cooldown — it aligns with typical response times for npm security advisories and community reporting of compromised packages.
  • Configuration-as-code vulnerabilities are often overlooked because they don't involve traditional application logic, but they can have outsized impact on supply chain security.

How Orbis AppSec Detected This

  • Source: Newly published package versions in the npm registry and GitHub Actions marketplace that Dependabot would immediately propose without vetting.
  • Sink: The dependabot.yml configuration at lines 4 and 17 (the package-ecosystem entries) which control automated PR creation for dependency updates.
  • Missing control: No cooldown block was present in either ecosystem entry, meaning zero delay between package publication and update proposal.
  • CWE: CWE-1395 (Dependency on Vulnerable Third-Party Component)
  • Fix: Added cooldown: default-days: 7 to both the github-actions and npm package ecosystem entries in .github/dependabot.yml.

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 your application code — it's about securing the entire pipeline that brings external code into your project. A missing cooldown in dependabot.yml is a subtle but high-impact vulnerability that could allow freshly published malicious packages to be automatically proposed and potentially merged into your codebase.

For this Node.js library, the stakes were particularly high: any compromised dependency would flow downstream to every consumer. The 2-line fix — adding cooldown: default-days: 7 — creates a critical safety buffer that gives the security community time to identify and remove malicious packages before they reach your repository.

If you maintain any project with Dependabot enabled, check your dependabot.yml today. If you don't see a cooldown block, you're running without a safety net.

References

Frequently Asked Questions

What is a Dependabot missing cooldown vulnerability?

It's a configuration weakness where Dependabot has no waiting period before proposing updates to newly published package versions, meaning malicious packages published minutes ago could be immediately suggested for adoption.

How do you prevent missing cooldown vulnerabilities in GitHub Dependabot?

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 vetted by the community before being proposed.

What CWE is Dependabot missing cooldown?

CWE-1395 (Dependency on Vulnerable Third-Party Component) covers risks from adopting third-party dependencies without adequate vetting, which includes immediately adopting newly published versions.

Is weekly scheduling enough to prevent supply chain attacks via Dependabot?

No. Weekly scheduling only controls how often Dependabot checks for updates, not how old a package version must be before it's proposed. A cooldown period is a separate, necessary control.

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

Related Articles

high

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

A high-severity configuration gap in `.github/dependabot.yml` left a Node.js library vulnerable to supply chain attacks by accepting newly published packages without any waiting period. By adding a 7-day cooldown configuration to the GitHub Actions package ecosystem, the project now has a critical defense against malicious packages and unstable releases that could compromise downstream consumers.

high

How unbounded brace-expansion DoS happens in Node.js and how to fix it

CVE-2026-14257 is a denial-of-service vulnerability in the brace-expansion library that allows attackers to crash applications through unbounded expansion of brace patterns. By upgrading from version 2.1.2 to 2.1.3 and 5.0.6 to 5.0.8, we eliminated the risk of memory exhaustion attacks targeting glob pattern expansion in build tools and scripts.

high

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

A high-severity vulnerability was discovered in `.github/dependabot.yml` where the GitHub Actions package ecosystem lacked a cooldown period for newly published packages. This configuration gap could have allowed malicious or unstable packages to be automatically proposed for integration within minutes of publication, exposing the project and its downstream consumers to supply chain attacks. The fix adds a 7-day cooldown period to wait before accepting updates from newly published package versio

high

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

A high-severity vulnerability was discovered in a repository's `.github/dependabot.yml` configuration file that lacked a cooldown period for dependency updates. Without this protection, Dependabot could immediately propose updates to newly published packages, potentially introducing malicious or unstable code into the project before the security community has time to identify threats.

high

How DNS rebinding happens in Node.js MCP TypeScript SDK and how to fix it

The `@modelcontextprotocol/sdk` package (version 0.5.0) shipped without DNS rebinding protection enabled by default, leaving any Node.js application that hosts an MCP server exposed to cross-origin attacks from malicious websites. Upgrading to version 1.24.0 enables host-header validation and brings a suite of new security dependencies—including `cors`, `express-rate-limit`, and `jose`—that collectively close the attack surface. This fix was identified and patched automatically by Orbis AppSec b

high

How HTTP Transport Hijacking via Prototype Pollution happens in Node.js axios and how to fix it

A high-severity vulnerability (CVE-2026-42033) in axios 1.13.6 allowed attackers to hijack HTTP transport behavior through prototype pollution, potentially redirecting sensitive requests to attacker-controlled servers. The fix upgrades axios to 1.15.1 and proxy-from-env to 2.1.0 in a Node.js sandbox base image used in production, eliminating the attack vector.