Back to Blog
high SEVERITY7 min read

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.

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

Answer Summary

CVE-2026-48779 is a supply chain security vulnerability in Dependabot configuration files where missing cooldown periods enable automatic updates to freshly published, potentially malicious packages. The vulnerability exists in `.github/dependabot.yml` when `package-ecosystem` entries lack a `cooldown` block with `default-days`. The fix, identified by CWE-1104: Use of Unmaintained Third Party Components, adds `cooldown: default-days: 7` to each ecosystem entry, creating a mandatory 7-day waiting period before Dependabot proposes updates to new package versions. This prevents immediate adoption of compromised dependencies in npm and GitHub Actions ecosystems.

Vulnerability at a Glance

cweCWE-1104 (Use of Unmaintained Third Party Components) / CWE-829 (Inclusion of Functionality from Untrusted Control Sphere)
fixAdd `cooldown: default-days: 7` to each `package-ecosystem` entry in `.github/dependabot.yml`
riskAutomatic installation of malicious or backdoored dependencies within hours of publication
languageYAML (Dependabot Configuration)
root causeAbsence of `cooldown` configuration allowing same-day updates to zero-day packages
vulnerabilityMissing Dependabot Cooldown (Supply Chain Security)

Introduction

In a production web service repository, we discovered a high-severity supply chain security gap hiding in plain sight: .github/dependabot.yml at line 3 was configured to automatically propose updates to packages within hours of their publication. The file handles automated dependency management for both npm and GitHub Actions ecosystems, but the absence of a cooldown period created a direct path for attackers to inject malicious code into the build pipeline.

The vulnerable configuration looked like this:

version: 2
updates:
- package-ecosystem: "npm"
  directory: "/"
  schedule:
    interval: daily
  open-pull-requests-limit: 10
- package-ecosystem: "github-actions"
  directory: "/"
  schedule:
    interval: daily
  open-pull-requests-limit: 10

