Back to Blog
high SEVERITY6 min read

How broken access control via supply chain dependency poisoning happens in TYPO3 with Dependabot and how to fix it

A missing cooldown configuration in Dependabot allowed the automatic proposal of newly published (and potentially malicious) package versions, creating a supply chain attack vector that could have facilitated the exploitation of CVE-2026-47343 — a broken access control vulnerability in TYPO3's File Abstraction Layer. The fix adds a 7-day cooldown period to all package ecosystem entries in `.github/dependabot.yml`, ensuring newly published packages are vetted by the community before being propose

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

Answer Summary

This vulnerability (CVE-2026-47343, related to CWE-1357 and CWE-284) involves a missing Dependabot cooldown period in a TYPO3 project's `.github/dependabot.yml` file, which could allow malicious or unstable newly-published packages to be automatically proposed as dependency updates — potentially introducing broken access control flaws like TYPO3-CORE-SA-2026-007. The fix adds `cooldown: default-days: 7` to each `package-ecosystem` entry in the Dependabot configuration, creating a 7-day quarantine window before new package versions are suggested.

Vulnerability at a Glance

cweCWE-1357 (Reliance on Insufficiently Trustworthy Component)
fixAdded `cooldown: default-days: 7` to both `composer` and `github-actions` ecosystem entries
riskAutomatic adoption of malicious or unstable newly-published packages leading to broken access control
languageYAML (Dependabot configuration) / PHP (TYPO3 / Composer)
root causeNo cooldown period configured in `.github/dependabot.yml` for package ecosystem entries
vulnerabilitySupply chain dependency poisoning via missing Dependabot cooldown

How Broken Access Control via Supply Chain Dependency Poisoning Happens in TYPO3 with Dependabot and How to Fix It

Introduction

In a TYPO3 project tracked via composer.lock, we discovered a high-severity supply chain vulnerability rooted not in the PHP application code itself, but in the project's .github/dependabot.yml configuration file at line 6. The Dependabot configuration for both the composer and github-actions package ecosystems lacked a cooldown block, meaning newly published package versions — including potentially malicious ones — could be immediately proposed as dependency updates.

This configuration gap is directly relevant to CVE-2026-47343 (TYPO3-CORE-SA-2026-007: Broken Access Control in File Abstraction Layer). Without a cooldown period, a compromised or typo-squatted package version could be proposed and merged before the security community has time to flag it, potentially introducing broken access control vulnerabilities into the File Abstraction Layer or any other TYPO3 component managed through Composer.

The vulnerable configuration looked like this:

updates:
  - package-ecosystem: "composer"
    directory: "/"
    schedule:
      interval: "weekly"

No cooldown block. No quarantine window. Any package published seconds ago could be proposed immediately.

The Vulnerability Explained

What's Actually Happening

GitHub's Dependabot automatically monitors your project's dependencies and opens pull requests when new versions are available. By default, it proposes updates as soon as they're published to the package registry. This creates a dangerous window:

  1. An attacker publishes a malicious version of a package (or a typo-squatted variant)
  2. Dependabot immediately creates a PR proposing the update
  3. If the PR is merged quickly (especially with auto-merge enabled), malicious code enters production

In the context of this TYPO3 project, the composer ecosystem manages PHP dependencies including TYPO3 core packages. The composer.lock file pins exact versions, but Dependabot's job is to update those pins. Without a cooldown, it does so indiscriminately.

The Attack Scenario

Consider this specific attack path against the vulnerable configuration:

  1. An attacker identifies that this project depends on a TYPO3 extension or a transitive dependency
  2. The attacker compromises the package maintainer's account (or publishes a typo-squatted package)
  3. A new version is published containing code that weakens the File Abstraction Layer's access controls
  4. Within minutes, Dependabot opens a PR: "Bump typo3/cms-core from 12.4.x to 12.4.y"
  5. The PR passes CI (the malicious code is subtle — perhaps it modifies file permission checks)
  6. A maintainer merges the PR, introducing CVE-2026-47343-class broken access control

The 7-day cooldown acts as a quarantine: if a malicious package is published, the security community typically identifies and reports it within days. By waiting 7 days, you let the ecosystem's immune system work before exposing your project.

Why This Configuration Matters

