Back to Blog
high SEVERITY7 min read

How Dependabot Missing Cooldown Happens in Node.js and How to Fix It

A missing `cooldown` block in the Dependabot configuration for a Node.js project left it exposed to potentially malicious or unstable newly published packages. By adding a `cooldown: default-days: 7` setting, the project now waits seven days before proposing updates, giving the security community time to identify and flag compromised packages before they reach your codebase.

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

Answer Summary

This vulnerability is a Dependabot missing cooldown configuration issue (CWE-1357: Reliance on Insufficiently Trustworthy Component) in a Node.js project's `.github/dependabot.yml`. Without a cooldown period, Dependabot immediately proposes updates to newly published packages, which may be malicious or unstable. The fix adds a `cooldown` block with `default-days: 7` to each `package-ecosystem` entry, introducing a 7-day waiting period before any newly published package version is proposed as an update.

Vulnerability at a Glance

cweCWE-1357: Reliance on Insufficiently Trustworthy Component
fixAdded `cooldown: default-days: 7` to the npm `package-ecosystem` entry in `.github/dependabot.yml`
riskAutomatic dependency updates may pull in malicious or compromised packages within hours of publication
languageYAML / Node.js ecosystem
root cause`.github/dependabot.yml` lacked a `cooldown` block, causing immediate update proposals for any newly published package version
vulnerabilityDependabot Missing Cooldown (Supply Chain Risk)

How Dependabot Missing Cooldown Happens in Node.js and How to Fix It

In a Node.js documentation site repository, a high-severity supply chain risk was found hiding in plain sight — not in application code, but in a two-line Dependabot configuration file. The .github/dependabot.yml file was missing a cooldown block, meaning Dependabot would immediately propose updates to any newly published npm package version, including potentially malicious ones.

This kind of misconfiguration is easy to overlook because it doesn't look like a bug. The config file is syntactically valid, Dependabot runs correctly, and PRs are opened on schedule. But the absence of a single configuration block quietly removes a critical safety buffer between your project and the broader npm supply chain.


The Vulnerability Explained

What the Vulnerable Configuration Looked Like

Here's the .github/dependabot.yml as it existed before the fix:

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

This configuration tells Dependabot to check for npm updates monthly. That sounds reasonable — but there's a subtle and dangerous gap. The schedule.interval controls when Dependabot looks for updates. It does not control how recently a package version was published before Dependabot proposes it.

If an attacker publishes a malicious version of a popular package on, say, the 28th of the month, and Dependabot runs its monthly check on the 29th, that malicious version would be proposed as an update within 24 hours of publication — long before the security community has had a chance to analyze it, flag it, or issue an advisory.

The Specific Risk: Newly Published Packages

The npm ecosystem has experienced a significant number of supply chain attacks in recent years. The attack pattern is consistent:

  1. An attacker compromises a maintainer's account, or publishes a typosquat package
  2. A malicious version is published to the npm registry
  3. Automated dependency update tools (like Dependabot) immediately propose the new version
  4. A developer merges the PR without deep scrutiny, assuming automated tools are safe
  5. The malicious package executes in CI, in build tooling, or in production

The docs-site/package-lock.json file — explicitly called out in this vulnerability report — reflects the npm dependency tree for the documentation site. Documentation sites often have broad dependency trees with many transitive dependencies, each of which represents a potential attack surface.

Why This Matters for This Specific Project

This is a Node.js library repository. Vulnerabilities in the build and documentation toolchain don't just affect the maintainers — they affect every downstream consumer who clones, forks, or mirrors the repository. A compromised build tool could, for example, inject malicious code into published package artifacts, affecting every project that installs this library.


The Fix

The fix is minimal but meaningful. Here's the exact diff applied to .github/dependabot.yml:

Before:

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

After:

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

What the cooldown Block Does

The cooldown block, introduced in GitHub's Dependabot configuration schema, instructs Dependabot to only propose updates for package versions that have been publicly available for at least default-days days. With default-days: 7, a package version published today will not appear in a Dependabot PR until it has been available on the registry for a full week.

This 7-day window is significant because:

  • Security researchers monitor the npm registry continuously and typically flag malicious packages within hours to days
  • CVE databases and GitHub Advisory Database are usually updated within days of a confirmed compromise
  • Community scrutiny — download spikes, unusual changelogs, and new maintainer accounts — becomes visible within the first week
  • Automated malware scanning services integrated with the npm registry have time to process and flag suspicious packages

The Two-Line Change That Matters

    cooldown:
      default-days: 7

These two lines, added at the correct indentation level under the npm package-ecosystem entry, are all it takes. The change is scoped entirely to .github/dependabot.yml and has no effect on application behavior, test results, or the published package itself.


Prevention & Best Practices

1. Always Include cooldown in Dependabot Configurations