Notice what's missing? There's no cooldown block. This means Dependabot would propose an update to ws version 8.18.0 (the package with CVE-2026-48779's denial of service vulnerability) the same day it was published—before the security community could identify and report the issue.

For developers managing CI/CD pipelines, this pattern is especially dangerous because it automates a critical security decision: when to trust a new dependency version.

The Vulnerability Explained

The Specific Problem

The Semgrep scanner flagged this with rule package_managers.dependabot.dependabot-missing-cooldown.dependabot-missing-cooldown, identifying that both package-ecosystem: "npm" and package-ecosystem: "github-actions" entries lacked cooldown configuration. The scanner matched at line 3, the start of the first ecosystem entry.

The vulnerable pattern:

- package-ecosystem: "npm"    # Line 3 - flagged location
  directory: "/"
  schedule:
    interval: daily
  open-pull-requests-limit: 10
  # NO cooldown block here!

How It Could Be Exploited

Here's a concrete attack scenario targeting this specific configuration:

  1. Attacker publishes malicious package: An attacker typosquats a popular npm package (like ws-patched instead of ws) or compromises a maintainer account to publish a backdoored version of a legitimate package.

  2. Zero-day window: The malicious package is published at 9:00 AM UTC. At this point, no security scanners have flagged it, no CVE exists, and the package appears legitimate with proper semantic versioning.

  3. Dependabot immediate proposal: Because interval: daily runs Dependabot checks every 24 hours, and there's no cooldown to delay new versions, Dependabot detects the "update" during its next run at 2:00 PM UTC—just 5 hours after publication.

  4. Auto-merge danger: If the repository uses automated merge rules for Dependabot PRs (common in devOps environments), or if developers habitually merge green PRs quickly, the malicious dependency enters the build pipeline within hours.

  5. Production compromise: The ws package specifically handles WebSocket connections. A malicious version could exfiltrate data from WebSocket messages, create backdoors in connection handlers, or exploit the memory exhaustion vulnerability in CVE-2026-48779 to crash production services.

Real-World Impact

For this web service, the impact was severe:

  • Immediate exposure window: Any npm or GitHub Actions update could be adopted before community vetting
  • Automated attack surface: The daily interval combined with no cooldown created predictable, automatable exploitation timing
  • Cascading supply chain risk: A compromised GitHub Action in the workflow could exfiltrate repository secrets, modify source code, or inject malware into build artifacts

The package-lock.json file's mention of ws is particularly relevant—this is a WebSocket library with a history of security issues. A malicious ws update proposed by Dependabot could exploit the very memory exhaustion vulnerability (CVE-2026-48779) that legitimate updates might fix, but with attacker-controlled payload delivery.

The Fix

Specific Changes Made

The fix adds cooldown configuration with default-days: 7 to both package-ecosystem entries:

Before (vulnerable):

version: 2
updates:
- package-ecosystem: "npm"
  directory: "/"
  schedule:
    interval: daily
  open-pull-requests-limit: 10
- package-ecosystem: "github-actions"
  directory: "/"
  schedule:
    interval: daily
  open-pull-requests-limit: 10

After (fixed):

version: 2
updates:
- package-ecosystem: "npm"
  directory: "/"
  schedule:
    interval: daily
  open-pull-requests-limit: 10
  cooldown:
    default-days: 7
- package-ecosystem: "github-actions"
  directory: "/"
  schedule:
    interval: daily
  open-pull-requests-limit: 10
  cooldown:
    default-days: 7

How This Solves the Problem

The cooldown: default-days: 7 configuration creates a mandatory 7-day embargo period after any package's initial publication before Dependabot will propose it as an update. This transforms the attack timeline:

Stage Without Cooldown With 7-Day Cooldown
Malicious package published Day 0, 9:00 AM Day 0, 9:00 AM
Dependabot detects update Day 0, 2:00 PM Day 7, 2:00 PM
Security community flags issue Day 1-3 (typical) Already flagged by Day 7
Repository exposure risk HIGH (hours) LOW (vetting window)

The 7-day window aligns with typical security research timelines: npm's security team, GitHub's advisory database, and community scanners usually identify malicious packages within 24-72 hours of publication. By day 7, malicious versions are typically yanked or flagged, and Dependabot will skip proposing them.

Why Both Ecosystems Needed the Fix

Both npm and github-actions ecosystems required identical cooldown configuration because:

  • npm: Direct dependency supply chain for application code—malicious packages execute in production
  • github-actions: Indirect supply chain compromise—malicious actions execute during CI/CD with repository secrets and write permissions

GitHub Actions supply chain attacks have become increasingly common, with attackers publishing actions that appear to provide useful functionality but exfiltrate GITHUB_TOKEN secrets or modify repository contents.

Key Takeaways

  • Always configure cooldown: default-days: 7 in .github/dependabot.yml for every package-ecosystem entry—this is not a default, it must be explicit
  • The interval schedule does not protect against zero-day packages—only cooldown creates the necessary publication-to-proposal delay
  • GitHub Actions ecosystems need the same protection as npm—compromised actions have privileged access to your build environment and secrets
  • 7 days is the security community's minimum vetting window—shorter periods risk including packages before they're flagged; longer periods (14-30 days) add safety for critical systems
  • Dependabot configuration is production security infrastructure—treat .github/dependabot.yml with the same security rigor as application code

How Orbis AppSec Detected This

  • Source: The .github/dependabot.yml configuration file, specifically the package-ecosystem entries at lines 3 and 9
  • Sink: The absence of cooldown configuration allowing immediate proposal of newly published package versions
  • Missing control: No default-days waiting period to validate package stability and legitimacy before automated update proposals
  • CWE: CWE-1104 (Use of Unmaintained Third Party Components) and CWE-829 (Inclusion of Functionality from Untrusted Control Sphere)
  • Fix: Added cooldown: default-days: 7 to both npm and github-actions package ecosystem entries, enforcing a mandatory 7-day embargo on new package versions

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 security requires defense in depth at every automation touchpoint. The missing cooldown configuration in .github/dependabot.yml represented a single point of failure where legitimate automation could become an attack vector. By adding cooldown: default-days: 7 to both npm and GitHub Actions ecosystems, we've inserted a critical security buffer that aligns automated dependency management with community vetting timelines.

For development teams, this fix serves as a reminder: your CI/CD configuration files are as security-critical as your application code. Review your Dependabot configurations today, and ensure every package-ecosystem has an appropriate cooldown period. The 7-day wait could be the difference between blocking a supply chain attack and becoming its next victim.

Prevention and further reading

View the Security Fix

Check out the pull request that fixed this vulnerability

View PR #17378

Related Articles

critical

deleteNestedProperty Prototype Pollution via Dot-Notation Path

The `deleteNestedProperty` function in propertyUtils.ts allowed attackers to manipulate JavaScript object prototypes by passing specially crafted dot-notation paths like `__proto__.polluted`. A fix now blocks dangerous keys before processing, preventing prototype pollution attacks that could affect all objects in the application.

high

How Denial of Service via Infinite Loop Happens in JavaScript Dependencies and How to Fix It

CVE-2026-67213 is a high-severity denial of service vulnerability in nanoid before version 5.1.6 that triggers an infinite loop during random ID generation when processing specially crafted input. We upgraded nanoid across the entire dependency tree to patch this flaw and prevent attackers from freezing application threads. This fix ensures that ID generation remains resilient even when handling adversarial input patterns.

high

How Sensitive Data Exposure happens in Zotero plugins and how to fix it

A high-severity data exposure vulnerability in `Zotero.ts` automatically transmitted complete document metadata—including private notes, attachment paths, and tags—to external LLM services without user consent. The fix replaces broad `item.toJSON()` serialization with explicit field selection, sending only essential bibliographic data.

high

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.

high

How Path Traversal Happens in TensorFlow's Data Service and How to Fix It

TensorFlow's data service dispatcher validated dataset IDs against forward-slash traversal attacks but overlooked backslash characters on non-Windows platforms, allowing attackers to escape the root directory. A targeted fix adds explicit backslash validation across all platforms, closing a high-severity path traversal vulnerability in the snapshot management system.

critical

How Unbounded WebSocket Message Handling Causes Resource Exhaustion in Node.js and How to Fix It

The WebSocketCrossServerAdapter class in a popular Node.js WebSocket library lacked any rate limiting on inbound messages, allowing attackers to flood Redis nodes and WebSocket servers with high-volume traffic. The fix introduces a configurable `rateLimit` option that caps messages per connection per second, preventing resource exhaustion while preserving legitimate functionality.