Skip to main content

WebOb CVE-2026-44889

MEDIUM
URL Redirection to Untrusted Site (Open Redirect) (CWE-601)
2026-06-04 https://github.com/Pylons/webob GHSA-fh3h-vg37-cc95
6.1
CVSS 3.1 · Vendor: https://github.com/Pylons/webob
Share

Severity by source

Vendor (https://github.com/Pylons/webob) PRIMARY
6.1 MEDIUM
AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N
SUSE
MEDIUM
qualitative
Red Hat
6.1 MEDIUM
qualitative

Primary rating from Vendor (https://github.com/Pylons/webob).

CVSS VectorVendor: https://github.com/Pylons/webob

Attack Vector
Network
Attack Complexity
Low
Privileges Required
None
User Interaction
Required
Scope
Changed
Confidentiality
Low
Integrity
Low
Availability
None

Lifecycle Timeline

2
Source Code Evidence Fetched
Jun 04, 2026 - 15:21 vuln.today
Analysis Generated
Jun 04, 2026 - 15:21 vuln.today

Blast Radius

ecosystem impact
† from your stack dependencies † transitive graph · vuln.today resolves 4-path depth
  • 1 pypi packages depend on webob (1 direct, 0 indirect)

Ecosystem-wide dependent count for version 1.8.10.

DescriptionCVE.org

Impact

When WebOb normalizes the HTTP Location header to include the request hostname, it does so by parsing the URL that the user is to be redirected to with Python's urllib.parse, and joining it to the base URL. urlsplit (called internally by urljoin) however treats a // at the start of a string as a URI without a scheme, and then treats the next part as the hostname. urljoin will then use that hostname from the second part as the hostname replacing the original one from the request.

In a previous advisory https://github.com/Pylons/webob/security/advisories/GHSA-mg3v-6m49-jhp3 an attempt to fix this was made by forcing the replacement of // with /%2f, however this did not take into account that since Python 3.10 urlsplit internally strips ASCII tab, carriage return, and newline characters from the string, so /\t/attacker.com gets turned into //attacker.com and the attacker is able to bypass the changes introduced in that previous advisory, thereby bringing back the problem that was attempted to be fixed.

>>> parse.urlparse("//attacker.com/some/path")
ParseResult(scheme='', netloc='attacker.com', path='/some/path', params='', query='', fragment='')

WebOb uses urljoin to take the request URI and join the redirect location to it, so assuming the request URI is https://example.org/ and the URL to redirect to is /\t/attacker.com/some/path/:

>>> parse.urljoin("https://example.org/", "/\t/attacker.com/some/path/")
'https://attacker.com/some/path/'

Which redirects from example.org where we want the user to stay to attacker.com.

Patches

This issue has been fixed in WebOb 1.8.10.

Workarounds

Any use of the Response class that includes a location can be rewritten to make sure to always pass a full URI that includes the hostname to redirect the user to, or to validate that the redirect target starts with a scheme (e.g. http:// or https://) before assigning to Response.location.

References

  • https://github.com/Pylons/webob/security/advisories/GHSA-mg3v-6m49-jhp3
  • CVE-2024-42353

Thanks

  • Caleb Brown of Google

AnalysisAI

Open redirect in WebOb (pip/webob <= 1.8.9) enables unauthenticated network attackers to redirect victims to arbitrary attacker-controlled domains by bypassing the prior CVE-2024-42353 patch. The bypass exploits Python 3.10+'s silent stripping of ASCII control characters (tab, CR, LF) from URLs before parsing, so a crafted path like /\t/attacker.com passes the previous // guard, then gets normalized by urlsplit into a protocol-relative URL pointing to attacker.com. No public exploit has been identified at time of analysis beyond the advisory's own proof-of-concept code, but the bypass technique is trivial and the full exploit path is published in the GitHub advisory GHSA-fh3h-vg37-cc95.

Technical ContextAI

WebOb (pkg:pip/webob) is a Python WSGI utility library providing request and response objects used by frameworks such as Pyramid. The vulnerable function _make_location_absolute in src/webob/response.py uses Python's urllib.parse.urljoin to normalize relative Location header values into absolute URLs. CWE-601 (URL Redirection to Untrusted Site) arises because urlsplit - called internally by urljoin - interprets any string beginning with // as a protocol-relative URI and treats the subsequent segment as the netloc/hostname, allowing attacker-controlled domain substitution. The previous fix for CVE-2024-42353 (GHSA-mg3v-6m49-jhp3) addressed this by replacing a leading // with /%2f, but this guard was bypassable because since Python 3.10 urlsplit silently strips ASCII tab (U+0009), carriage return (U+000D), and newline (U+000A) characters before processing, so the input /\t/attacker.com passes the // check but is internally normalized to //attacker.com, which urlsplit then resolves as netloc=attacker.com. This makes the fix version-specific to the Python runtime in addition to the WebOb version.

RemediationAI

Upgrade WebOb to version 1.8.10, the vendor-released patch documented at https://github.com/Pylons/webob/releases/tag/1.8.10 and implemented across commits 1f681a4f17fc10777ef861e8b43ecb26053bc539 and 2b9fbedafb31180c910cf8526e9ea72b4603d0bc. If an immediate upgrade is not feasible, the vendor-documented workaround is to rewrite all uses of Response.location so that only fully qualified URIs (including scheme and hostname, e.g. https://example.org/path) are assigned, or to validate that the redirect target begins with a known-safe scheme (http:// or https://) before assigning to Response.location. The trade-off of this workaround is that it requires auditing every call site where a relative path might be assigned to Response.location, and any missed call site remains exploitable. Do not rely on the previous // → /%2f substitution guard alone, as it is confirmed bypassable on Python 3.10+ by the tab-character injection technique described in this advisory.

More in Python

View all
CVE-2025-24016 CRITICAL POC
9.9 Feb 10

Wazuh SIEM platform versions 4.4.0 through 4.9.0 contain an unsafe deserialization vulnerability in the DistributedAPI t

CVE-2025-27520 CRITICAL POC
9.8 Apr 04

BentoML version 1.4.2 and earlier contains an unauthenticated remote code execution vulnerability through insecure deser

CVE-2025-2945 CRITICAL POC
9.9 Apr 03

pgAdmin 4 contains critical remote code execution vulnerabilities in the Query Tool download and Cloud Deployment endpoi

CVE-2013-5093 MEDIUM POC
6.8 Sep 27

The renderLocalView function in render/views.py in graphite-web in Graphite 0.9.5 through 0.9.10 uses the pickle Python

CVE-2025-32375 CRITICAL POC
9.8 Apr 09

BentoML is a Python library for building online serving systems optimized for AI apps and model inference. Rated critica

CVE-2014-0224 HIGH POC
7.4 Jun 05

OpenSSL before 0.9.8za, 1.0.0 before 1.0.0m, and 1.0.1 before 1.0.1h does not properly restrict processing of ChangeCiph

CVE-2024-21644 HIGH POC
7.5 Jan 08

pyLoad download manager version prior to 0.5.0b3.dev77 exposes the Flask SECRET_KEY through an unauthenticated endpoint.

CVE-2026-33017 CRITICAL POC
9.3 Mar 17

Langflow (a visual LLM pipeline builder) contains a critical unauthenticated code execution vulnerability (CVE-2026-3301

CVE-2017-9462 HIGH POC
8.8 Jun 06

In Mercurial before 4.1.3, "hg serve --stdio" allows remote authenticated users to launch the Python debugger, and conse

CVE-2026-49869 CRITICAL POC
10.0 Jun 26

Unauthenticated remote code execution affects Kestra OSS (the open-source event-driven orchestration platform) prior to

CVE-2026-39987 CRITICAL POC
9.3 Apr 08

Unauthenticated remote code execution in Marimo ≤0.20.4 allows attackers to execute arbitrary system commands via the `/

CVE-2024-21645 MEDIUM POC
5.3 Jan 08

pyLoad is the free and open-source Download Manager written in pure Python. Rated medium severity (CVSS 5.3), this vulne

Vendor StatusVendor

SUSE

Severity: Moderate
Product Status
SUSE Linux Enterprise Module for Basesystem 15 SP7 Affected
SUSE Linux Enterprise Server 15 SP7 Affected
SUSE Linux Enterprise Desktop 15 SP7 Affected
SUSE Linux Enterprise Server for SAP Applications 15 SP7 Affected
SUSE Linux Enterprise High Performance Computing 15 SP7 Affected

Share

CVE-2026-44889 vulnerability details – vuln.today

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy