Back to Blog
high SEVERITY6 min read

How a missing cooldown period happens in Dependabot configs and how to fix it

A Dependabot configuration in `.github/dependabot.yml` had no cooldown period, meaning Dependabot could open pull requests for brand-new package versions the moment they were published — before the community had a chance to flag malware, typosquats, or breaking bugs. The fix adds a `cooldown` block with `default-days: 7` to every `package-ecosystem` entry, forcing a one-week buffer before new releases are proposed.

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

Answer Summary

This is a Dependabot missing-cooldown misconfiguration (CWE-1357, Reliance on an Insufficiently Trustworthy Component) in `.github/dependabot.yml`. It's fixed by adding a `cooldown` block with `default-days: 7` under every `package-ecosystem` entry in `updates`, delaying automatic update PRs until a newly published package version has been available for at least seven days.

Vulnerability at a Glance

cweCWE-1357 (Reliance on Insufficiently Trustworthy Component)
fixAdd `cooldown: { default-days: 7 }` to each `package-ecosystem` entry under `updates`
riskAutomated PRs can pull newly published, potentially malicious or unstable package versions with zero delay
languageYAML (GitHub Dependabot configuration)
root causeNo `cooldown` block configured on `package-ecosystem` entries in `.github/dependabot.yml`
vulnerabilityDependabot missing cooldown period

Introduction

The .github/dependabot.yml file controls how GitHub's Dependabot bot behaves when it scans your dependency manifests and proposes version bumps. It's easy to think of this file as pure automation plumbing — but a missing setting in it can quietly turn Dependabot into a supply-chain liability. In this case, the configuration had no cooldown block on any of its package-ecosystem entries, meaning Dependabot would open pull requests for a package version the moment it was published on the registry, with zero delay.

That gap matters more than it sounds. Newly published package versions are, by definition, the least-vetted code in the entire dependency tree. Malicious actors have repeatedly compromised maintainer accounts or published typosquatted packages that get picked up by automated tooling within hours. Without a cooldown, Dependabot has no built-in defense against being the very automation that pulls a compromised release straight into your CI pipeline.

The Vulnerability Explained

A typical vulnerable dependabot.yml looks like this:

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

Notice what's absent: there is no cooldown key anywhere under either updates entry. As soon as a new npm package version or GitHub Action tag is published, Dependabot's scheduler is free to detect it on the very next run and open a PR proposing the bump — sometimes within minutes of the release hitting the registry.

Why this is dangerous in practice:

  • Malicious package versions. Attackers who compromise a maintainer's npm token can push a backdoored patch release. If your dependabot.yml has no cooldown, an automated PR proposing that exact malicious version can land in your repo before the community, security researchers, or the registry itself has time to detect and pull it.
  • Unstable releases. Even without malice, freshly published versions are more likely to contain regressions. A cooldown-less config means your CI could start testing against (or even auto-merging, if you have merge automation) an untested release the same day it ships.
  • Automated exploitation chains. Bots that scan public repos for outdated Dependabot configs can specifically target repositories with no cooldown, timing malicious package publishes to coincide with a project's Dependabot schedule to maximize the odds of an unreviewed merge.

An attacker doesn't need to touch your code at all — they only need to publish a bad version of a dependency you already use, and your own automation does the rest.

The Fix

The remediation is to add a cooldown block to every package-ecosystem entry under updates, setting default-days: 7. This tells Dependabot: "don't propose a version until it has been publicly available for at least 7 days."

Before:

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

After:

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

Every package-ecosystem block now carries its own cooldown.default-days: 7, so Dependabot's scheduler filters out any version whose publish timestamp is less than seven days old before it even considers opening a pull request. This buys time for:

  • Registry-side malware scanning and takedowns to catch compromised releases
  • The maintainer/security community to flag broken or malicious versions
  • CVE databases and advisory feeds to catch up with newly disclosed issues in the dependency

Because the fix is applied uniformly across every ecosystem entry (not just one), there's no ecosystem left with a silent gap — npm packages and GitHub Actions references are both covered under the same seven-day rule.

Prevention & Best Practices

  • Always configure cooldown explicitly. Don't rely on defaults; GitHub's docs recommend setting default-days explicitly so the intent is visible in version control and reviewable in PRs.
  • Tune cooldown per ecosystem if needed. High-risk ecosystems (e.g., npm, given its history of supply-chain incidents) can use a longer cooldown than lower-risk ones, using the ecosystem-specific cooldown overrides GitHub supports.
  • Pair cooldown with review requirements. A cooldown reduces risk but isn't a substitute for requiring human review/approval on Dependabot PRs before merge, especially for major version bumps.
  • Audit your dependabot.yml in CI. Add a linting/Semgrep check (rule: package_managers.dependabot.dependabot-missing-cooldown) to your pipeline so any new package-ecosystem entry added later doesn't silently reintroduce the gap.
  • Reference the official docs. GitHub's cooldown configuration option documents both default-days and per-package overrides.