Every package-ecosystem entry in your dependabot.yml should include a cooldown block. If you manage multiple ecosystems (e.g., npm, docker, github-actions), each needs its own cooldown:

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

  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "weekly"
    cooldown:
      default-days: 7

2. Consider Higher Cooldown Values for Production Dependencies

For packages that ship directly to end users, consider default-days: 14 or even default-days: 30. The GitHub Dependabot documentation also supports per-dependency overrides if you need finer control.

3. Enable Dependabot Security Alerts Separately

The cooldown block applies to version updates, not security updates. If a known vulnerability is patched in a new version, Dependabot security alerts can still propose that update promptly. This is the correct behavior — you want fast patches for known CVEs, but a delay for routine version bumps.

4. Use Semgrep to Enforce This in CI

The Semgrep rule package_managers.dependabot.dependabot-missing-cooldown.dependabot-missing-cooldown can be added to your CI pipeline to catch this misconfiguration before it reaches your main branch:

semgrep --config "p/default" .github/dependabot.yml

5. Combine with allow and ignore Lists

Reduce your attack surface further by explicitly allowing only the package types you need:

    allow:
      - dependency-type: "direct"

This prevents Dependabot from automatically proposing transitive dependency updates, which are harder to review and represent a larger attack surface.

Relevant Standards

  • CWE-1357: Reliance on Insufficiently Trustworthy Component
  • OWASP A06:2021: Vulnerable and Outdated Components
  • SLSA (Supply Chain Levels for Software Artifacts): Recommends provenance verification and controlled update processes

Key Takeaways

  • The schedule.interval in Dependabot does not protect you from newly published malicious packages — it only controls when checks run, not how old a version must be before it's proposed.
  • docs-site/package-lock.json represents a real attack surface: documentation site dependencies can include build tools that, if compromised, could affect published package artifacts.
  • Two lines of YAML (cooldown: default-days: 7) provide a week-long safety buffer against the most common supply chain attack pattern: publish-and-wait-for-automerge.
  • Monthly update schedules create a false sense of security: a malicious package published the day before a monthly run is just as dangerous as one proposed in real time, without a cooldown.
  • Static analysis tools like Semgrep can catch this class of misconfiguration automatically, making it feasible to enforce cooldown policies across all repositories in an organization.

How Orbis AppSec Detected This

  • Source: The .github/dependabot.yml file at line 3, where the npm package-ecosystem entry begins — this is where Dependabot's update behavior is configured, and where the missing cooldown block creates the exposure.
  • Sink: The absence of a cooldown block means any newly published npm package version flows directly into Dependabot's proposed update queue with no delay, making docs-site/package-lock.json a potential landing zone for malicious packages.
  • Missing control: No cooldown block under the npm package-ecosystem entry; Dependabot had no instruction to wait before proposing updates to recently published versions.
  • CWE: CWE-1357 — Reliance on Insufficiently Trustworthy Component
  • Fix: Added cooldown: default-days: 7 under the npm package-ecosystem entry in .github/dependabot.yml, introducing a mandatory 7-day waiting period before any newly published 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

Supply chain attacks targeting the npm ecosystem are not theoretical — they are an active and growing threat. The missing cooldown block in this project's .github/dependabot.yml was a small configuration gap with potentially large consequences: any malicious package published to npm could have been proposed as an automated update within hours, before the security community had time to respond.

The fix — two lines of YAML — introduces a 7-day safety buffer that aligns with real-world security response timelines. It costs nothing in terms of security patch velocity (Dependabot security alerts remain unaffected) and gains a meaningful reduction in supply chain risk.

If you maintain Node.js projects with Dependabot enabled, audit your dependabot.yml files today. Look for any package-ecosystem entry that lacks a cooldown block, and add one. It's one of the highest-value, lowest-effort security improvements you can make to your CI/CD pipeline.


References

Frequently Asked Questions

What is a Dependabot missing cooldown vulnerability?

It's a configuration gap where Dependabot proposes dependency updates immediately after a new package version is published, giving no time for the security community to detect malicious or compromised packages before they enter your codebase.

How do you prevent supply chain attacks via Dependabot in Node.js?

Add a `cooldown` block with `default-days: 7` (or more) to each `package-ecosystem` entry in `.github/dependabot.yml`, so updates are only proposed after the new version has been publicly available long enough for security researchers to vet it.

What CWE is Dependabot missing cooldown?

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

Is a monthly update schedule enough to prevent supply chain attacks?

No. A monthly schedule controls *when* Dependabot checks for updates, but not *how old* a package version must be before it's proposed. A malicious package published the day before the monthly run would still be included without a cooldown period.

Can static analysis detect missing Dependabot cooldown?

Yes. Semgrep rule `package_managers.dependabot.dependabot-missing-cooldown.dependabot-missing-cooldown` specifically matches `dependabot.yml` files that lack a `cooldown` block, making this detectable in CI pipelines.

View the Security Fix

Check out the pull request that fixed this vulnerability

View PR #353

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.