Back to Blog
high SEVERITY6 min read

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

Dependabot configurations without cooldown periods can automatically propose updates from newly published packages within hours—potentially including malicious or unstable versions. This vulnerability in `.github/dependabot.yml` was fixed by adding a `cooldown` block with `default-days: 7` to delay updates and allow time for community vetting.

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

Answer Summary

A Dependabot missing cooldown vulnerability in GitHub Actions configuration allows malicious or unstable npm packages to be automatically proposed for immediate integration into a Go service. The fix adds a 7-day cooldown period (`cooldown: default-days: 7`) to each package ecosystem, following CWE-1104 (Unmaintained Third-Party Component). This delay gives the security community time to identify compromised packages before they're integrated into production.

Vulnerability at a Glance

cweCWE-1104 (Unmaintained Third-Party Component), CWE-494 (Download of Code Without Integrity Check)
fixAdd `cooldown: default-days: 7` to each package ecosystem
riskAutomatic acceptance of malicious or unstable packages within hours of publication
languageYAML (GitHub Actions Configuration)
root causeNo cooldown period specified, enabling immediate package proposals
vulnerabilityDependabot Missing Cooldown (Supply Chain Attack Vector)

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

Introduction

In a Go service's GitHub Actions workflow, we discovered a HIGH severity configuration flaw in .github/dependabot.yml at line 3. The Dependabot configuration was missing a critical security control: a cooldown period before proposing package updates. This meant that whenever npm packages were published—including potentially malicious ones—Dependabot would propose integration into production code within hours, without any delay for security researchers or the community to identify compromised versions.

The vulnerability wasn't in the application code itself, but in the automation that manages dependencies. For a Go service handling HTTP requests, compromised dependencies can become remotely exploitable entry points into production infrastructure.

The Vulnerability Explained

What's Happening in the Code

The original .github/dependabot.yml configuration looked like this:

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

This configuration is dangerously permissive. It tells Dependabot: "Every single day, check npm for new versions and propose updates to the latest published packages." But here's the critical gap—there's no cooldown period specified.

The Attack Scenario

Imagine this timeline:

  1. 9:00 AM: A malicious actor publishes innocent-utility@2.5.1 to npm with hidden code that exfiltrates environment variables
  2. 9:05 AM: The package passes initial npm automated checks (no immediate flags)
  3. 3:00 PM: Your Dependabot daily job runs and discovers the new version
  4. 3:15 PM: Dependabot creates an automatic pull request updating to the compromised version
  5. 4:00 PM: A developer, trusting the automated update, merges the PR
  6. 4:30 PM: Your Go service deploys with the backdoored dependency
  7. 5:00 PM: Security researchers discover the malicious package and notify npm
  8. 6:00 PM: Too late—your production infrastructure has already been compromised

Why This Matters for This Application

This Go service handles HTTP requests. Compromised dependencies in HTTP handlers are remotely exploitable—an attacker doesn't need direct access to your repository. They can trigger the backdoored code through ordinary API calls. The missing cooldown transforms dependency management from a security control into a potential attack vector.

The Fix

What Specific Changes Were Made

The fix adds a cooldown block to the package ecosystem configuration:

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

This two-line addition has significant security implications.

How This Solves the Problem

By adding cooldown: default-days: 7:

  • Dependabot will not propose any package updates for 7 days after they're published
  • This gives the npm security community and the broader developer ecosystem a 7-day window to identify and report malicious packages
  • Most supply chain attacks are discovered and reported within 3-5 days
  • Your service gets updates only after they've survived community scrutiny

The Security Improvement

Let's revisit that attack timeline with the fix in place:

  1. 9:00 AM (Day 1): Malicious actor publishes compromised package
  2. 3:00 PM (Day 1): Dependabot sees it but does not propose an update (cooldown active)
  3. 2:00 PM (Day 3): Security researchers discover the backdoor; npm removes the package and issues a security advisory
  4. Day 8: The cooldown expires, but the malicious version no longer exists on npm
  5. Day 8: Dependabot proposes the next safe version instead

The 7-day cooldown creates a natural security barrier between publication and integration.

Prevention & Best Practices

For GitHub Actions & Dependabot

  1. Always configure cooldown periods in .github/dependabot.yml
    - Minimum recommendation: 7 days
    - For high-risk services: 14 days
    - For critical infrastructure: 21 days

  2. Use cooldown alongside other controls:
    ```yaml
    updates:

    • package-ecosystem: "npm"
      directory: "/"
      schedule:
      interval: "daily"
      cooldown:
      default-days: 7
      # Additional controls:
      allow:
      • dependency-type: "direct"
        reviewers:
      • "security-team"
        ```
  3. Require manual review for all dependency updates, especially in production branches

  4. Monitor security advisories during the cooldown period—don't merge PRs for packages flagged by GitHub's security database

For Supply Chain Security Generally

  • Use Software Composition Analysis (SCA) tools to scan dependencies against known vulnerability databases
  • Implement dependency signing and verification where available
  • Maintain an approved dependencies list that requires explicit approval before use
  • Consider vendoring critical dependencies for mission-critical services
  • Use lock files (package-lock.json, go.sum) with hash verification

Detection Tools

  • Semgrep: Automatically detects missing cooldown blocks (as used here)
  • GitHub Advanced Security: Flags dependency risks through Dependabot alerts
  • npm audit: Built-in npm tool to identify known vulnerabilities
  • Renovate: Alternative to Dependabot with similar capabilities

