[RELEASE] Werkzeug debugger is loopback-only (carries #5382) - #5791
Merged
Conversation
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Xb6A5G74JiMe3zHFs1JZEP
✅ Drift Bot (ClawMetry): no drift detectedDrift Bot analyzed the changed files against this project's blueprints and requirements and found no drift. |
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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
Publishes #5382 (merged) to PyPI.
Why this needs to ship, not just merge. The fix lives in
dashboard.pyandhelpers/server.py— both in the wheel — so no user is protected until the package is on PyPI. Nothing about it reaches a machine through a cloud render-only pin.What rides this: #5382 only.
_run_servercalledapp.run(..., debug=True, ...)unconditionally. Two defaults turn that into real exposure rather than a theoretical one:--debugisstore_true, default=True(dashboard.py:13697) — dev mode is what you get unless you ask for--no-debug;--host 0.0.0.0.Do both — which the product invites — and any unhandled exception serves Werkzeug's interactive traceback page, with source, local variables and a PIN-gated eval console, to whoever reached the port. Bandit B201, HIGH.
Verified live before release, one fresh process per host, intercepting what
_run_serveractually handsapp.run:The same probe on the pre-fix tree returns
debug=Truefor0.0.0.0and192.168.1.50.use_reloaderstaysTrueon every bind — auto-reload is what dev mode is for, and it is separately pinned.25 tests in
tests/test_debugger_loopback_only.py, named inci.yml, with both regressions proven red:debug=True(the original bug) anddebug=False(which passes a naive "not True" check while removing the debugger for everyone).No-PRD: publishes an already-merged and already-recorded security fix; the constraint is documented on the Local Observability Service blueprint.
🤖 Generated with Claude Code
https://claude.ai/code/session_01Xb6A5G74JiMe3zHFs1JZEP