Back to Blog
high SEVERITY8 min read

How Missing Dependabot Cooldown Periods Happen in GitHub Actions and How to Fix Them

A missing `cooldown` block in the `.github/dependabot.yml` configuration for the `octicons_react` package left the project vulnerable to supply chain attacks by automatically proposing updates from newly published — and potentially malicious — packages. Adding a `cooldown: default-days: 7` block ensures Dependabot waits one week before surfacing new package versions, giving the security community time to identify and flag malicious releases. This small configuration change meaningfully reduces t

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

Answer Summary

The vulnerability is a missing Dependabot cooldown period (CWE-1357: Reliance on Insufficiently Trustworthy Component) in the `.github/dependabot.yml` file of a Node.js library. Without a cooldown, Dependabot immediately proposes updates from newly published packages, which may be malicious or unstable. The fix adds a `cooldown: default-days: 7` block to each `package-ecosystem` entry, instructing Dependabot to wait 7 days before surfacing new versions — giving the security community time to detect and report malicious releases.

Vulnerability at a Glance

cweCWE-1357 (Reliance on Insufficiently Trustworthy Component)
fixAdded `cooldown: default-days: 7` to the Dependabot configuration to enforce a 7-day waiting period before proposing updates
riskAutomatic adoption of malicious or unstable newly published packages
languageYAML / Node.js
root causeNo `cooldown` block defined in `.github/dependabot.yml` under the `npm` package-ecosystem entry
vulnerabilityMissing Dependabot Cooldown Period

How Missing Dependabot Cooldown Periods Happen in GitHub Actions and How to Fix Them


The Incident: A Two-Line Gap in dependabot.yml

In the octicons_react library — part of GitHub's own Primer design system — a static analysis scan flagged a high-severity finding in .github/dependabot.yml at line 8. The issue wasn't a buffer overflow or an injection flaw. It was the absence of two lines of configuration that left the project's automated dependency update pipeline without a critical safety gate: a cooldown period.

Without a cooldown block, Dependabot would immediately open pull requests proposing updates the moment a new package version was published to the npm registry — no waiting, no community review window, no time for security researchers to flag a malicious release. For a library like octicons_react that is consumed by thousands of downstream projects, this represents a meaningful supply chain risk.


The Vulnerability Explained

What Is a Dependabot Cooldown, and Why Does Its Absence Matter?

Dependabot automates dependency updates by monitoring package registries and opening pull requests when new versions are available. This is enormously useful — but it creates a subtle risk: newly published packages are the most dangerous window for supply chain attacks.