Key Takeaways

  • .github/dependabot.yml had zero cooldown settings, meaning both the npm and github-actions update entries could propose brand-new, unvetted package versions instantly.
  • The fix adds cooldown: default-days: 7 to every package-ecosystem block, not just one, closing the gap across all ecosystems tracked by Dependabot.
  • A missing cooldown is a supply-chain risk multiplier: it turns your own update automation into the delivery mechanism for a compromised or unstable dependency release.
  • Cooldown settings should be treated as a required field in any Dependabot config review, not an optional hardening step.
  • Automated config linting (e.g., Semgrep's dependabot-missing-cooldown rule) can catch this class of misconfiguration before it ships.

How Orbis AppSec Detected This

  • Source: The public package registry feed (npm registry, GitHub Marketplace/Actions releases) that Dependabot polls for new dependency versions.
  • Sink: Dependabot's automatic pull-request creation for each package-ecosystem entry in .github/dependabot.yml, with no delay gate before proposing the newest available version.
  • Missing control: No cooldown block (default-days) on the npm or github-actions entries under updates, so no minimum age was enforced before a new version could be proposed.
  • CWE: CWE-1357 — Reliance on Insufficiently Trustworthy Component.
  • Fix: Added a cooldown: default-days: 7 block to every package-ecosystem entry in .github/dependabot.yml, requiring new package versions to be publicly available for at least seven days before Dependabot proposes them.

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

Dependency automation is only as safe as its configuration. A dependabot.yml without a cooldown block trusts every new package release the instant it appears on the registry — including the ones that turn out to be malicious, broken, or both. Adding cooldown: default-days: 7 to each package-ecosystem entry is a small YAML change with an outsized security benefit: it gives the ecosystem time to catch bad releases before your CI, and potentially your production environment, ever sees them. Treat cooldown configuration as a mandatory part of your Dependabot setup, not an optional extra.

References

  • CWE-1357: Reliance on Insufficiently Trustworthy Component — https://cwe.mitre.org/data/definitions/1357.html
  • OWASP Software Supply Chain Security Cheat Sheet — https://cheatsheetseries.owasp.org/cheatsheets/Software_Supply_Chain_Security.html
  • GitHub Docs: Configuration options for the dependabot.yml file (cooldown) — https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file#cooldown
  • Semgrep rule reference — https://semgrep.dev/r?q=dependabot-missing-cooldown
  • harden: sanitize child_process call in npm-commands.js...

Frequently Asked Questions

What is a Dependabot missing cooldown vulnerability?

It's a misconfiguration where `.github/dependabot.yml` has no `cooldown` setting, so Dependabot can immediately propose updates to package versions the instant they're published, without any grace period to catch malicious or broken releases.

How do you prevent this in Dependabot configs?

Add a `cooldown` block with `default-days: 7` (or more) to every `package-ecosystem` entry under `updates` in `.github/dependabot.yml`, per GitHub's official cooldown configuration option.

What CWE applies to missing update cooldowns?

CWE-1357 (Reliance on Insufficiently Trustworthy Component) best describes the risk of trusting freshly published dependency versions without a vetting delay.

Is pinning dependency versions enough to prevent this?

No. Version pinning stops automatic drift but doesn't help when Dependabot itself proposes an update to a brand-new, unvetted version — a cooldown period is still needed to let the community and tooling flag bad releases first.

Can static analysis detect a missing Dependabot cooldown?

Yes. Semgrep and similar YAML-aware scanners can check `.github/dependabot.yml` for the presence of a `cooldown` block on each `package-ecosystem` entry and flag configs that omit it.

View the Security Fix

Check out the pull request that fixed this vulnerability

View PR #4211

Related Articles

high

How Sensitive Data Exposure happens in Zotero plugins and how to fix it

A high-severity data exposure vulnerability in `Zotero.ts` automatically transmitted complete document metadata—including private notes, attachment paths, and tags—to external LLM services without user consent. The fix replaces broad `item.toJSON()` serialization with explicit field selection, sending only essential bibliographic data.

high

How missing dependency update cooldowns happen in GitHub Dependabot configurations and how to fix it

A semgrep scan flagged `.github/dependabot.yml` for lacking a cooldown period, meaning Dependabot would immediately propose updates to brand-new package versions across npm, Bundler, and Docker ecosystems. The fix adds a `cooldown: default-days: 7` block to every `package-ecosystem` entry, forcing a one-week waiting period before newly published releases are considered — reducing exposure to malicious or unstable package drops.

high

How dependabot-missing-cooldown happens in GitHub Actions/Node.js and how to fix it

The repository's `.github/dependabot.yml` had no cooldown period configured, meaning Dependabot could immediately propose updates to newly published package versions with zero time for the community to flag malware or instability. The fix adds a `cooldown` block with `default-days: 7` to both the `npm` and `github-actions` ecosystems, forcing a 7-day waiting period before new releases are surfaced as update PRs.

high

How Path Traversal Happens in TensorFlow's Data Service and How to Fix It

TensorFlow's data service dispatcher validated dataset IDs against forward-slash traversal attacks but overlooked backslash characters on non-Windows platforms, allowing attackers to escape the root directory. A targeted fix adds explicit backslash validation across all platforms, closing a high-severity path traversal vulnerability in the snapshot management system.

critical

How Unbounded WebSocket Message Handling Causes Resource Exhaustion in Node.js and How to Fix It

The WebSocketCrossServerAdapter class in a popular Node.js WebSocket library lacked any rate limiting on inbound messages, allowing attackers to flood Redis nodes and WebSocket servers with high-volume traffic. The fix introduces a configurable `rateLimit` option that caps messages per connection per second, preventing resource exhaustion while preserving legitimate functionality.

critical

How Remote Code Execution Happens in Handlebars Template Compilation and How to Fix It

CVE-2026-33937 is a critical remote code execution vulnerability in Handlebars.js that allows attackers to execute arbitrary code by passing maliciously crafted Abstract Syntax Tree (AST) objects to the compile() function. The vulnerability was patched in version 4.7.9, and we've upgraded to protect against this threat vector.