---
id: CVE-2026-27199
aliases:
  - GHSA-29vq-49wr-vm6x
  - PYSEC-2026-2320
title: ' Werkzeug safe_join() allows Windows special device names'
summary: ' Werkzeug safe_join() allows Windows special device names'
severity: medium
vendor: werkzeug
product: werkzeug
ecosystem: pip
affected:
  - werkzeug < 3.1.6
patched:
  - werkzeug 3.1.6
published: '2026-02-19'
updated: '2026-09-10'
sourceUpdated: '2026-09-10T03:50:33.709103081Z'
source: OSV
sourceUrl: 'https://osv.dev/vulnerability/GHSA-29vq-49wr-vm6x'
references:
  - url: >-
      https://github.com/pallets/werkzeug/security/advisories/GHSA-29vq-49wr-vm6x
  - url: 'https://nvd.nist.gov/vuln/detail/CVE-2026-27199'
  - url: >-
      https://github.com/pallets/werkzeug/commit/f407712fdc60a09c2b3f4fe7db557703e5d9338d
  - url: 'https://github.com/pallets/werkzeug'
  - url: 'https://github.com/pallets/werkzeug/releases/tag/3.1.6'
tags:
  - osv
  - pip
  - exploit-available
epss: 0.00543
epssPercentile: 0.43219
exploits:
  github: 1
  githubRepos:
    - 'https://github.com/alimezar/CVE-2026-27199-werkzeug-safe-join-bypass-PoC'
  checkedAt: '2026-09-26T09:05:41.088Z'
exploitAvailable: true
ingestedAt: '2026-07-13T18:57:51.251Z'
---

## Overview

Werkzeug's `safe_join` function allows Windows device names as filenames if when preceded by other path segments.

This was previously reported as https://github.com/pallets/werkzeug/security/advisories/GHSA-hgf8-39gv-g3f2, but the added filtering failed to account for the fact that `safe_join` accepts paths with multiple segments, such as `example/NUL`.

`send_from_directory` uses `safe_join` to safely serve files at user-specified paths under a directory. If the application is running on Windows, and the requested path ends with a special device name, the file will be opened successfully, but reading will hang indefinitely.

## Affected packages

- `werkzeug < 3.1.6`

## Remediation

Upgrade to a patched release:

- `werkzeug 3.1.6`
