Back to Blog
high SEVERITY6 min read

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.

O
By Orbis AppSec
•Technically reviewed by Anupam Mediratta•Published September 7, 2026•Reviewed September 7, 2026

Answer Summary

This is a supply-chain configuration weakness (CWE-1357, Reliance on Insufficiently Trustworthy Component) in a GitHub Dependabot YAML file that lacked a `cooldown` setting, causing Dependabot to immediately suggest updates to freshly published package versions. The fix adds `cooldown: default-days: 7` to each `package-ecosystem` block in `.github/dependabot.yml`, delaying automated update proposals by seven days so newly released — and potentially compromised — versions can be vetted by the community first.

Vulnerability at a Glance

cweCWE-1357 (Reliance on Insufficiently Trustworthy Component)
fixAdded `cooldown: default-days: 7` to every `package-ecosystem` entry (bundler, docker, and the third ecosystem) so updates wait 7 days before being proposed
riskAutomated adoption of newly-published, potentially malicious or unstable dependency versions
languageYAML / GitHub Dependabot configuration
root cause`package-ecosystem` entries in `.github/dependabot.yml` had no `cooldown` block, so updates were proposed the instant a new version was published
vulnerabilityMissing Dependabot Cooldown Period (Supply Chain Risk)

Introduction

This fix landed in .github/dependabot.yml:10, flagged by semgrep's package_managers.dependabot.dependabot-missing-cooldown.dependabot-missing-cooldown rule as a HIGH severity finding. The configuration was functionally correct — it scheduled weekly dependency checks for three package ecosystems — but it was missing a cooldown block on every package-ecosystem entry. That single omission meant Dependabot would open pull requests for a new dependency version the moment it was published on npm, RubyGems, or Docker Hub, with zero delay for the community to notice something was wrong.

If you maintain CI/CD pipelines or dependency automation for any repository, this is worth understanding: cooldown periods aren't a nice-to-have, they're a direct mitigation against a well-documented class of supply-chain attacks where malicious code is slipped into a package and yanked within hours — but not before automated tooling has already merged it.

The Vulnerability Explained

Here's what .github/dependabot.yml looked like before the fix, condensed to show the pattern repeated across all three ecosystems:

updates:
  - package-ecosystem: "npm"        # (or equivalent — first entry)
    directory: "/"
    schedule:
      interval: "weekly"

  # Maintain dependencies for Bundler
  - package-ecosystem: "bundler"
    directory: "/"
    schedule:
      interval: "weekly"

  # Maintain dependencies for Docker
  - package-ecosystem: "docker"
    directory: "/"
    schedule:
      interval: "weekly"

Each updates entry tells Dependabot how often to scan for new versions (interval: "weekly"), but says nothing about when a newly published version becomes eligible to be proposed. Without a cooldown block, GitHub's default behavior is to treat a package as fair game the instant it appears in the registry — no matter how many hours or minutes old it is.

That's a problem because npm, RubyGems, and Docker Hub all have well-known histories of compromised maintainer accounts publishing malicious versions of legitimate packages (typosquatting, credential-stealing postinstall scripts, cryptominers baked into base images, etc.). These packages are typically caught and pulled within hours to a few days — but a Dependabot run that fires the same day the malicious version is published can open a PR for it before anyone has flagged it. If auto-merge is enabled anywhere downstream, or a reviewer approves the PR without double-checking the changelog, that malicious version ships straight into the codebase.

Example attack scenario: An attacker compromises a maintainer's npm token and publishes some-dependency@2.4.1 with an obfuscated post-install script that exfiltrates environment variables. Because this repo's dependabot.yml had no cooldown, the weekly scan picks up 2.4.1 immediately and opens a PR titled "Bump some-dependency from 2.4.0 to 2.4.1." A reviewer skimming the diff sees a routine patch bump and merges it. Twelve hours later the package is pulled from npm for being malicious — but by then it's already in the dependency tree.

The Fix

The fix, taken directly from the diff, adds a cooldown block with default-days: 7 to every package-ecosystem entry in .github/dependabot.yml:

     directory: "/"
     schedule:
       interval: "weekly"
+    cooldown:
+      default-days: 7

   # Maintain dependencies for Bundler
   - package-ecosystem: "bundler"
     directory: "/"
     schedule:
       interval: "weekly"
+    cooldown:
+      default-days: 7

   # Maintain dependencies for Docker
   - package-ecosystem: "docker"
     directory: "/"
     schedule:
       interval: "weekly"
+    cooldown:
+      default-days: 7

With this change, Dependabot now waits seven days after a version is published before it becomes eligible to be proposed as an update — for the npm/first ecosystem, Bundler, and Docker entries alike. Concretely, if some-dependency@2.4.1 is published today, Dependabot won't open a PR for it until the same version has been live for a full week. That window gives the ecosystem time to detect and yank malicious releases (as happened in the scenario above) before this repository's automation ever touches it.

