Back to Blog
high SEVERITY7 min read

How Dependabot Missing Cooldown happens in GitHub Actions and how to fix it

A missing `cooldown` block in `.github/dependabot.yml` meant that newly published npm and GitHub Actions packages could be automatically proposed for adoption the moment they appeared on the registry — with no waiting period to detect malicious or unstable releases. Adding `cooldown: default-days: 7` to both `package-ecosystem` entries ensures Dependabot waits a full week before surfacing updates, giving the security community time to identify supply-chain threats before they reach your codebase

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

Answer Summary

The Dependabot Missing Cooldown vulnerability (CWE-1104: Use of Unmaintained Third-Party Components) occurs when a `.github/dependabot.yml` file omits the `cooldown` block, causing Dependabot to immediately propose updates to freshly published packages that may be malicious or unstable. In this Node.js library, both the `npm` and `github-actions` ecosystem entries lacked a cooldown period. The fix adds `cooldown: default-days: 7` to each `package-ecosystem` entry, introducing a 7-day buffer that allows the security community to detect supply-chain attacks — such as package hijacking or typosquatting — before automated PRs land in your repository.

Vulnerability at a Glance

cweCWE-1104 (Use of Unmaintained Third-Party Components)
fixAdded `cooldown: default-days: 7` to both the `npm` and `github-actions` ecosystem entries
riskAutomated adoption of newly published malicious or unstable packages
languageYAML (GitHub Actions / Dependabot configuration)
root causeNo `cooldown` block defined in either `package-ecosystem` entry of `.github/dependabot.yml`
vulnerabilityDependabot Missing Cooldown Period

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

Introduction

The .github/dependabot.yml file is the unsung gatekeeper of your dependency supply chain. It decides when Dependabot wakes up, which ecosystems it watches, and — critically — how quickly it proposes adopting brand-new package versions. In this Node.js library, a static analysis scan flagged that neither the npm nor the github-actions ecosystem entries included a cooldown block. That omission meant Dependabot was configured to open pull requests for packages the instant they appeared on the registry, with no waiting period whatsoever.

For a library whose vulnerabilities ripple downstream to every consumer, that is a meaningful risk surface — and one that is trivially easy to close.


The Vulnerability Explained

What "no cooldown" actually means

When Dependabot runs its weekly check and finds a new package version, it compares the publication timestamp against the current time. Without a cooldown setting, the threshold is effectively zero days — any version published even minutes ago is eligible to be proposed.

The vulnerable configuration looked like this (lines 7–11 and 23–27 of .github/dependabot.yml):

# npm ecosystem — BEFORE
- package-ecosystem: "npm"
  directory: "/"
  schedule:
    interval: "weekly"
  open-pull-requests-limit: 5
  groups:
    # The toolchain is dev-only (the package ships no runtime dependencies)
    ...

# github-actions ecosystem — BEFORE
- package-ecosystem: "github-actions"
  directory: "/"
  schedule:
    interval: "weekly"
  groups:
    actions:
      patterns:
        ...

Neither entry contains a cooldown block. Both ecosystems will happily surface a package version that was published seconds before the scheduled run.

Why this is a real threat

Supply-chain attacks against the npm and GitHub Actions ecosystems are not theoretical. Attackers use several well-documented techniques:

  • Package hijacking: Gaining control of a maintainer's account and publishing a malicious patch or minor release under a trusted package name.
  • Dependency confusion: Publishing a private-package name to the public registry with a higher version number, tricking automated tooling into pulling the attacker's code.
  • Typosquatting with version bumps: Publishing a lookalike package and waiting for automated tools to pick it up.

In all three scenarios, the attack window is the period between publication and detection. Security researchers, registry abuse teams, and automated scanners typically need 24–72 hours to identify and remove malicious packages. A 7-day cooldown comfortably covers that window.

The specific risk for this project

Because this is a Node.js library, its package.json influences every downstream project that installs it. A malicious transitive dependency introduced via a zero-cooldown Dependabot PR could silently exfiltrate secrets, tamper with build artifacts, or open a reverse shell — and the blast radius extends to every consumer of the library, not just this repository.

The GitHub Actions ecosystem carries equal risk: a compromised action pinned to a new tag could exfiltrate GITHUB_TOKEN, steal repository secrets, or tamper with release artifacts.


The Fix

The fix is four lines of YAML — two lines added to each ecosystem entry:

# npm ecosystem — AFTER
- package-ecosystem: "npm"
  directory: "/"
  schedule:
    interval: "weekly"
  cooldown:
    default-days: 7          # ← NEW
  open-pull-requests-limit: 5
  groups:
    ...

