Skip to content

Commit d48fb31

Browse files
melifaroclaude
andcommitted
fix(gui): mitigate CVE-2026-48710 (BadHost) auth bypass vector
Use `request.scope["path"]` instead of `request.url.path` in `require_gui_user()` to prevent Host header forgery from manipulating the login redirect `returnTo` parameter. Bump starlette >= 1.0.1. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 91216e3 commit d48fb31

5 files changed

Lines changed: 9 additions & 8 deletions

File tree

mise.lock

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ url_api = "https://api.github.com/repos/minamijoyo/hcledit/releases/assets/22835
125125
checksum = "sha256:dc7de4514c6b63e9e601c640a68cab73949b9061b3c181f1e38f3e105f6fcbfb"
126126
url = "https://github.com/minamijoyo/hcledit/releases/download/v0.2.17/hcledit_0.2.17_darwin_arm64.tar.gz"
127127
url_api = "https://api.github.com/repos/minamijoyo/hcledit/releases/assets/228357402"
128+
github_attestations = "unavailable"
128129

129130
[tools."github:minamijoyo/hcledit"."platforms.macos-x64"]
130131
checksum = "sha256:63e122b039af7a1641c41e47f6ad40afaa1a400330c6c54086d7fde9a090bd57"

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ dependencies = [
6666
"nicegui>=3,<4",
6767
"truststore>=0.9,<1",
6868
"typer>=0.14,<1",
69-
"starlette>=1.0.0",
69+
"starlette>=1.0.1",
7070
]
7171

7272
[dependency-groups]

src/aignostics_foundry_core/gui/auth.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ async def require_gui_user(request: Request, return_to: str | None = None) -> di
205205

206206
user = await get_gui_user(request)
207207
if not user:
208-
redirect_path = return_to or request.url.path
208+
redirect_path = return_to or request.scope["path"]
209209
login_url = f"/auth/login?returnTo={redirect_path}"
210210
ui.navigate.to(login_url)
211211
return None

tests/aignostics_foundry_core/gui/gui_test.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -523,7 +523,7 @@ async def test_redirects_to_login_when_no_user(self) -> None:
523523
from aignostics_foundry_core.gui.auth import require_gui_user
524524

525525
request = MagicMock()
526-
request.url.path = "/protected"
526+
request.scope = {"path": "/protected"}
527527
request.app.state = MagicMock(spec=[]) # no auth_client → get_gui_user returns None
528528

529529
navigate_mock = MagicMock()
@@ -557,7 +557,7 @@ async def test_uses_return_to_override(self) -> None:
557557
from aignostics_foundry_core.gui.auth import require_gui_user
558558

559559
request = MagicMock()
560-
request.url.path = "/original"
560+
request.scope = {"path": "/original"}
561561
request.app.state = MagicMock(spec=[]) # no auth_client → get_gui_user returns None
562562

563563
navigate_mock = MagicMock()

uv.lock

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)