Back to Blog
high SEVERITY5 min read

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.

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

Answer Summary

Missing Dependabot cooldown (CWE-1188) in GitHub Actions Dependabot configuration allows immediate adoption of newly published packages, which may be malicious or unstable. The fix involves adding a `cooldown` block with `default-days: 7` to each `package-ecosystem` entry in `.github/dependabot.yml`, ensuring a 7-day waiting period before proposing updates to newly released package versions.

Vulnerability at a Glance

cweCWE-1188 (Insecure Default Initialization of Resource)
fixAdded `cooldown: default-days: 7` to the package-ecosystem entry
riskSupply chain attacks via malicious newly-published packages
languageYAML (GitHub Actions Configuration)
root causeDependabot configuration lacked cooldown block, allowing immediate adoption of new package versions
vulnerabilityMissing Dependabot Cooldown Period

Introduction

In this repository's .github/dependabot.yml configuration, we discovered a high-severity security misconfiguration at line 4. The Dependabot setup for the npm package ecosystem was missing a critical cooldown block, which meant that any newly published package version—whether legitimate, compromised, or outright malicious—could be immediately proposed as an update.

This matters because supply chain attacks have become one of the most prevalent attack vectors in modern software development. When a bad actor publishes a malicious package version (through typosquatting, account compromise, or dependency confusion), the first 24-72 hours are critical. Without a cooldown period, your automated dependency updates could pull in compromised code before the security community even discovers the threat.

The Vulnerability Explained

The vulnerable configuration looked like this:

updates:
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: "weekly"
    labels:
      - "dependencies"
      - "automated"
    commit-message:
      prefix: "chore"
    ignore:
      - dependency-name: "*"
        update-types: ["version-update:semver-major"]

Notice what's missing? There's no cooldown block anywhere in this configuration. This means Dependabot would immediately propose updates to any newly published package version the moment it becomes available on npm.

How Could This Be Exploited?

Consider this attack scenario specific to this configuration:

  1. An attacker compromises the npm credentials of a maintainer for one of the project's dependencies
  2. They publish a malicious patch version (e.g., lodash goes from 4.17.21 to 4.17.22 with embedded malware)
  3. Within minutes, Dependabot detects the new version and opens a pull request
  4. A developer, trusting the automated process and seeing it's "just a patch update," merges it
  5. The malicious code now runs in CI/CD pipelines, potentially exfiltrating secrets or compromising the build

The ignore block in this configuration only filters out major version updates—patch and minor versions would still be proposed immediately. Since the configuration also auto-labels PRs as "dependencies" and "automated," there's a risk that these updates receive less scrutiny than they should.

Real-World Impact

For this web application (as noted in the threat model context), a compromised dependency could:
- Inject malicious JavaScript that executes in users' browsers (XSS via supply chain)
- Exfiltrate environment variables and secrets during CI/CD runs
- Modify build outputs to include backdoors
- Steal user credentials or session tokens

The Fix

The fix adds a cooldown block to the npm package-ecosystem entry at line 18-19:

Before:

    commit-message:
      prefix: "chore"
    ignore:
      - dependency-name: "*"

After:

    commit-message:
      prefix: "chore"
    cooldown:
      default-days: 7
    ignore:
      - dependency-name: "*"

How This Solves the Problem

The cooldown configuration with default-days: 7 instructs Dependabot to wait 7 days after a new package version is published before proposing an update. This delay provides several critical protections:

  1. Community Detection Window: Most malicious packages are discovered and reported within 24-72 hours. A 7-day delay gives the security community time to identify and flag compromised versions.

  2. Registry Removal Buffer: npm and other registries typically remove malicious packages quickly once reported. By waiting 7 days, you're unlikely to ever see a PR for a package that's been yanked.

  3. Stability Verification: Beyond security, new releases sometimes have critical bugs. A cooldown period lets early adopters discover stability issues before your project is affected.

  4. Reduced Attack Surface: Attackers often rely on the speed of automated systems. A cooldown fundamentally breaks the "publish and immediately compromise" attack pattern.

Prevention & Best Practices

Always Configure Cooldown Periods

For every package-ecosystem entry in your dependabot.yml, add:

cooldown:
  default-days: 7

For high-security environments, consider longer periods (14-30 days) for non-critical dependencies.

Additional Dependabot Hardening

  1. Use allow lists instead of ignore lists when possible to explicitly control which dependencies can be updated

  2. Require manual approval for dependency updates in CI/CD pipelines

  3. Enable Dependabot security alerts separately from version updates—security patches may warrant faster adoption

  4. Review the diff of every dependency update, not just the PR description

Detection Tools

  • Semgrep: Use the package_managers.dependabot.dependabot-missing-cooldown rule to detect this misconfiguration
  • GitHub's own security features: Enable repository security settings
  • Lockfile auditing: Tools like npm audit and yarn audit can catch known vulnerabilities

Security Standards