Each of the three ecosystems needed the same fix independently, because cooldown is configured per package-ecosystem block in Dependabot's schema — there's no global setting that applies to all entries at once. Skipping any one block would leave that ecosystem exposed even after the other two were patched.

Key Takeaways

  • .github/dependabot.yml:10 had three package-ecosystem entries (npm/first entry, Bundler, Docker) that all lacked a cooldown block, meaning every one of them was exposed to zero-delay malicious package adoption.
  • The fix is a pure configuration change — cooldown: default-days: 7 — with no application code touched, but it materially reduces the window in which a freshly compromised package version can be auto-proposed for merge.
  • Cooldowns must be added per-ecosystem; there's no single global switch, so each package-ecosystem block needs its own cooldown entry.
  • This finding was caught by semgrep's dedicated Dependabot rule set, showing that infrastructure-as-code and CI/CD configs deserve the same static analysis scrutiny as application source.

How Orbis AppSec Detected This

  • Source: New package versions published to npm/RubyGems/Docker Hub registries, ingested by Dependabot's weekly scan
  • Sink: Automatic pull request creation for dependency updates, configured in .github/dependabot.yml:10
  • Missing control: No cooldown.default-days value on any package-ecosystem entry, so no vetting delay existed before a new version could be proposed
  • CWE: CWE-1357 (Reliance on Insufficiently Trustworthy Component)
  • Fix: Added cooldown: default-days: 7 to each of the three package-ecosystem blocks in .github/dependabot.yml

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 setting in dependabot.yml is easy to overlook because it doesn't break anything — the automation still runs, PRs still get opened, tests still pass. But that's exactly what makes it dangerous: it silently removes a built-in safety margin against supply-chain attacks. By adding cooldown: default-days: 7 to each of the three package-ecosystem entries in this repository's Dependabot config, the fix ensures that newly published versions get a week to prove themselves safe before they're proposed for merge. It's a small YAML change with an outsized impact on the trustworthiness of automated dependency updates — treat your CI/CD and dependency-management configs with the same scrutiny you'd give application code.

Prevention and further reading

Frequently Asked Questions

What CWE applies to missing cooldown periods in dependency automation?

CWE-1357 (Reliance on Insufficiently Trustworthy Component) is the closest fit, since the configuration trusts freshly-published package versions without any vetting window.

View the Security Fix

Check out the pull request that fixed this vulnerability

View PR #67

Related Articles

critical

Lampa Desktop Auto-Update Heuristic Bypass: Execution of Unverified

Lampa Desktop's auto-update mechanism downloaded JavaScript and CSS from `raw.githubusercontent.com` using only heuristic validation—file size thresholds and string pattern matching—that attackers could trivially satisfy. The fix introduces cryptographic integrity verification by cross-referencing Git blob hashes from the GitHub Contents API, ensuring downloaded code matches the repository's authoritative state before execution.

high

adm-zip 0.6.0 Preserves SUID Bits From ZIPs: CVE-2026-102282

The `adm-zip` dependency resolved to 0.6.0 in this project's dependency tree, a version affected by CVE-2026-102282: during extraction it applies the Unix permission bits stored in each ZIP entry's external file attributes verbatim, including the setuid (`04000`), setgid (`02000`), and sticky bits. An attacker who controls an archive passed to `extractAllTo()` or `extractEntryTo()` can therefore have the extractor create a setuid binary owned by whatever user the extraction process runs as. The

high

requestInput() Type Confusion: NaN and Object Bypass in JavaScript

The `requestInput()` utility function lacked validation on its `type` parameter and failed to handle `NaN` results from float conversions, creating a type confusion weakness. An attacker could supply malformed inputs that propagate unhandled `NaN` values or unexpected object types through the type system. The fix adds explicit guards against `NaN` type parameters and rejects non-primitive type values.

critical

No Rate Limit on /api/uploads/presign Enables DoS

The `/api/uploads/presign` endpoint accepted unlimited concurrent requests to generate storage presigned URLs, giving an attacker a free lever to exhaust storage-provider quotas and server resources. The fix adds an `express-rate-limit` middleware capping each client to 30 requests per minute on that route.

high

CVE-2026-54673: builder-util-runtime Leaks Auth Headers on Redirect

electron-updater and electron-builder rely on builder-util-runtime to fetch update manifests and artifacts over HTTP. A flaw in that shared HTTP executor allowed credential headers attached to the original update-feed request to be re-sent after a redirect, exposing them to any host the redirect pointed to. The project fixes this by upgrading builder-util-runtime to 9.7.0 and collapsing a duplicate, older copy of the package that electron-updater had pinned on its own.

high

image-size 1.2.1 DoS: Zero-Valued Dimensions in Image Buffer Parser

A high-severity denial-of-service vulnerability in image-size 1.2.1 allows attackers to crash Node.js services using malicious image buffers with zero-valued dimensions. The fix removes the vulnerable `queue` dependency and tightens dimension validation in version 2.0.3.