fix: route OAuth profile-picture fetch through the SSRF-safe session (#26699)
_process_picture_url validated the picture URL with validate_url() but then fetched it with a plain aiohttp session that resolves the hostname again at connect time, leaving a DNS-rebinding TOCTOU window (the same gap already closed for the RAG loader, the content probe, the image fetches and webhook delivery). Routing the fetch through get_ssrf_safe_session() pins the connect-time resolution via _SSRFSafeResolver and rejects non-global addresses, so a rebinding host can no longer redirect the fetch to loopback, RFC1918 or cloud-metadata endpoints. It also stops the forwarded OAuth access_token from leaking to a rebound internal target.
This commit is contained in:
1 parent
dd86b984bd
commit
5dcca59aee
1 file changed
+3
-3
@@ -84,7 +84,7 @@ from open_webui.models.config import Config
|
|||||||
from open_webui.models.groups import GroupForm, GroupModel, Groups, GroupUpdateForm
|
from open_webui.models.groups import GroupForm, GroupModel, Groups, GroupUpdateForm
|
||||||
from open_webui.models.oauth_sessions import OAuthSessions
|
from open_webui.models.oauth_sessions import OAuthSessions
|
||||||
from open_webui.models.users import Users
|
from open_webui.models.users import Users
|
||||||
from open_webui.retrieval.web.utils import validate_url
|
from open_webui.retrieval.web.utils import get_ssrf_safe_session, validate_url
|
||||||
from open_webui.utils.auth import create_token, get_password_hash
|
from open_webui.utils.auth import create_token, get_password_hash
|
||||||
from open_webui.utils.groups import apply_default_group_assignment
|
from open_webui.utils.groups import apply_default_group_assignment
|
||||||
from open_webui.utils.misc import parse_duration
|
from open_webui.utils.misc import parse_duration
|
||||||
@@ -1653,8 +1653,8 @@ class OAuthManager:
|
|||||||
get_kwargs['headers'] = {
|
get_kwargs['headers'] = {
|
||||||
'Authorization': f'Bearer {access_token}',
|
'Authorization': f'Bearer {access_token}',
|
||||||
}
|
}
|
||||||
async with aiohttp.ClientSession(trust_env=True) as session:
|
# get_ssrf_safe_session pins the connect-time IP (defeats DNS rebinding); allow_redirects=False keeps validate_url's vet authoritative.
|
||||||
# allow_redirects=False prevents redirect-based SSRF: validate_url() only vetted the initial URL (CVE-2026-45401 cohort).
|
async with get_ssrf_safe_session() as session:
|
||||||
async with session.get(
|
async with session.get(
|
||||||
picture_url,
|
picture_url,
|
||||||
**get_kwargs,
|
**get_kwargs,
|
||||||
|
|||||||
Reference in new issue
Block a user