The .github/dependabot.yml file isn't just a convenience tool — it's part of your security boundary. It controls what code enters your project through automated means. A misconfigured Dependabot is essentially an automated attack surface that an adversary can trigger by publishing packages.

The Fix

The fix adds a cooldown block with default-days: 7 to both package ecosystem entries in .github/dependabot.yml:

Before:

version: 2
updates:
  - package-ecosystem: "composer"
    directory: "/"
    schedule:
      interval: "weekly"

  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "weekly"
      day: "monday"
    labels:
      - "dependencies"
      - "github-actions"

After:

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

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

Why Both Ecosystems Need the Fix

  • composer ecosystem (line 6): This manages PHP/TYPO3 dependencies via composer.lock. A poisoned Composer package could directly introduce broken access control in the File Abstraction Layer.
  • github-actions ecosystem (line 14): Compromised GitHub Actions can exfiltrate secrets, modify code during CI, or inject malicious artifacts. A cooldown here prevents adoption of newly-published action versions that may contain supply chain attacks.

How the Fix Works

The cooldown.default-days: 7 setting tells Dependabot: "Do not propose updates to any package version that was published less than 7 days ago." This creates a temporal buffer that:

  1. Allows security researchers to analyze new releases
  2. Gives package registries time to detect and remove malicious versions
  3. Lets community reports surface on GitHub Issues, Twitter, or security advisories
  4. Prevents zero-day supply chain attacks from being auto-proposed

Prevention & Best Practices

1. Always Configure Cooldown Periods

Every package-ecosystem entry in your Dependabot configuration should include:

cooldown:
  default-days: 7

For high-security environments, consider default-days: 14 or higher.

2. Avoid Auto-Merge on Dependency Updates

Even with cooldown periods, never auto-merge Dependabot PRs without human review. Use branch protection rules requiring approval.

3. Use Dependency Review Actions

Add actions/dependency-review-action to your CI pipeline to block PRs that introduce known vulnerabilities:

- uses: actions/dependency-review-action@v3
  with:
    fail-on-severity: high

4. Monitor composer.lock Changes

Any change to composer.lock should trigger enhanced review. Consider requiring CODEOWNERS approval for lock file modifications.

5. Pin GitHub Actions by SHA

Instead of version tags (which can be moved), pin actions by commit SHA:

- uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6

6. Scan with Semgrep

Use the Semgrep rule package_managers.dependabot.dependabot-missing-cooldown.dependabot-missing-cooldown in your CI pipeline to catch this misconfiguration automatically.

Key Takeaways

  • A missing cooldown block in .github/dependabot.yml is not just a best-practice gap — it's an exploitable supply chain attack vector, especially for projects managing security-critical dependencies like TYPO3 core packages.
  • The composer ecosystem entry at line 6 was the primary risk, as it controls PHP dependency updates that directly affect the TYPO3 File Abstraction Layer where CVE-2026-47343 manifests.
  • 7 days is the minimum recommended cooldown — it aligns with the typical window in which the security community identifies and reports malicious package publications.
  • Both composer and github-actions ecosystems needed the fix because supply chain attacks can enter through either dependency management path.
  • Static analysis tools like Semgrep can detect configuration-level security gaps that traditional code scanners miss, making them essential for comprehensive security coverage.

How Orbis AppSec Detected This

  • Source: Newly published package versions on Packagist (Composer) and GitHub Marketplace (Actions) — untrusted external input entering the dependency graph
  • Sink: The updates entries in .github/dependabot.yml:6 and .github/dependabot.yml:14 that trigger automatic pull request creation without temporal validation
  • Missing control: No cooldown block to enforce a quarantine period before proposing newly-published package versions
  • CWE: CWE-1357 (Reliance on Insufficiently Trustworthy Component)
  • Fix: Added cooldown: default-days: 7 to both the composer and github-actions package ecosystem entries, establishing a 7-day quarantine window

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 isn't just about scanning your code for vulnerabilities — it's about controlling how new code enters your project. A two-line YAML addition (cooldown: default-days: 7) creates a critical temporal defense layer that prevents the automatic adoption of malicious or unstable packages. In the context of CVE-2026-47343 and TYPO3's File Abstraction Layer, this cooldown could be the difference between catching a compromised dependency before it's proposed and discovering broken access control in production. Review your Dependabot configurations today — the fix takes seconds, but the protection is substantial.

