{"id":"GHSA-fh3h-vg37-cc95","summary":"WebOb: Location header normalization during redirect leads to open redirect - again","details":"### Impact\n\nWhen 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.\n\nIn 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.\n\n```\n\u003e\u003e\u003e parse.urlparse(\"//attacker.com/some/path\")\nParseResult(scheme='', netloc='attacker.com', path='/some/path', params='', query='', fragment='')\n```\n\nWebOb 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/`:\n\n```\n\u003e\u003e\u003e parse.urljoin(\"https://example.org/\", \"/\\t/attacker.com/some/path/\")\n'https://attacker.com/some/path/'\n```\n\nWhich redirects from `example.org` where we want the user to stay to `attacker.com`.\n\n### Patches\n\nThis issue has been fixed in WebOb 1.8.10.\n\n### Workarounds\n\nAny 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`.\n\n### References\n\n- https://github.com/Pylons/webob/security/advisories/GHSA-mg3v-6m49-jhp3\n- CVE-2024-42353\n\n### Thanks\n\n- Caleb Brown of Google","aliases":["CVE-2026-44889","PYSEC-2026-251"],"modified":"2026-07-18T17:30:23.458341752Z","published":"2026-06-04T14:33:35Z","database_specific":{"github_reviewed":true,"github_reviewed_at":"2026-06-04T14:33:35Z","nvd_published_at":"2026-06-22T22:16:46Z","cwe_ids":["CWE-601"],"severity":"MODERATE"},"references":[{"type":"WEB","url":"https://github.com/Pylons/webob/security/advisories/GHSA-fh3h-vg37-cc95"},{"type":"WEB","url":"https://github.com/Pylons/webob/security/advisories/GHSA-mg3v-6m49-jhp3"},{"type":"ADVISORY","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-44889"},{"type":"WEB","url":"https://github.com/Pylons/webob/commit/1f681a4f17fc10777ef861e8b43ecb26053bc539"},{"type":"WEB","url":"https://github.com/Pylons/webob/commit/2b9fbedafb31180c910cf8526e9ea72b4603d0bc"},{"type":"PACKAGE","url":"https://github.com/Pylons/webob"},{"type":"WEB","url":"https://github.com/Pylons/webob/releases/tag/1.8.10"},{"type":"WEB","url":"https://github.com/pypa/advisory-database/tree/main/vulns/webob/PYSEC-2026-251.yaml"}],"affected":[{"package":{"name":"webob","ecosystem":"PyPI","purl":"pkg:pypi/webob"},"ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"1.8.10"}]}],"versions":["0.8","0.8.1","0.8.2","0.8.3","0.8.4","0.8.5","0.9","0.9.1","0.9.2","0.9.3","0.9.4","0.9.5","0.9.6","0.9.6.1","0.9.7","0.9.7.1","0.9.8","1.0","1.0.1","1.0.2","1.0.3","1.0.4","1.0.5","1.0.6","1.0.7","1.0.8","1.1","1.1.1","1.1b2","1.1beta1","1.1rc1","1.2","1.2.1","1.2.2","1.2.3","1.2b1","1.2b2","1.2b3","1.2rc1","1.3","1.3.1","1.4","1.4.1","1.4.2","1.5.0","1.5.0a0","1.5.0a1","1.5.0b0","1.5.1","1.6.0","1.6.0a0","1.6.1","1.6.2","1.6.3","1.6.4","1.7.0","1.7.0rc1","1.7.0rc2","1.7.1","1.7.2","1.7.3","1.7.4","1.8.0","1.8.0rc1","1.8.1","1.8.2","1.8.3","1.8.4","1.8.5","1.8.6","1.8.7","1.8.8","1.8.9"],"database_specific":{"last_known_affected_version_range":"\u003c= 1.8.9","source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/06/GHSA-fh3h-vg37-cc95/GHSA-fh3h-vg37-cc95.json"}}],"schema_version":"1.9.0","severity":[{"type":"CVSS_V3","score":"CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N"}]}