You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Werkzeug's safe_join function allows path segments with Windows device names. On Windows, there are special device names such as CON, AUX, etc that are implicitly present and readable in every directory. 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.
Werkzeug's safe_join function allows path segments with Windows device names that have file extensions or trailing spaces. On Windows, there are special device names such as CON, AUX, etc that are implicitly present and readable in every directory. Windows still accepts them with any file extension, such as CON.txt, or trailing spaces such as CON .
This was previously reported as GHSA-hgf8-39gv-g3f2, but the fix failed to account for compound extensions such as CON.txt.html or trailing spaces. It also missed some additional special names.
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.
Werkzeug's safe_join function allows Windows device names as filenames if when 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.
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.
safe_join on Windows does not allow more special device names, regardless
of extension or surrounding spaces. :ghsa:87hc-h4r5-73f7
The multipart form parser handles a \r\n sequence at a chunk boundary.
This fixes the previous attempt, which caused incorrect content lengths.
:issue:3065 :issue:3077
Fix AttributeError when initializing DebuggedApplication with pin_security=False. :issue:3075
safe_join on Windows does not allow special device names. This prevents
reading from these when using send_from_directory. secure_filename
already prevented writing to these. :ghsa:hgf8-39gv-g3f2
The debugger pin fails after 10 attempts instead of 11. :pr:3020
The multipart form parser handles a \r\n sequence at a chunk boundary.
:issue:3065
Improve CPU usage during Watchdog reloader. :issue:3054
Request.json annotation is more accurate. :issue:3067
Traceback rendering handles when the line number is beyond the available
source lines. :issue:3044
HTTPException.get_response annotation and doc better conveys the
distinction between WSGI and sans-IO responses. :issue:3056
Initial data passed to MultiDict and similar interfaces only accepts list, tuple, or set when passing multiple values. It had been
changed to accept any Collection, but this matched types that should be
treated as single values, such as bytes. :issue:2994
When the Host header is not set and Request.host falls back to the
WSGI SERVER_NAME value, if that value is an IPv6 address it is wrapped
in [] to match the Host header. :issue:2993
Request.max_form_memory_size defaults to 500kB instead of unlimited.
Non-file form fields over this size will cause a RequestEntityTooLarge
error. :issue:2964
OrderedMultiDict and ImmutableOrderedMultiDict are deprecated.
Use MultiDict and ImmutableMultiDict instead. :issue:2968
Behavior of properties on request.cache_control and response.cache_control has been significantly adjusted.
Dict values are always str | None. Setting properties will convert
the value to a string. Setting a property to False is equivalent to
setting it to None. Getting typed properties will return None if
conversion raises ValueError, rather than the string. :issue:2980
max_age is None if present without a value, rather than -1.
:issue:2980
no_cache is a boolean for requests, it is True instead of "*" when present. It remains a string for responses. :issue:2980
max_stale is True if present without a value, rather
than "*". :issue:2980
no_transform is a boolean. Previously it was mistakenly always None. :issue:2881
min_fresh is None if present without a value, rather than "*". :issue:2881
private is True if present without a value, rather than "*".
:issue:2980
Added the must_understand property. :issue:2881
Added the stale_while_revalidate, and stale_if_error
properties. :issue:2948
Type annotations more accurately reflect the values. :issue:2881
Support Cookie CHIPS (Partitioned Cookies). :issue:2797
Restore behavior where parsing multipart/x-www-form-urlencoded data with
invalid UTF-8 bytes in the body results in no form data parsed rather than a
413 error. :issue:2930
Improve parse_options_header performance when parsing unterminated
quoted string values. :issue:2904
Debugger pin auth is synchronized across threads/processes when tracking
failed entries. :issue:2916
Dev server handles unexpected SSLEOFError due to issue in Python < 3.13.
:issue:2926
Debugger pin auth works when the URL already contains a query string.
:issue:2918
Only allow localhost, .localhost, 127.0.0.1, or the specified
hostname when running the dev server, to make debugger requests. Additional
hosts can be added by using the debugger middleware directly. The debugger
UI makes requests using the full URL rather than only the path.
:ghsa:2g68-c3qc-8985
Make reloader more robust when "" is in sys.path. :pr:2823
Better TLS cert format with adhoc dev certs. :pr:2891
Inform Python < 3.12 how to handle itms-services URIs correctly, rather
than using an overly-broad workaround in Werkzeug that caused some redirect
URIs to be passed on without encoding. :issue:2828
Type annotation for Rule.endpoint and other uses of endpoint is Any. :issue:2836
Make reloader more robust when "" is in sys.path. :pr:2823
renovatebot
changed the title
chore(deps): update dependency werkzeug to >=3.1.4, <3.1.5 [security]
chore(deps): update dependency werkzeug to >=3.1.4, <3.2.0 [security]
Dec 3, 2025
renovatebot
changed the title
chore(deps): update dependency werkzeug to >=3.1.4, <3.2.0 [security]
chore(deps): update dependency werkzeug to >=3.1.4, <3.1.5 [security]
Dec 3, 2025
renovatebot
changed the title
chore(deps): update dependency werkzeug to >=3.1.4, <3.1.5 [security]
chore(deps): update dependency werkzeug to >=3.1.4, <3.2.0 [security]
Dec 15, 2025
renovatebot
changed the title
chore(deps): update dependency werkzeug to >=3.1.4, <3.2.0 [security]
chore(deps): update dependency werkzeug to >=3.1.4, <3.1.5 [security]
Dec 15, 2025
renovatebot
changed the title
chore(deps): update dependency werkzeug to >=3.1.4, <3.1.5 [security]
chore(deps): update dependency werkzeug to >=3.1.4, <3.2.0 [security]
Dec 30, 2025
renovatebot
changed the title
chore(deps): update dependency werkzeug to >=3.1.4, <3.2.0 [security]
chore(deps): update dependency werkzeug to >=3.1.4, <3.1.5 [security]
Dec 30, 2025
renovatebot
changed the title
chore(deps): update dependency werkzeug to >=3.1.4, <3.1.5 [security]
chore(deps): update dependency werkzeug to >=3.1.4, <3.2.0 [security]
Dec 31, 2025
renovatebot
changed the title
chore(deps): update dependency werkzeug to >=3.1.4, <3.2.0 [security]
chore(deps): update dependency werkzeug to >=3.1.4, <3.1.5 [security]
Dec 31, 2025
renovatebot
changed the title
chore(deps): update dependency werkzeug to >=3.1.4, <3.1.5 [security]
chore(deps): update dependency werkzeug to >=3.1.4, <3.2.0 [security]
Jan 8, 2026
renovatebot
changed the title
chore(deps): update dependency werkzeug to >=3.1.4, <3.2.0 [security]
chore(deps): update dependency werkzeug to >=3.1.4, <3.1.5 [security]
Jan 8, 2026
renovatebot
changed the title
chore(deps): update dependency werkzeug to >=3.1.4, <3.1.5 [security]
chore(deps): update dependency werkzeug to >=3.1.5, <3.1.6 [security]
Jan 9, 2026
renovatebot
changed the title
chore(deps): update dependency werkzeug to >=3.1.5, <3.1.6 [security]
chore(deps): update dependency werkzeug to >=3.1.5, <3.2.0 [security]
Jan 19, 2026
renovatebot
changed the title
chore(deps): update dependency werkzeug to >=3.1.5, <3.2.0 [security]
chore(deps): update dependency werkzeug to >=3.1.5, <3.1.6 [security]
Jan 19, 2026
renovatebot
changed the title
chore(deps): update dependency werkzeug to >=3.1.5, <3.1.6 [security]
chore(deps): update dependency werkzeug to >=3.1.5, <3.2.0 [security]
Jan 23, 2026
renovatebot
changed the title
chore(deps): update dependency werkzeug to >=3.1.5, <3.2.0 [security]
chore(deps): update dependency werkzeug to >=3.1.5, <3.1.6 [security]
Jan 23, 2026
renovatebot
changed the title
chore(deps): update dependency werkzeug to >=3.1.5, <3.1.6 [security]
chore(deps): update dependency werkzeug to >=3.1.5, <3.2.0 [security]
Feb 16, 2026
renovatebot
changed the title
chore(deps): update dependency werkzeug to >=3.1.5, <3.2.0 [security]
chore(deps): update dependency werkzeug to >=3.1.5, <3.1.6 [security]
Feb 16, 2026
renovatebot
changed the title
chore(deps): update dependency werkzeug to >=3.1.5, <3.1.6 [security]
chore(deps): update dependency werkzeug to >=3.1.5, <3.2.0 [security]
Feb 17, 2026
renovatebot
changed the title
chore(deps): update dependency werkzeug to >=3.1.5, <3.2.0 [security]
chore(deps): update dependency werkzeug to >=3.1.5, <3.1.6 [security]
Feb 17, 2026
renovatebot
changed the title
chore(deps): update dependency werkzeug to >=3.1.5, <3.1.6 [security]
chore(deps): update dependency werkzeug to >=3.1.6, <3.1.7 [security]
Feb 23, 2026
renovatebot
changed the title
chore(deps): update dependency werkzeug to >=3.1.6, <3.1.7 [security]
chore(deps): update dependency werkzeug to >=3.1.6, <3.2.0 [security]
Mar 5, 2026
renovatebot
changed the title
chore(deps): update dependency werkzeug to >=3.1.6, <3.2.0 [security]
chore(deps): update dependency werkzeug to >=3.1.6, <3.1.7 [security]
Mar 5, 2026
renovatebot
changed the title
chore(deps): update dependency werkzeug to >=3.1.6, <3.1.7 [security]
chore(deps): update dependency werkzeug to >=3.1.6, <3.2.0 [security]
Mar 13, 2026
renovatebot
changed the title
chore(deps): update dependency werkzeug to >=3.1.6, <3.2.0 [security]
chore(deps): update dependency werkzeug to >=3.1.6, <3.1.7 [security]
Mar 13, 2026
renovatebot
changed the title
chore(deps): update dependency werkzeug to >=3.1.6, <3.1.7 [security]
chore(deps): update dependency werkzeug to >=3.1.7, <3.2.0 [security]
Mar 26, 2026
renovatebot
changed the title
chore(deps): update dependency werkzeug to >=3.1.7, <3.2.0 [security]
chore(deps): update dependency werkzeug to >=3.1.6, <3.1.7 [security]
Mar 26, 2026
renovatebot
changed the title
chore(deps): update dependency werkzeug to >=3.1.6, <3.1.7 [security]
chore(deps): update dependency werkzeug to >=3.1.6, <3.1.7 [security] - autoclosed
Mar 27, 2026
renovatebot
changed the title
chore(deps): update dependency werkzeug to >=3.1.6, <3.1.7 [security] - autoclosed
chore(deps): update dependency werkzeug to >=3.1.6, <3.1.7 [security]
Mar 30, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
>=3.0.1, <3.1.0→>=3.1.6, <3.1.7GitHub Vulnerability Alerts
CVE-2025-66221
Werkzeug's
safe_joinfunction allows path segments with Windows device names. On Windows, there are special device names such asCON,AUX, etc that are implicitly present and readable in every directory.send_from_directoryusessafe_jointo 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.CVE-2026-21860
Werkzeug's
safe_joinfunction allows path segments with Windows device names that have file extensions or trailing spaces. On Windows, there are special device names such asCON,AUX, etc that are implicitly present and readable in every directory. Windows still accepts them with any file extension, such asCON.txt, or trailing spaces such asCON.This was previously reported as GHSA-hgf8-39gv-g3f2, but the fix failed to account for compound extensions such as
CON.txt.htmlor trailing spaces. It also missed some additional special names.send_from_directoryusessafe_jointo 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.CVE-2026-27199
Werkzeug's
safe_joinfunction allows Windows device names as filenames if when 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_joinaccepts paths with multiple segments, such asexample/NUL.send_from_directoryusessafe_jointo 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.Release Notes
pallets/werkzeug (Werkzeug)
v3.1.6Compare Source
Released 2026-02-19
safe_joinon Windows does not allow special devices names inmulti-segment paths. :ghsa:
29vq-49wr-vm6xv3.1.5Compare Source
Released 2026-01-08
safe_joinon Windows does not allow more special device names, regardlessof extension or surrounding spaces. :ghsa:
87hc-h4r5-73f7\r\nsequence at a chunk boundary.This fixes the previous attempt, which caused incorrect content lengths.
:issue:
3065:issue:3077AttributeErrorwhen initializingDebuggedApplicationwithpin_security=False. :issue:3075v3.1.4Compare Source
Released 2025-11-28
safe_joinon Windows does not allow special device names. This preventsreading from these when using
send_from_directory.secure_filenamealready prevented writing to these. :ghsa:
hgf8-39gv-g3f23020\r\nsequence at a chunk boundary.:issue:
30653054Request.jsonannotation is more accurate. :issue:3067source lines. :issue:
3044HTTPException.get_responseannotation and doc better conveys thedistinction between WSGI and sans-IO responses. :issue:
3056v3.1.3Compare Source
Released 2024-11-08
MultiDictand similar interfaces only acceptslist,tuple, orsetwhen passing multiple values. It had beenchanged to accept any
Collection, but this matched types that should betreated as single values, such as
bytes. :issue:2994Hostheader is not set andRequest.hostfalls back to theWSGI
SERVER_NAMEvalue, if that value is an IPv6 address it is wrappedin
[]to match theHostheader. :issue:2993v3.1.2Compare Source
Released 2024-11-04
TypeConversionDict.getto allow thetypeparameter to be a callable. :issue:
2988Headersdoes not inherit fromMutableMapping, as it is does notexactly match that interface. :issue:
2989v3.1.1Compare Source
Released 2024-11-01
str(Request.headers)to always appear empty.:issue:
2985v3.1.0Compare Source
Released 2024-10-31
Drop support for Python 3.8. :pr:
2966Remove previously deprecated code. :pr:
2967Request.max_form_memory_sizedefaults to 500kB instead of unlimited.Non-file form fields over this size will cause a
RequestEntityTooLargeerror. :issue:
2964OrderedMultiDictandImmutableOrderedMultiDictare deprecated.Use
MultiDictandImmutableMultiDictinstead. :issue:2968Behavior of properties on
request.cache_controlandresponse.cache_controlhas been significantly adjusted.str | None. Setting properties will convertthe value to a string. Setting a property to
Falseis equivalent tosetting it to
None. Getting typed properties will returnNoneifconversion raises
ValueError, rather than the string. :issue:2980max_ageisNoneif present without a value, rather than-1.:issue:
2980no_cacheis a boolean for requests, it isTrueinstead of"*"when present. It remains a string for responses. :issue:2980max_staleisTrueif present without a value, ratherthan
"*". :issue:2980no_transformis a boolean. Previously it was mistakenly alwaysNone. :issue:2881min_freshisNoneif present without a value, rather than"*". :issue:2881privateisTrueif present without a value, rather than"*".:issue:
2980must_understandproperty. :issue:2881stale_while_revalidate, andstale_if_errorproperties. :issue:
29482881Support Cookie CHIPS (Partitioned Cookies). :issue:
2797Add 421
MisdirectedRequestHTTP exception. :issue:2850Increase default work factor for PBKDF2 to 1,000,000 iterations.
:issue:
2969Inline annotations for
datastructures, removing stub files.:issue:
2970MultiDict.getlistcatchesTypeErrorin addition toValueErrorwhen doing type conversion. :issue:
2976Implement
|and|=operators forMultiDict,Headers, andCallbackDict, and disallow|=on immutable types. :issue:2977v3.0.6Compare Source
Released 2024-10-25
max_form_memory_sizeis applied when parsing large non-filefields. :ghsa:
q34m-jh98-gwm2safe_joincatches certain paths on Windows that were not caught byntpath.isabson Python < 3.11. :ghsa:f9vj-2wh5-fj8jv3.0.5Compare Source
Released 2024-10-24
294529522955SharedDataMiddleware. :issue:2958UID does not have an associated name. :issue:
2957v3.0.4Compare Source
Released 2024-08-21
multipart/x-www-form-urlencodeddata withinvalid UTF-8 bytes in the body results in no form data parsed rather than a
413 error. :issue:
2930parse_options_headerperformance when parsing unterminatedquoted string values. :issue:
2904failed entries. :issue:
2916SSLEOFErrordue to issue in Python < 3.13.:issue:
2926:issue:
2918v3.0.3Compare Source
Released 2024-05-05
localhost,.localhost,127.0.0.1, or the specifiedhostname when running the dev server, to make debugger requests. Additional
hosts can be added by using the debugger middleware directly. The debugger
UI makes requests using the full URL rather than only the path.
:ghsa:
2g68-c3qc-8985""is insys.path. :pr:2823adhocdev certs. :pr:2891itms-servicesURIs correctly, ratherthan using an overly-broad workaround in Werkzeug that caused some redirect
URIs to be passed on without encoding. :issue:
2828Rule.endpointand other uses ofendpointisAny. :issue:2836""is insys.path. :pr:2823v3.0.2Compare Source
Released 2024-04-01
merge_slashestoFalseresults inNotFoundforrepeated-slash requests against single slash routes. :issue:
2834TypeErrorinTypeConversionDict.get()to matchValueError. :issue:2843response_wrappertype check in test client. :issue:2831MultiPartParser.parsemore precise.:issue:
28402822Configuration
📅 Schedule: Branch creation - "" (UTC), Automerge - At any time (no schedule defined).
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.