open-webui/backend/open_webui
Classic298 e7ba8978c6
fix: reject parser-confusing chars in validate_url to close SSRF bypass (#24534)
urllib.parse.urlparse and requests/aiohttp disagree on how to split URLs
containing backslash, tab, CR, or LF in or around the netloc. urlparse
treats backslash as part of userinfo and uses what follows '@' as the
host; requests treats backslash as the start of the path and connects
to whatever precedes it. The same URL therefore passes the private-IP
filter (urlparse sees a public host) but reaches an internal target
(requests connects to e.g. 127.0.0.1). End result is an SSRF that the
existing IP block list cannot catch because it's evaluating the wrong
host.

PoC: http://127.0.0.1:6666\@1.1.1.1 — urlparse hostname is 1.1.1.1
(global, passes), requests reaches 127.0.0.1 (loopback).

Reject up front any URL containing one of the four documented parser-
confusing characters before either parser gets a chance to interpret
it. None of these characters is valid in an unencoded URL (\ should
always be %5C, whitespace should be %09 / %0A / %0D), so this is a
pure defensive rejection with no legitimate-input false positives.

Reported by Fushuling and RacerZ-fighting in GHSA-8w7q-q5jp-jvgx.

Co-authored-by: Fushuling <Fushuling@users.noreply.github.com>
Co-authored-by: RacerZ-fighting <RacerZ-fighting@users.noreply.github.com>
2026-05-11 00:57:48 +09:00
..
data refac: mv backend files to /open_webui dir 2024-09-04 16:54:48 +02:00
internal chore: format 2026-05-09 15:25:27 +09:00
migrations chore: format 2026-05-09 15:25:27 +09:00
models Merge pull request #24486 from Classic298/fix/notes-is-pinned-typeerror 2026-05-09 20:56:06 +09:00
retrieval fix: reject parser-confusing chars in validate_url to close SSRF bypass (#24534) 2026-05-11 00:57:48 +09:00
routers chore: remove unauthenticated dead-code GET /api/v1/retrieval/ status endpoint (#24497) 2026-05-09 23:19:14 +09:00
socket refac 2026-05-09 15:21:31 +09:00
static chore: format 2026-04-19 22:45:54 +09:00
storage refac 2026-04-12 19:08:30 -05:00
test refac 2026-03-17 17:58:01 -05:00
tools chore: format 2026-05-09 15:25:27 +09:00
utils refac 2026-05-09 21:05:49 +09:00
__init__.py refac 2026-05-09 02:38:08 +09:00
alembic.ini fix: Alembic CLI commands from failing 2025-08-15 04:17:47 -04:00
config.py fix: gate public sharing of calendars behind sharing.public_calendars permission (#24493) 2026-05-09 23:18:51 +09:00
constants.py chore: format 2026-04-14 17:27:31 -05:00
env.py refac 2026-05-09 21:05:49 +09:00
functions.py refac 2026-05-09 04:17:58 +09:00
main.py chore: format 2026-05-09 15:25:27 +09:00
tasks.py refac 2026-03-17 17:58:01 -05:00