Security Standards

  • CWE-1104: Unmaintained Third-Party Component
  • CWE-494: Download of Code Without Integrity Check
  • OWASP A06:2021: Vulnerable and Outdated Components
  • NIST SP 800-161: Cybersecurity Supply Chain Risk Management

Key Takeaways

  • Dependabot without cooldown is a supply chain liability, not a security feature—it becomes an automated pathway for malicious code
  • The 7-day cooldown is not arbitrary: it aligns with real-world security research timelines where compromises are typically discovered and disclosed
  • This isn't just npm: Apply the same principle to all package ecosystems (Python, Go, Ruby, etc.) in your dependabot.yml
  • Cooldown is a multiplier for other defenses: It works best combined with security monitoring, required reviews, and vulnerability scanning
  • Production services deserve longer cooldowns: HTTP handlers and any public-facing code should have at least 14-day cooldowns

How Orbis AppSec Detected This

Source: GitHub Actions workflow definition in .github/dependabot.yml at the updates configuration level—the initial point where Dependabot behavior is declared.

Sink: Missing cooldown block for the npm package ecosystem, creating an unbounded window for automatic update proposals.

Missing Control: No delay mechanism between package publication and update proposal; no cooling-off period for community vetting.

CWE: CWE-1104 (Unmaintained Third-Party Component) and CWE-494 (Download of Code Without Integrity Check)

Fix: Added cooldown: default-days: 7 to the npm package ecosystem entry, establishing a 7-day delay before Dependabot proposes updates to newly published 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

Supply chain attacks are among the most dangerous threats to modern applications. A single compromised dependency can transform your entire service into an attack vector. The Dependabot missing cooldown vulnerability represents a configuration oversight with real teeth—automatic tooling that meant to help security becomes a liability without proper safeguards.

This fix demonstrates that security isn't always about complex code changes. Sometimes the most critical security improvements come from configuration. By adding a simple cooldown block, this Go service gains a 7-day buffer against the entire category of supply chain attacks targeting dependency automation.

Audit your .github/dependabot.yml today. If it lacks a cooldown period, you're one malicious npm package away from a production compromise.


References

Frequently Asked Questions

What is a Dependabot missing cooldown vulnerability?

It's a supply chain security gap where Dependabot automatically proposes updates to newly published packages without delay, potentially including malicious versions before they're detected by the community.

How do you prevent missing cooldown vulnerabilities in GitHub Actions?

Explicitly configure a `cooldown` block in `.github/dependabot.yml` with `default-days: 7` (or higher) for each `package-ecosystem` entry under `updates`.

What CWE is Dependabot missing cooldown?

CWE-1104 (Unmaintained Third-Party Component) and CWE-494 (Download of Code Without Integrity Check) — both relate to accepting third-party code without sufficient vetting delays.

Is updating daily enough without a cooldown?

No. Daily updates without cooldown means a malicious package published today could be proposed for merge within 24 hours, before security researchers detect the compromise.

Can static analysis detect missing cooldown configurations?

Yes. Semgrep and other YAML linters can identify missing `cooldown` blocks in `.github/dependabot.yml` files by pattern matching against the expected schema.

View the Security Fix

Check out the pull request that fixed this vulnerability

View PR #9659

Related Articles

critical

How a vulnerable websocket-driver dependency happens in Node.js lockfiles and how to fix it

A Trivy scan flagged `websocket-driver@0.7.4` in this repository's `bun.lock` as affected by CVE-2026-54466, a critical issue in a WebSocket protocol handler that parses untrusted HTTP upgrade requests and frame data. The fix upgrades the package to `0.7.5` and adds an explicit `websocket-driver` entry to the lockfile's override block so every transitive consumer — webpack-dev-server, sockjs, faye-websocket — resolves to the patched build instead of the pinned vulnerable one.

high

How Dependabot Missing Cooldown Periods Enable Supply Chain Attacks and How to Fix It

A critical security vulnerability in `.github/dependabot.yml` was exposing a Node.js library to supply chain attacks by automatically updating to newly published packages without a safety delay. By adding a 7-day cooldown period to each package ecosystem configuration, the project now protects against malicious or unstable package versions that could affect downstream consumers.

high

How Exponential-Time Complexity Causes Denial of Service in brace-expansion and How to Fix It

A critical vulnerability in brace-expansion versions 1.1.13 and earlier allowed attackers to cause denial of service through crafted brace pattern inputs. The fix upgrades to patched versions 1.1.16, 2.1.2, and 5.0.7, eliminating the exponential-time complexity that made exploitation possible.

high

How unrestricted file upload via extension-only validation happens in Deno/JavaScript and how to fix it

The review image upload handler in this Deno-based app trusted the client-supplied filename extension to decide whether a file was a "safe" image, without ever inspecting the actual file bytes. The fix adds magic-byte signature verification for PNG, JPEG, GIF, and WEBP formats before the file is written to disk, closing the door on disguised executables and malicious payloads.

high

How Missing Dependabot Cooldown Periods Enable Supply Chain Attacks in CI/CD Pipelines and How to Fix Them

We fixed a high-severity supply chain security gap in `.github/dependabot.yml` where missing cooldown periods allowed immediate adoption of newly published packages. The fix adds `cooldown: default-days: 7` to all package ecosystems, creating a critical security buffer against typosquatting and malicious dependency attacks.

high

How dependabot-missing-cooldown happens in GitHub Actions configuration and how to fix it

A high-severity vulnerability in `.github/dependabot.yml` left this repository vulnerable to supply chain attacks through immediate adoption of newly published packages. The fix adds a mandatory 7-day cooldown period to all three package ecosystems, preventing automatic updates to potentially malicious or unstable dependencies before they can be vetted by the community.