This vulnerability relates to:
- CWE-1188: Insecure Default Initialization of Resource
- OWASP Supply Chain Security: Protecting against compromised dependencies
- SLSA Framework: Supply chain Levels for Software Artifacts

Key Takeaways

  • Never rely on Dependabot's default behavior for production repositories—always explicitly configure cooldown periods
  • The 7-day cooldown in .github/dependabot.yml provides a critical buffer against supply chain attacks targeting the npm ecosystem
  • Patch and minor version updates are not inherently safe—this configuration previously allowed immediate adoption of any non-major update
  • Automated dependency updates require automated protections—the convenience of Dependabot must be balanced with security controls
  • Supply chain attacks exploit trust and speed—the cooldown configuration breaks both attack vectors by introducing delay and encouraging review

How Orbis AppSec Detected This

  • Source: The .github/dependabot.yml configuration file at line 4, specifically the package-ecosystem: "npm" entry
  • Sink: Dependabot's automatic PR creation for newly published package versions
  • Missing control: No cooldown block to delay adoption of newly published packages
  • CWE: CWE-1188 (Insecure Default Initialization of Resource)
  • Fix: Added cooldown: default-days: 7 to the npm package-ecosystem configuration, ensuring a 7-day waiting period before proposing updates

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

This seemingly small configuration change—adding just two lines to a YAML file—provides significant protection against one of the most dangerous attack vectors in modern software development. Supply chain attacks have compromised major organizations and infected thousands of downstream projects. By implementing a 7-day cooldown period, this repository now has a critical buffer that allows the security community to identify and report malicious packages before they can be adopted.

Remember: automation is powerful, but it must be configured defensively. Every Dependabot configuration should include cooldown periods, and every dependency update should be reviewed with appropriate scrutiny. The convenience of automated updates should never come at the cost of security.

References

Frequently Asked Questions

What is a missing Dependabot cooldown vulnerability?

It's a configuration flaw where Dependabot proposes updates to newly published package versions immediately, without waiting to verify they're safe and stable.

How do you prevent missing Dependabot cooldown in GitHub Actions?

Add a `cooldown` block with `default-days: 7` (or more) to each `package-ecosystem` entry in your `.github/dependabot.yml` file.

What CWE is missing Dependabot cooldown?

CWE-1188 (Insecure Default Initialization of Resource), as the default Dependabot behavior doesn't include protective delays.

Is relying on Dependabot's default settings enough to prevent supply chain attacks?

No, Dependabot's defaults don't include cooldown periods. You must explicitly configure cooldown delays to protect against malicious newly-published packages.

Can static analysis detect missing Dependabot cooldown?

Yes, tools like Semgrep can scan `.github/dependabot.yml` files for missing cooldown configurations using dedicated rules.

View the Security Fix

Check out the pull request that fixed this vulnerability

View PR #816

Related Articles

high

How NO_PROXY bypass via crafted URL happens in Node.js axios and how to fix it

A high-severity vulnerability (CVE-2026-42043) in axios versions prior to 1.15.1 allowed attackers to bypass NO_PROXY environment variable restrictions using specially crafted URLs. This meant HTTP requests intended to stay internal could be routed through an attacker-controlled proxy, potentially exposing sensitive data. The fix upgrades axios to version 1.15.1, which correctly validates URLs against NO_PROXY rules.

critical

How JSON request validation bypass happens in Node.js API handlers and how to fix it

A critical validation bypass in the `/api/agents/jobs` endpoint allowed attackers to send malformed JSON with arbitrary properties that could trigger prototype pollution or unexpected behavior. The fix added comprehensive validation checks including array detection and property existence verification to prevent malicious payloads from reaching downstream processing logic.

critical

How Server-Side Request Forgery happens in Node.js httpProxy.js and how to fix it

A critical Server-Side Request Forgery (SSRF) vulnerability was discovered in `hubcmdui/routes/httpProxy.js` where the `/proxy/test` endpoint passed a user-controlled `testUrl` parameter directly to `axios.get()` without any validation. An attacker could exploit this to probe internal infrastructure — including AWS metadata endpoints, Redis instances, and private network ranges. The fix introduces a strict URL validation function that blocks private IP ranges, loopback addresses, and non-HTTP(S)

critical

How Remote Configuration Injection happens in JavaScript fetch() and how to fix it

A critical vulnerability in `js/config.js` allowed attackers to inject malicious configuration data through DNS spoofing or man-in-the-middle attacks. The application fetched remote JSON configuration from GitHub without validating the response structure, enabling arbitrary code execution through crafted payloads. A single validation check now ensures only properly-formed configuration objects are accepted.

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 command injection happens in Ruby backticks and how to fix it

A Jekyll plugin used unsafe Ruby backticks to execute a `git log` command with an unescaped file path, creating a command injection vulnerability. By switching to `Open3.capture2()` with argument array syntax, the fix prevents shell interpretation and eliminates the attack surface entirely.