CVE-2026-27199
Werkzeug safe_join() allows Windows special device names
Werkzeug is a comprehensive WSGI web application library. Versions 3.1.5 and below, the safe_join function allows Windows device names as filenames if preceded by other path segments. This was previously reported as 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. The function 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. This issue has been fixed in version 3.1.6.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- None
- User interaction
- None
What an attacker can affect
- Confidentiality
- None
- Integrity
- None
- Availability
- Low
Exploit likelihood
What each source reports
CVE List Score used
6.3
Werkzeug safe_join() allows Windows special device names
Werkzeug is a comprehensive WSGI web application library. Versions 3.1.5 and below, the safe_join function allows Windows device names as filenames if preceded by other path segments. This was previously reported as 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. The function 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. This issue has been fixed in version 3.1.6.
- Record
CVE-2026-27199- CVSS 4.0
- 6.3 Medium
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N - Weakness
- CWE-67
- Updated
- 2026-11-02
EUVDEUVD-2026-7732
6.3
Werkzeug is a comprehensive WSGI web application library. Versions 3.1.5 and below, the safe_join function allows Windows device names as filenames if preceded by other path segments. This was previously reported as 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. The function 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. This issue has been fixed in version 3.1.6.
- Record
EUVD-2026-7732- CVSS 4.0
- 6.3 Medium
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-29vq-49wr-vm6x
6.3
Werkzeug safe_join() allows Windows special device names
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.
- Record
GHSA-29vq-49wr-vm6x- CVSS 4.0
- 6.3 Medium
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N - Weakness
- CWE-67
- Updated
- 2026-11-02
NVD
6.3
Werkzeug is a comprehensive WSGI web application library. Versions 3.1.5 and below, the safe_join function allows Windows device names as filenames if preceded by other path segments. This was previously reported as 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. The function 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. This issue has been fixed in version 3.1.6.
- Record
CVE-2026-27199- CVSS 4.0
- 6.3 Medium
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X - CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L - Weakness
- CWE-67
- Updated
- 2026-11-02
OSVALPINE-CVE-2026-27199
5.3
Werkzeug is a comprehensive WSGI web application library. Versions 3.1.5 and below, the safe_join function allows Windows device names as filenames if preceded by other path segments. This was previously reported as 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. The function 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. This issue has been fixed in version 3.1.6.
- Record
ALPINE-CVE-2026-27199- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L - Updated
- 2026-11-02
OSVBELL-CVE-2026-27199
5.3
CVE-2026-27199 does not affect BellSoft software
- Record
BELL-CVE-2026-27199- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L - Updated
- 2026-11-02
Show 7 moreShow less
OSV
6.3
Werkzeug safe_join() allows Windows special device names
Werkzeug is a comprehensive WSGI web application library. Versions 3.1.5 and below, the safe_join function allows Windows device names as filenames if preceded by other path segments. This was previously reported as 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. The function 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. This issue has been fixed in version 3.1.6.
- Record
CVE-2026-27199- CVSS 4.0
- 6.3 Medium
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N - Weakness
- CWE-67
- Updated
- 2026-11-02
OSVGHSA-29vq-49wr-vm6x
6.3
Werkzeug safe_join() allows Windows special device names
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.
- Record
GHSA-29vq-49wr-vm6x- CVSS 4.0
- 6.3 Medium
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N - Weakness
- CWE-67
- Updated
- 2026-11-02
OSVPYSEC-2026-2320
5.3
Werkzeug is a comprehensive WSGI web application library. Versions 3.1.5 and below, the safe_join function allows Windows device names as filenames if preceded by other path segments. This was previously reported as 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. The function 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. This issue has been fixed in version 3.1.6.
- Record
PYSEC-2026-2320- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L - Updated
- 2026-11-02
OSVROOT-APP-PYPI-CVE-2026-27199
5.3
CVE-2026-27199 in rootio-werkzeug - Patched by Root
Root has patched CVE-2026-27199 in the rootio-werkzeug package for Root:PyPI. Multiple fixed versions available.
- Record
ROOT-APP-PYPI-CVE-2026-27199- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L - Updated
- 2026-11-02
OSVCLSA-2026-1789452203 No score
TuxCare security update for werkzeug (2 CVEs)
TuxCare rebuilt werkzeug to address 2 CVEs. Fixed in 1.0.1.post6+tuxcare.
- Record
CLSA-2026-1789452203- Updated
- 2026-11-02
OSVCLSA-2026-1789452814 No score
TuxCare security update for werkzeug (3 CVEs)
TuxCare rebuilt werkzeug to address 3 CVEs. Fixed in 2.2.3.post5+tuxcare.
- Record
CLSA-2026-1789452814- Updated
- 2026-11-02
OSVCLSA-2026-1789453348 No score
TuxCare security update for werkzeug (4 CVEs)
TuxCare rebuilt werkzeug to address 4 CVEs. Fixed in 2.3.8.post3+tuxcare.
- Record
CLSA-2026-1789453348- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
werkzeugPyPI |
before 3.1.6 | 3.1.6 |
py3-werkzeugAlpine:v3.24 |
before 3.1.6-r0 | 3.1.6-r0 |
werkzeugTuxCare:PyPI From an advisory covering 2 CVEs |
1.0.1 up to 1.0.1.post6+tuxcare, plus listed versions 1.0.1.post1+tuxcare1.0.1.post2+tuxcare1.0.1.post3+tuxcare1.0.1.post4+tuxcare1.0.1.post5+tuxcare |
1.0.1.post6+tuxcare |
werkzeugTuxCare:PyPI From an advisory covering 3 CVEs |
2.2.3 up to 2.2.3.post5+tuxcare, plus listed versions 2.2.3.post1+tuxcare2.2.3.post3+tuxcare2.2.3.post4+tuxcare |
2.2.3.post5+tuxcare |
werkzeugTuxCare:PyPI From an advisory covering 4 CVEs |
2.3.8 up to 2.3.8.post3+tuxcare, plus listed versions 2.3.8.post1+tuxcare2.3.8.post2+tuxcare |
2.3.8.post3+tuxcare |
werkzeugPyPI |
before 3.1.6, plus listed versions 0.10.100.10.10.10.20.10.3 Show 45 moreShow less0.10.40.110.11.10.11.100.11.110.11.120.11.130.11.140.11.150.11.20.11.30.11.40.11.50.11.60.11.70.11.80.11.90.120.12.10.12.20.130.140.14.10.15.00.15.10.15.20.15.30.15.40.15.50.15.60.16.00.16.10.20.30.3.10.40.4.10.50.5.10.60.6.10.6.20.70.7.10.7.2 |
3.1.6 |
rootio-werkzeugRoot:PyPI |
before 3.1.5+root.io.1 | 3.1.5+root.io.1 |
rootio-WerkzeugRoot:PyPI |
before 3.1.1+root.io.1 | 3.1.1+root.io.13.1.3+root.io.13.1.1+root.io.23.1.3+root.io.23.1.3+root.io.33.1.1+root.io.33.1.3+root.io.43.1.0+root.io.1 |
WerkzeugRoot:PyPI |
before 3.1.1+aikido.3 | 3.1.1+aikido.33.1.3+aikido.4 |
Public exploits
Links only. Every CVE stores no exploit code.
| Source | Link | Date |
|---|---|---|
| PoC in GitHub | alimezar/CVE-2026-27199-werkzeug-safe-join-bypass-PoC | 2026-02-20 |
History
| Recorded | Changed | Sources |
|---|---|---|
| affected, facts | ||
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV, PoC in GitHub |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-27199 is a medium vulnerability (CVSS 6.3) in Pallets Werkzeug, published February 19, 2026. Public exploit code exists. EPSS puts the chance of exploitation in the next 30 days at 0.63%, the 50th percentile. Fixed in werkzeug 3.1.6.
References
github.com/pallets/werkzeug/security/advisories/GHSA-29vq-49wr-vm6x
github.com/pallets/werkzeug/commit/f407712fdc60a09c2b3f4fe7db557703e5d9338d
github.com/pallets/werkzeug/releases/tag/3.1.6
nvd.nist.gov/vuln/detail/CVE-2026-27199
github.com/advisories/GHSA-29vq-49wr-vm6x
security.alpinelinux.org/vuln/CVE-2026-27199
docs.bell-sw.com/security/cves/CVE-2026-27199
github.com/CVEProject/cvelistV5/tree/main/cves/2026/27xxx/CVE-2026-27199.json
github.com/pallets/werkzeug
Left out here: 53 versions. The JSON record has them.