---
id: CVE-2026-61835
aliases:
  - GHSA-j5h6-vqc3-phqh
title: 'Directus: SSRF Protection Bypass via 0.0.0.0 in File Import'
summary: 'Directus: SSRF Protection Bypass via 0.0.0.0 in File Import'
severity: high
cvss: 7.7
cwe:
  - CWE-918
vendor: directus
product: directus
ecosystem: npm
affected:
  - directus < 12.0.0
patched:
  - directus 12.0.0
published: '2026-07-20'
updated: '2026-07-20'
source: GHSA
sourceUrl: 'https://github.com/advisories/GHSA-j5h6-vqc3-phqh'
references:
  - url: >-
      https://github.com/directus/directus/security/advisories/GHSA-j5h6-vqc3-phqh
  - url: 'https://nvd.nist.gov/vuln/detail/CVE-2026-61835'
  - url: 'https://github.com/directus/directus/pull/27606'
  - url: >-
      https://github.com/directus/directus/commit/f75b25fa44b05c6022b20f231c20bc6e50f021d7
  - url: 'https://github.com/directus/directus/releases/tag/v12.0.0'
  - url: 'https://github.com/advisories/GHSA-j5h6-vqc3-phqh'
tags:
  - ghsa
  - npm
epss: 0.00407
epssPercentile: 0.34785
ingestedAt: '2026-07-20T22:43:35.459Z'
---

## Overview

### Summary

The SSRF protection on Directus's file-import-from-URL feature can be bypassed using the address `0.0.0.0`. While `127.0.0.1` and other internal addresses are denied, `0.0.0.0` is not added to the blocklist. On Linux and macOS, connecting to `0.0.0.0` reaches localhost, so an authenticated user with file-upload rights can make the server fetch internal services and retrieve the response as a downloadable file (full-read SSRF).

### Affected Versions

- **Affected:** Directus `<= 12.0.0` (confirmed on `directus/directus:latest`, v11.17.3, with default configuration)
- **Patched:** Directus `>= 12.0.0`

### Details

Directus uses a deny-list config, `IMPORT_IP_DENY_LIST`, whose default value is `['0.0.0.0', '169.254.169.254']`.

The issue is in how `api/src/request/is-denied-ip.ts` processes this list. When it encounters the entry `0.0.0.0`, it treats it as a special keyword meaning "block all local network interfaces," but it never blocks the literal address `0.0.0.0` itself. The handler sets the network-interface flag and skips to the next entry without adding `0.0.0.0` to the blocklist.

What actually gets blocked is the loopback subnet `127.0.0.0/8` (from the `lo` interface) plus whatever addresses are assigned to the machine's network interfaces. The address `0.0.0.0` is not inside `127.0.0.0/8`; it belongs to the separate `0.0.0.0/8` range. So a request to `http://0.0.0.0:8055/` passes the blocklist check as "allowed."

At the OS level, however, connecting to `0.0.0.0` reaches localhost, functionally equivalent to `127.0.0.1`. The same gap applies to the IPv6 unspecified address `::`. As a result, the SSRF protection is bypassed.

### Impact

An authenticated user with create permission on `directus_files` (file-upload rights) can make the server issue requests to its own localhost via the `/files/import` endpoint. The response body is stored as a downloadable file, making this a full-read SSRF. On bare-metal or single-host deployments, this can reach databases, caches, and internal APIs bound to localhost. This bypass defeats the protections tracked as CVE-2026-35409 and CVE-2024-46990.

## Affected packages

- `directus < 12.0.0`

## Remediation

Upgrade to a patched release:

- `directus 12.0.0`
