open-webui/backend/open_webui
Classic298 2d9939ed49
chore: add validate_url() to get_image_data() for cohort consistency hardening (#24518)
* chore: add validate_url() to get_image_data() for cohort consistency hardening

`get_image_data()` in `backend/open_webui/routers/images.py` fetches the
URL returned by the configured image generation API directly via
`session.get(data)` without first calling `validate_url()`. The sibling
`load_url_image()` in the same file (called from /images/edit) calls
`validate_url(data)` first — that gate was added under
GHSA-jgx9-jr5x-mvpv. The two functions handle structurally identical
input (an attacker-or-server-supplied URL string) and should enforce the
same SSRF gate as a matter of code hygiene.

In the current call graph, the URL passed to `get_image_data()` comes
from the admin-configured image generation API's response, so an
exploitable SSRF chain additionally requires admin-side trust delegation
(misconfigured/untrusted upstream image API, or a custom
OpenAI-compatible server that reflects user input into response URLs).
That makes the missing call a defense-in-depth gap rather than a
vulnerability per SECURITY.md Rule 9 — a position the GHSA-h7cc-wwjp-5xqh
advisory is being closed under. This change is hardening: it brings the
two image-fetch helpers into alignment so any future caller that begins
passing user-influenced URLs into `get_image_data()` is gated by the
same private-IP / loopback / metadata-IP filter the rest of the
codebase enforces.

Surface raised by brodmart in GHSA-h7cc-wwjp-5xqh.

Co-authored-by: brodmart <brodmart@users.noreply.github.com>

* chore: trim comment

---------

Co-authored-by: brodmart <brodmart@users.noreply.github.com>
2026-05-11 00:59:32 +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: add validate_url() to get_image_data() for cohort consistency hardening (#24518) 2026-05-11 00:59:32 +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