# github-actions ecosystem — AFTER
- package-ecosystem: "github-actions"
  directory: "/"
  schedule:
    interval: "weekly"
  cooldown:
    default-days: 7          # ← NEW
  groups:
    actions:
      patterns:
        ...

What the cooldown block does

The cooldown.default-days setting tells Dependabot to skip any package version whose publication date is less than N days old. With default-days: 7, a version published on Monday will not appear in a Dependabot PR until the following Monday at the earliest — regardless of how many weekly runs occur in between.

You can also tune cooldowns per-dependency type if your project has mixed risk tolerance:

cooldown:
  default-days: 7
  semver-patch-days: 3   # Patch releases are lower risk — wait less
  semver-minor-days: 5   # Minor releases — medium wait
  semver-major-days: 14  # Major releases — extra scrutiny

For this fix, default-days: 7 was chosen as a sensible, conservative baseline that matches GitHub's own recommendation.

Why both ecosystems needed the change

The diff touches two separate package-ecosystem entries. Each entry is an independent Dependabot configuration object; a cooldown block on the npm entry has no effect on the github-actions entry, and vice versa. Fixing only one would leave the other ecosystem unprotected — a subtle but important detail when reviewing the change.


Prevention & Best Practices

1. Always set a cooldown in new Dependabot configurations

Make cooldown: default-days: 7 part of your team's Dependabot configuration template. If you use a repository template or an internal cookiecutter, bake it in so that every new project inherits the setting.

2. Consider ecosystem-specific risk profiles

GitHub Actions versions (especially those pinned to mutable tags like v3) can change behavior without a version bump. Consider using semver-major-days: 14 for actions to allow extra time for community review of major releases.

3. Combine cooldown with SHA pinning for actions

For the highest-assurance posture, pin GitHub Actions to a full commit SHA rather than a tag, and use a tool like Dependabot's groups alongside cooldown to batch and review updates deliberately.

4. Lint your Dependabot configuration in CI

The Semgrep rule package_managers.dependabot.dependabot-missing-cooldown.dependabot-missing-cooldown can be run in your CI pipeline to catch regressions — for example, if a new package-ecosystem entry is added without a cooldown block.

# .github/workflows/semgrep.yml (excerpt)
- name: Run Semgrep
  run: semgrep --config=p/supply-chain .github/

5. OWASP and CWE alignment

This issue aligns with:

  • OWASP A06:2021 – Vulnerable and Outdated Components: Using components without verifying their integrity and provenance.
  • CWE-1104 – Use of Unmaintained Third-Party Components: Insufficient controls over third-party software lifecycle management.

Key Takeaways

  • Both ecosystem entries in .github/dependabot.yml required the fix independently — a cooldown block on one entry does not propagate to others.
  • Zero-cooldown Dependabot is an automated supply-chain attack surface: any malicious package published to npm or the Actions marketplace could reach your PR queue within hours.
  • Seven days is the recommended default because it exceeds the typical 24–72 hour window that security teams need to detect and remove malicious packages from public registries.
  • This Node.js library's downstream consumers were also at risk — a compromised transitive dependency introduced here would affect every project that installs this package.
  • The Semgrep rule dependabot-missing-cooldown reliably detects this pattern and can be integrated into CI to prevent regressions when new ecosystem entries are added.

How Orbis AppSec Detected This

  • Source: The .github/dependabot.yml configuration file, specifically the updates array entries for the npm and github-actions package ecosystems (lines 6 and 22).
  • Sink: Dependabot's version-update pipeline — the point at which a newly published package version is evaluated for PR creation with no time-based gate.
  • Missing control: Neither package-ecosystem entry contained a cooldown block, meaning the effective wait period before proposing any new package version was zero days.
  • CWE: CWE-1104 – Use of Unmaintained Third-Party Components (supply-chain lifecycle control).
  • Fix: Added cooldown: default-days: 7 to both the npm and github-actions entries in .github/dependabot.yml, introducing a mandatory 7-day waiting period before Dependabot can propose any newly published package version.

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

A missing cooldown block is one of the easiest supply-chain risks to introduce and one of the easiest to fix. Four lines of YAML in .github/dependabot.yml — two for npm, two for github-actions — transform Dependabot from a tool that could inadvertently fast-track a malicious package into one that gives the security community a full week to catch problems before they reach your codebase.