Attackers who compromise a maintainer's npm account, publish a typosquatted package, or inject malicious code into a legitimate release rely on the short window between publication and detection. During this window:

  • Security researchers haven't yet audited the new version
  • The npm security team hasn't had time to respond to reports
  • Automated scanners (like Dependabot's own vulnerability database) haven't updated their advisories

Without a cooldown, Dependabot can surface a malicious package version within minutes of it being published — and an automated merge policy or an inattentive reviewer could land that malicious code in production.

The Vulnerable Configuration

Here is the relevant section of .github/dependabot.yml before the fix:

updates:
  - package-ecosystem: "npm"
    directory: "/docs"
    schedule:
      interval: "daily"
    allow:
      - dependency-name: "@primer/gatsby-theme-doctocat"
    labels:

Notice what's missing: there is no cooldown block between the schedule entry and the allow block. This means that when the daily schedule fires, Dependabot will immediately propose any newly published version of @primer/gatsby-theme-doctocat — even if it was published hours ago.

A Concrete Attack Scenario

Consider this realistic attack chain targeting this exact configuration:

  1. An attacker compromises the npm credentials of a maintainer of @primer/gatsby-theme-doctocat.
  2. At 11:58 PM, the attacker publishes a malicious patch version (e.g., 5.0.1) that exfiltrates environment variables during the build process.
  3. At midnight, Dependabot's daily schedule fires for the /docs directory.
  4. By 12:05 AM, Dependabot has opened a PR titled "Bump @primer/gatsby-theme-doctocat from 5.0.0 to 5.0.1."
  5. An automated merge bot (or a tired developer) approves the PR.
  6. The malicious package runs during the next CI build, exfiltrating NPM_TOKEN, GITHUB_TOKEN, or other secrets from the build environment.
  7. The npm security team flags the malicious version at 9:00 AM — too late.

A 7-day cooldown would have blocked step 4 entirely, giving the security community 168 hours to detect and report the compromise before it could reach any consumer.

Connection to the sharp / libvips CVEs

This configuration issue is directly connected to the reported CVEs in lib/octicons_react/yarn.lock — specifically CVE-2026-33327, CVE-2026-33328, CVE-2026-35590, and CVE-2026-35591 in sharp's inherited libvips dependency. The absence of a cooldown means that even well-intentioned dependency updates could land vulnerable transitive dependencies in the project before the security community has had time to assess them. A cooldown period is a first-line defense against exactly this class of inherited vulnerability.


The Fix

What Changed

The fix adds exactly two lines to .github/dependabot.yml:

    cooldown:
      default-days: 7

Here is the complete before/after diff:

Before:

updates:
  - package-ecosystem: "npm"
    directory: "/docs"
    schedule:
      interval: "daily"
    allow:
      - dependency-name: "@primer/gatsby-theme-doctocat"

After:

updates:
  - package-ecosystem: "npm"
    directory: "/docs"
    schedule:
      interval: "daily"
    cooldown:
      default-days: 7
    allow:
      - dependency-name: "@primer/gatsby-theme-doctocat"

Why This Specific Change Solves the Problem

The cooldown block instructs Dependabot to only propose updates for package versions that were published at least 7 days ago. This single configuration change:

  1. Creates a community review window: 7 days is enough time for npm's security team, automated malware scanners, and the open-source community to identify and report a malicious release.
  2. Filters out unstable releases: New package versions often introduce regressions that are caught and patched within days. A cooldown naturally filters out these short-lived unstable versions.
  3. Reduces alert fatigue: Projects that publish frequently (e.g., multiple patch versions per week) won't flood maintainers with Dependabot PRs for each micro-release.
  4. Does not disable automation: The fix preserves the full benefit of Dependabot's automated updates — it simply adds a trust delay rather than disabling updates entirely.

The default-days: 7 value is GitHub's own recommended baseline. For higher-risk environments or packages with a history of supply chain incidents, this value can be increased to 14 or 30 days.


Prevention & Best Practices

Always Define a Cooldown in Every package-ecosystem Entry

A dependabot.yml file can contain multiple package-ecosystem entries (e.g., npm, pip, bundler, docker). The cooldown must be defined per entry — a single global cooldown does not exist in the current Dependabot configuration schema. Audit every entry in your configuration file:

updates:
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: "weekly"
    cooldown:
      default-days: 7          # ✅ Required for each entry

  - package-ecosystem: "pip"
    directory: "/"
    schedule:
      interval: "weekly"
    cooldown:
      default-days: 7          # ✅ Also required here

Use Per-Dependency Cooldown Overrides for Critical Packages

For packages that are particularly sensitive (e.g., authentication libraries, cryptographic packages, build tooling), consider extending the cooldown beyond the default:

    cooldown:
      default-days: 7
      semver-patch-days: 3     # Shorter wait for patch versions
      semver-minor-days: 7     # Standard wait for minor versions
      semver-major-days: 14    # Longer wait for major versions

Enforce Code Review on All Dependabot PRs

A cooldown period is not a substitute for human review. Configure branch protection rules to require at least one reviewer approval before merging any Dependabot PR:

# .github/CODEOWNERS
/package.json @security-team
/yarn.lock @security-team

Combine with Dependency Review Action

Use GitHub's dependency-review-action in your CI pipeline to block PRs that introduce known-vulnerable packages:

# .github/workflows/dependency-review.yml
- name: Dependency Review
  uses: actions/dependency-review-action@v4
  with:
    fail-on-severity: high

Detect This Pattern with Semgrep

The Semgrep rule that caught this issue can be run locally or in CI:

semgrep --config "p/supply-chain" .github/dependabot.yml

The specific rule ID is:
package_managers.dependabot.dependabot-missing-cooldown.dependabot-missing-cooldown

Relevant Standards

  • CWE-1357: Reliance on Insufficiently Trustworthy Component
  • OWASP A06:2021: Vulnerable and Outdated Components
  • SLSA Supply Chain Levels: A cooldown period supports SLSA L2+ requirements for verified build dependencies

Key Takeaways

  • The absence of two lines in .github/dependabot.yml left octicons_react exposed to supply chain attacks via immediately-proposed updates from newly published npm packages — no code change was required to introduce the risk.
  • A 7-day cooldown directly mitigates the malicious-package publication attack vector by ensuring no version younger than one week is ever automatically proposed, giving the security community time to respond.
  • The cooldown block must be added to every package-ecosystem entry individually — there is no global default in Dependabot's configuration schema, so a single missing entry is enough to leave a gap.
  • The sharp/libvips CVEs (CVE-2026-33327, CVE-2026-33328, CVE-2026-35590, CVE-2026-35591) in yarn.lock illustrate exactly why this matters: transitive vulnerabilities can arrive via automated dependency updates, and a cooldown is the first gate that slows their propagation.
  • Static analysis tools like Semgrep can detect this class of misconfiguration automatically — making it feasible to enforce cooldown policies across an entire organization's repositories at scale.

How Orbis AppSec Detected This

  • Source: The .github/dependabot.yml configuration file at line 8, which defines the npm package-ecosystem update policy for the /docs directory.
  • Sink: Dependabot's automated PR creation pipeline — specifically, the absence of a cooldown block means newly published npm packages flow directly into proposed dependency updates without any time-based trust gate.
  • Missing control: No cooldown: default-days: N block was present under the npm package-ecosystem entry, meaning Dependabot applied zero waiting period before proposing updates from freshly published package versions.
  • CWE: CWE-1357 — Reliance on Insufficiently Trustworthy Component
  • Fix: Added cooldown: default-days: 7 between the schedule and allow blocks in .github/dependabot.yml to enforce a 7-day waiting period before any new npm package version is proposed as an update.

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

The missing cooldown block in octicons_react's .github/dependabot.yml is a textbook example of how security risk can live entirely in configuration files — no application code, no user input, no cryptographic flaw. Two lines of YAML were the difference between a dependency pipeline that blindly trusts the npm registry at the moment of publication and one that waits for the security community to do its job.

For developers maintaining Node.js libraries — especially those with downstream consumers — Dependabot cooldown periods are a non-negotiable part of a responsible supply chain posture. The fix is trivial; the protection it provides is substantial. Audit your own .github/dependabot.yml files today and add cooldown: default-days: 7 to every package-ecosystem entry you find.


References

Frequently Asked Questions

What is a missing Dependabot cooldown vulnerability?

It occurs when a Dependabot configuration lacks a `cooldown` block, causing it to immediately propose updates from newly published packages that may be malicious, typosquatted, or unstable before the security community has had time to review them.

How do you prevent missing cooldown vulnerabilities in GitHub Actions?

Add a `cooldown` block with `default-days: 7` (or higher) to every `package-ecosystem` entry in your `.github/dependabot.yml` file so Dependabot waits before proposing updates from brand-new package versions.

What CWE is missing Dependabot cooldown?

CWE-1357 — Reliance on Insufficiently Trustworthy Component — because the configuration trusts newly published packages without any verification delay.

Is pinning dependency versions enough to prevent supply chain attacks?

Pinning helps but is not sufficient on its own. Pinned versions can still be updated by automated tools like Dependabot; a cooldown period adds an important time-based trust gate before those updates are proposed.

Can static analysis detect missing Dependabot cooldown configurations?

Yes. Semgrep rule `package_managers.dependabot.dependabot-missing-cooldown.dependabot-missing-cooldown` detects this pattern by checking for the absence of a `cooldown` block in Dependabot YAML configurations.

View the Security Fix

Check out the pull request that fixed this vulnerability

View PR #1264

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.