References

Frequently Asked Questions

What is a Dependabot cooldown period?

A cooldown period is a configurable delay (in days) that tells Dependabot to wait before proposing updates to newly published package versions, giving the community time to identify malicious or unstable releases.

How do you prevent supply chain attacks via Dependabot in TYPO3/Composer projects?

Add a `cooldown` block with `default-days: 7` (or more) to each `package-ecosystem` entry in your `.github/dependabot.yml`, and review all dependency updates before merging.

What CWE is supply chain dependency poisoning?

CWE-1357 (Reliance on Insufficiently Trustworthy Component) covers scenarios where software depends on components that haven't been sufficiently vetted for security.

Is pinning dependency versions enough to prevent supply chain attacks?

No — version pinning helps but doesn't protect against scenarios where Dependabot automatically proposes updates to newly published (potentially malicious) versions. A cooldown period adds an essential time-based defense layer.

Can static analysis detect missing Dependabot cooldown configurations?

Yes — tools like Semgrep can detect this pattern using rules like `package_managers.dependabot.dependabot-missing-cooldown.dependabot-missing-cooldown` which flag Dependabot configurations lacking cooldown blocks.

View the Security Fix

Check out the pull request that fixed this vulnerability

View PR #2062

Related Articles

medium

How GitHub Actions Mutable Action Tags Enable Supply-Chain Attacks and How to Fix Them

A GitHub Actions workflow was using `actions/checkout@v1`, a mutable tag reference that could be silently repointed by the action owner to inject malicious code. This supply-chain vulnerability was fixed by pinning the action to a specific commit SHA (`11bd71901bbe5b1630ceea73d27597364c9af683`), ensuring the workflow always executes verified, immutable code.

high

How package_managers.pnpm.pnpm-missing-minimum-release-age.pnpm-minimum-release-age happens in pnpm and how to fix it

A pnpm workspace configuration in `site-astro/pnpm-workspace.yaml` was missing critical supply chain security settings including `minimumReleaseAge`, `trustPolicy`, and `blockExoticSubdeps`. Without these protections, the project could install freshly published malicious packages within minutes of their release. The fix adds a 7-day quarantine period, downgrade protection, and exotic subdependency blocking.

high

How Path Traversal and Security Policy Bypass Happens in Node.js Dependencies and How to Fix It

A high-severity vulnerability in the fast-uri package (CVE-2026-6321) allowed attackers to bypass security policies through improper Unicode hostname canonicalization and path traversal. This issue affected the @apralabs/apra-fleet project through its dependency tree, and was resolved by upgrading fast-uri from version 3.1.0 to 4.1.2 using npm overrides.

high

How Arbitrary HTTP Header Injection via Prototype Pollution happens in JavaScript and how to fix it

A high-severity vulnerability (CVE-2026-42035) in axios version 1.13.5 allowed attackers to inject arbitrary HTTP headers through prototype pollution. The fix upgrades axios to version 1.18.0 in the frontend's dependency tree, which includes proper prototype chain validation when constructing HTTP request headers. This prevents attackers from manipulating outgoing requests to perform SSRF, session hijacking, or cache poisoning attacks.

high

How Shell Injection in GitHub Actions happens in YAML workflows and how to fix it

A high-severity shell injection vulnerability was discovered in `.forgejo/workflows/docker.yml` where `${{github.ref}}` and `${{github.ref_name}}` were directly interpolated into a bash `run:` step. An attacker could craft malicious git reference names to inject arbitrary commands into the CI runner, potentially stealing secrets and source code. The fix moves these values into intermediate environment variables, preventing command injection.

high

How XML Node Injection happens in JavaScript XML parsing and how to fix it

CVE-2026-41672 is a high-severity XML node injection vulnerability in the `@xmldom/xmldom` package, caused by insufficient validation during comment serialization that allows attackers to inject arbitrary XML nodes into a document. The fix upgrades `@xmldom/xmldom` from version 0.8.12 to 0.8.13 (and 0.9.x to 0.9.10), closing the injection path by tightening how untrusted comment content is handled before it reaches the serializer.