For a Node.js library with downstream consumers, that 7-day buffer is not just a nice-to-have: it is a meaningful layer of defense against the kind of supply-chain attacks that have compromised high-profile projects in recent years. Keep your Dependabot configurations linted, template the cooldown block into every new project, and treat your .github/dependabot.yml with the same security scrutiny you apply to your application code.


References

Frequently Asked Questions

What is the Dependabot Missing Cooldown vulnerability?

It is a configuration weakness where Dependabot is set up without a cooldown period, meaning it will immediately propose updates to packages the moment a new version is published — before the security community has had time to vet the release for malicious content or instability.

How do you prevent the Dependabot Missing Cooldown issue in GitHub Actions?

Add a `cooldown` block with `default-days: 7` (or more) to every `package-ecosystem` entry in your `.github/dependabot.yml` file. This instructs Dependabot to wait at least 7 days after a package version is published before opening a pull request for it.

What CWE is Dependabot Missing Cooldown?

It maps most closely to CWE-1104 (Use of Unmaintained Third-Party Components), as it relates to insufficient controls over the adoption of third-party software updates, and also to supply-chain risk categories tracked under OWASP A06:2021 – Vulnerable and Outdated Components.

Is pinning dependency versions enough to prevent supply-chain attacks without a cooldown?

Pinning helps but is not sufficient on its own. Dependabot's job is to unpin and update those versions; without a cooldown, a pinned version can be replaced by a malicious new release the same day it is published, before anyone has had a chance to review it.

Can static analysis detect a missing Dependabot cooldown?

Yes. The Semgrep rule `package_managers.dependabot.dependabot-missing-cooldown.dependabot-missing-cooldown` detects this pattern by inspecting `.github/dependabot.yml` for `updates` entries that lack a `cooldown` block, as demonstrated in this fix.

View the Security Fix

Check out the pull request that fixed this vulnerability

View PR #62

Related Articles

high

How Denial of Service via infinite loop happens in Node.js dependencies and how to fix it

A high-severity Denial of Service vulnerability in the nanoid package (CVE-2026-67213) was discovered in the project's dependency tree, where crafted input could trigger an infinite loop during random ID generation. The fix upgrades nanoid from 3.3.17 to 3.3.18 and adds an npm override to ensure all transitive dependencies use the patched version.

high

How Dependabot Missing Cooldown happens in GitHub Actions and how to fix it

A Dependabot configuration in `.github/dependabot.yml` was missing cooldown periods for both its npm and GitHub Actions package ecosystems, meaning newly published — potentially malicious or unstable — package versions could be proposed for adoption immediately after release. Adding a `cooldown` block with `default-days: 7` to each ecosystem entry creates a 7-day buffer, allowing the security community time to identify and flag compromised packages before they reach your codebase.

high

How pnpm Missing Minimum Release Age happens in Node.js workspaces and how to fix it

A missing `minimumReleaseAge` setting in `pnpm-workspace.yaml` left this Node.js workspace vulnerable to immediately installing newly published — potentially malicious — package versions. The fix adds `minimumReleaseAge: 10080` (7 days in minutes) to enforce a quarantine window before any freshly published package can be installed. This single configuration change significantly reduces the risk of supply chain attacks targeting the package publishing pipeline.

high

How Dependabot Missing Cooldown happens in GitHub Actions and how to fix it

A high-severity misconfiguration in `.github/dependabot.yml` left three `package-ecosystem` entries without a cooldown period, meaning Dependabot could immediately propose updates from newly published—potentially malicious—packages. The fix adds a `cooldown` block with `default-days: 7` to each entry, introducing a mandatory waiting period before any newly released package version is surfaced as an update candidate. For a Node.js library whose vulnerabilities ripple downstream to all consumers,

critical

How Unauthenticated Proxy Endpoints Enable DoS Amplification in FastAPI and how to fix it

Public proxy endpoints in `backend/api/proxy.py` had no rate limiting, allowing any attacker to flood the httpx connection pool with unauthenticated requests and amplify denial-of-service attacks against downstream tile and coordinate-conversion services. The fix introduces a per-IP sliding-window rate limiter using environment-configurable thresholds, closing the amplification vector without breaking legitimate usage.

high

How Dependabot Missing Cooldown happens in GitHub Actions and how to fix it

A missing `cooldown` block in `.github/dependabot.yml` meant that Dependabot could immediately propose updates to newly published npm packages — including those that may be malicious, compromised, or unstable. By adding a `cooldown` with `default-days: 7`, the project now waits one week before surfacing new package versions, giving the security community time to detect and flag bad releases before they reach production.