CVE-2026-54282
Starlette: Unvalidated request path concatenated into authority poisons request.url.hostname
Starlette is a lightweight ASGI framework/toolkit. Prior to 1.3.0, the HTTP request path is not validated before being used to reconstruct request.url. Because request.url is rebuilt by concatenating {scheme}://{host}{path} and re-parsing the result, a path that does not begin with / (for example @google.com) moves the authority boundary during re-parsing, so request.url.hostname and request.url.netloc become attacker-controlled. Code that reads request.url.hostname (rather than the Host header or scope) can therefore be misled into trusting an attacker-supplied host. This vulnerability is fixed in 1.3.0.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- High
- Privileges needed
- None
- User interaction
- None
What an attacker can affect
- Confidentiality
- None
- Integrity
- Low
- Availability
- None
Exploit likelihood
What each source reports
CVE List Score used
3.7
Starlette: Unvalidated request path concatenated into authority poisons request.url.hostname
Starlette is a lightweight ASGI framework/toolkit. Prior to 1.3.0, the HTTP request path is not validated before being used to reconstruct request.url. Because request.url is rebuilt by concatenating {scheme}://{host}{path} and re-parsing the result, a path that does not begin with / (for example @google.com) moves the authority boundary during re-parsing, so request.url.hostname and request.url.netloc become attacker-controlled. Code that reads request.url.hostname (rather than the Host header or scope) can therefore be misled into trusting an attacker-supplied host. This vulnerability is fixed in 1.3.0.
- Record
CVE-2026-54282- CVSS 3.1
- 3.7 Low
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:N - Weakness
- CWE-706
- Updated
- 2026-11-02
EUVDEUVD-2026-38318
3.7
Starlette is a lightweight ASGI framework/toolkit. Prior to 1.3.0, the HTTP request path is not validated before being used to reconstruct request.url. Because request.url is rebuilt by concatenating {scheme}://{host}{path} and re-parsing the result, a path that does not begin with / (for example @google.com) moves the authority boundary during re-parsing, so request.url.hostname and request.url.netloc become attacker-controlled. Code that reads request.url.hostname (rather than the Host header or scope) can therefore be misled into trusting an attacker-supplied host. This vulnerability is fixed in 1.3.0.
- Record
EUVD-2026-38318- CVSS 3.1
- 3.7 Low
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:N - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-jp82-jpqv-5vv3
3.7
Starlette: Unvalidated request path concatenated into authority poisons request.url.hostname
Summary
In affected versions, the HTTP request path is not validated before being used to reconstruct request.url. Because request.url is rebuilt by concatenating {scheme}://{host}{path} and re-parsing the result, a path that does not begin with / (for example @google.com) moves the authority boundary during re-parsing, so request.url.hostname and request.url.netloc become attacker-controlled. Code that reads request.url.hostname (rather than the Host header or scope) can therefore be misled into trusting an attacker-supplied host.
Details
When a client requests a path that does not start with /:
GET @google.com HTTP/1.1
Host: localhost
affected versions reconstruct the URL as http://[email protected]. Per RFC 3986 §3.2.1, the substring before @ in the authority is userinfo, so re-parsing yields username = "localhost" and hostname = "google.com", with an empty path:
request.url == "http://[email protected]"
request.url.hostname == "google.com"
request.url.path == ""
The root cause is that the path is concatenated directly after the host without a separating /, and without validating that it begins with one. Only the Host header was validated when constructing request.url; the path was not.
This requires an ASGI server that forwards a request-target lacking a leading / into scope["path"].
Impact
Any application running an affected version that uses request.url, request.url.netloc, or request.url.hostname for a security-sensitive decision (host-based authorization, redirect/callback base, SSRF target, cache key, audit log) may be affected, when no fronting proxy or load balancer rejects the malformed request-target first.
Note that this is less exploitable than GHSA-86qp-5c8j-p5mr: there, the poison is carried in the Host header, so the real path still routes to a valid endpoint while request.url.path lies. Here, the poison must be carried in the path itself, and that path (@google.com) does not match any registered route, so routing returns 404 and no endpoint handler runs. The exposure is limited to code that reads request.url before routing - notably middleware - or in 404/exception handlers.
Mitigation
Upgrade to a patched version, which prevents the request path from crossing into the URL authority. The request above instead yields http://localhost/@google.com with request.url.hostname == "localhost".
- Record
GHSA-jp82-jpqv-5vv3- CVSS 3.1
- 3.7 Low
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:N - Weakness
- CWE-20, CWE-706
- Updated
- 2026-11-02
NVD
3.7
Starlette is a lightweight ASGI framework/toolkit. Prior to 1.3.0, the HTTP request path is not validated before being used to reconstruct request.url. Because request.url is rebuilt by concatenating {scheme}://{host}{path} and re-parsing the result, a path that does not begin with / (for example @google.com) moves the authority boundary during re-parsing, so request.url.hostname and request.url.netloc become attacker-controlled. Code that reads request.url.hostname (rather than the Host header or scope) can therefore be misled into trusting an attacker-supplied host. This vulnerability is fixed in 1.3.0.
- Record
CVE-2026-54282- CVSS 3.1
- 3.7 Low
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:N - CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N - Weakness
- CWE-706
- Updated
- 2026-11-02
OSV
3.7
Starlette: Unvalidated request path concatenated into authority poisons request.url.hostname
Starlette is a lightweight ASGI framework/toolkit. Prior to 1.3.0, the HTTP request path is not validated before being used to reconstruct request.url. Because request.url is rebuilt by concatenating {scheme}://{host}{path} and re-parsing the result, a path that does not begin with / (for example @google.com) moves the authority boundary during re-parsing, so request.url.hostname and request.url.netloc become attacker-controlled. Code that reads request.url.hostname (rather than the Host header or scope) can therefore be misled into trusting an attacker-supplied host. This vulnerability is fixed in 1.3.0.
- Record
CVE-2026-54282- CVSS 3.1
- 3.7 Low
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:N - Weakness
- CWE-706
- Updated
- 2026-11-02
OSVDEBIAN-CVE-2026-54282
5.3
Starlette is a lightweight ASGI framework/toolkit. Prior to 1.3.0, the HTTP request path is not validated before being used to reconstruct request.url. Because request.url is rebuilt by concatenating {scheme}://{host}{path} and re-parsing the result, a path that does not begin with / (for example @google.com) moves the authority boundary during re-parsing, so request.url.hostname and request.url.netloc become attacker-controlled. Code that reads request.url.hostname (rather than the Host header or scope) can therefore be misled into trusting an attacker-supplied host. This vulnerability is fixed in 1.3.0.
- Record
DEBIAN-CVE-2026-54282- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N - Updated
- 2026-11-02
Show 11 moreShow less
OSVGHSA-jp82-jpqv-5vv3
3.7
Starlette: Unvalidated request path concatenated into authority poisons request.url.hostname
Summary
In affected versions, the HTTP request path is not validated before being used to reconstruct request.url. Because request.url is rebuilt by concatenating {scheme}://{host}{path} and re-parsing the result, a path that does not begin with / (for example @google.com) moves the authority boundary during re-parsing, so request.url.hostname and request.url.netloc become attacker-controlled. Code that reads request.url.hostname (rather than the Host header or scope) can therefore be misled into trusting an attacker-supplied host.
Details
When a client requests a path that does not start with /:
GET @google.com HTTP/1.1
Host: localhost
affected versions reconstruct the URL as http://[email protected]. Per RFC 3986 §3.2.1, the substring before @ in the authority is userinfo, so re-parsing yields username = "localhost" and hostname = "google.com", with an empty path:
request.url == "http://[email protected]"
request.url.hostname == "google.com"
request.url.path == ""
The root cause is that the path is concatenated directly after the host without a separating /, and without validating that it begins with one. Only the Host header was validated when constructing request.url; the path was not.
This requires an ASGI server that forwards a request-target lacking a leading / into scope["path"].
Impact
Any application running an affected version that uses request.url, request.url.netloc, or request.url.hostname for a security-sensitive decision (host-based authorization, redirect/callback base, SSRF target, cache key, audit log) may be affected, when no fronting proxy or load balancer rejects the malformed request-target first.
Note that this is less exploitable than GHSA-86qp-5c8j-p5mr: there, the poison is carried in the Host header, so the real path still routes to a valid endpoint while request.url.path lies. Here, the poison must be carried in the path itself, and that path (@google.com) does not match any registered route, so routing returns 404 and no endpoint handler runs. The exposure is limited to code that reads request.url before routing - notably middleware - or in 404/exception handlers.
Mitigation
Upgrade to a patched version, which prevents the request path from crossing into the URL authority. The request above instead yields http://localhost/@google.com with request.url.hostname == "localhost".
- Record
GHSA-jp82-jpqv-5vv3- CVSS 3.1
- 3.7 Low
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:N - Weakness
- CWE-20, CWE-706
- Updated
- 2026-11-02
OSVPYSEC-2026-248
5.3
Starlette is a lightweight ASGI framework/toolkit. Prior to 1.3.0, the HTTP request path is not validated before being used to reconstruct request.url. Because request.url is rebuilt by concatenating {scheme}://{host}{path} and re-parsing the result, a path that does not begin with / (for example @google.com) moves the authority boundary during re-parsing, so request.url.hostname and request.url.netloc become attacker-controlled. Code that reads request.url.hostname (rather than the Host header or scope) can therefore be misled into trusting an attacker-supplied host. This vulnerability is fixed in 1.3.0.
- Record
PYSEC-2026-248- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N - Updated
- 2026-11-02
OSVUBUNTU-CVE-2026-54282
3.7
Starlette is a lightweight ASGI framework/toolkit. Prior to 1.3.0, the HTTP request path is not validated before being used to reconstruct request.url. Because request.url is rebuilt by concatenating {scheme}://{host}{path} and re-parsing the result, a path that does not begin with / (for example @google.com) moves the authority boundary during re-parsing, so request.url.hostname and request.url.netloc become attacker-controlled. Code that reads request.url.hostname (rather than the Host header or scope) can therefore be misled into trusting an attacker-supplied host. This vulnerability is fixed in 1.3.0.
- Record
UBUNTU-CVE-2026-54282- CVSS 3.1
- 3.7 Low
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:N - CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N - Updated
- 2026-11-02
OSVCLSA-2026-1784077472 No score
TuxCare security update for starlette (1 CVE)
TuxCare rebuilt starlette to address 1 CVE. Fixed in 0.27.0.post6+tuxcare.
- Record
CLSA-2026-1784077472- Updated
- 2026-11-02
OSVCLSA-2026-1789447406 No score
TuxCare security update for starlette (8 CVEs)
TuxCare rebuilt starlette to address 8 CVEs. Fixed in 0.25.0.post1+tuxcare.
- Record
CLSA-2026-1789447406- Updated
- 2026-11-02
OSVCLSA-2026-1789537996 No score
TuxCare security update for starlette (4 CVEs)
TuxCare rebuilt starlette to address 4 CVEs. Fixed in 0.13.6.post5+tuxcare.
- Record
CLSA-2026-1789537996- Updated
- 2026-11-02
OSVMGASA-2026-0413 No score
Updated python-starlette package fixes security vulnerabilities
Arbitrary HTTP method dispatched to HTTPEndpoint attributes via
getattr. (CVE-2026-48817)
Unvalidated request path concatenated into authority poisons
request.url.hostname. (CVE-2026-54282)
- Record
MGASA-2026-0413- Updated
- 2026-11-02
OSVopenSUSE-SU-2026:11058-1 No score
python311-starlette-1.3.1-1.1 on GA media
These are all security issues fixed in the python311-starlette-1.3.1-1.1 package on the GA media of openSUSE Tumbleweed.
- Record
openSUSE-SU-2026:11058-1- Updated
- 2026-11-02
OSVopenSUSE-SU-2026:21053-1 No score
Security update for python-starlette
This update for python-starlette fixes the following issues
- CVE-2026-48817: arbitrary HTTP method dispatched to
HTTPEndpointattributes viagetattr(bsc#1268389). - CVE-2026-54282: request path that lacks a leading forward slash can lead to request.url.hostname manipulation (bsc#1268520).
- CVE-2026-54283: urlencoded request body with an oversized data can lead to a denial of service (bsc#1268517).
- Record
openSUSE-SU-2026:21053-1- Updated
- 2026-11-02
OSVROOT-APP-PYPI-CVE-2026-54282 No score
CVE-2026-54282 in rootio-starlette - Patched by Root
Root has patched CVE-2026-54282 in the rootio-starlette package for Root:PyPI. Multiple fixed versions available.
- Record
ROOT-APP-PYPI-CVE-2026-54282- Updated
- 2026-11-02
OSVSUSE-SU-2026:22360-1 No score
Security update for python-starlette
This update for python-starlette fixes the following issues
- CVE-2026-48817: arbitrary HTTP method dispatched to
HTTPEndpointattributes viagetattr(bsc#1268389). - CVE-2026-54282: request path that lacks a leading forward slash can lead to request.url.hostname manipulation (bsc#1268520).
- CVE-2026-54283: urlencoded request body with an oversized data can lead to a denial of service (bsc#1268517).
- Record
SUSE-SU-2026:22360-1- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
starlettePyPI |
before 1.3.0 | 1.3.0 |
starletteTuxCare:PyPI |
0.27.0 up to 0.27.0.post6+tuxcare, plus listed versions 0.27.0.post1+tuxcare0.27.0.post2+tuxcare0.27.0.post3+tuxcare0.27.0.post4+tuxcare0.27.0.post5+tuxcare |
0.27.0.post6+tuxcare |
starletteTuxCare:PyPI From an advisory covering 8 CVEs |
0.25.0 up to 0.25.0.post1+tuxcare | 0.25.0.post1+tuxcare |
starletteTuxCare:PyPI From an advisory covering 4 CVEs |
0.13.6 up to 0.13.6.post5+tuxcare, plus listed versions 0.13.6.post1+tuxcare0.13.6.post2+tuxcare0.13.6.post3+tuxcare0.13.6.post4+tuxcare |
0.13.6.post5+tuxcare |
starletteDebian:12 |
before 0.26.1-1+deb12u2, plus listed versions 0.26.1-10.26.1-1+deb12u1 |
0.26.1-1+deb12u2 |
starletteDebian:13 |
before 0.46.1-3+deb13u3, plus listed versions 0.46.1-30.46.1-3+deb13u10.46.1-3+deb13u2 |
0.46.1-3+deb13u3 |
starletteDebian:14 |
before 1.3.1-1, plus listed versions 0.46.1-30.50.0-11.0.0-11.1.0-1 |
1.3.1-1 |
starlettePyPI |
before 1.3.0, plus listed versions 0.1.00.1.10.1.100.1.110.1.12 Show 45 moreShow less0.1.130.1.140.1.150.1.160.1.170.1.20.1.30.1.40.1.50.1.60.1.70.1.80.1.90.10.00.10.10.10.20.10.30.10.40.10.50.10.60.10.70.11.00.11.10.11.20.11.30.11.40.12.00.12.0b10.12.0b20.12.0b30.12.10.12.100.12.110.12.120.12.130.12.20.12.30.12.40.12.50.12.60.12.70.12.80.12.90.13.00.13.1 |
1.3.0 |
python-starletteMageia:10 From an advisory covering 3 CVEs |
before 0.46.0-3.2.mga10 | 0.46.0-3.2.mga10 |
rootio-starletteRoot:PyPI |
before 0.50.0+root.io.2 | 0.50.0+root.io.20.45.3+root.io.140.49.3+root.io.40.49.2+root.io.40.46.2+root.io.70.52.1+root.io.31.0.0+root.io.21.0.1+root.io.21.2.0+root.io.21.2.1+root.io.20.49.1+root.io.31.1.0+root.io.21.0.0+root.io.30.45.3+root.io.15 |
Show 10 moreShow less
| Package | Affected | Fixed |
|---|---|---|
starletteRoot:PyPI |
before 0.50.0+aikido.2 | 0.50.0+aikido.20.45.3+aikido.140.49.3+aikido.40.49.2+aikido.40.46.2+aikido.70.52.1+aikido.31.0.0+aikido.21.0.1+aikido.21.2.0+aikido.21.2.1+aikido.20.49.1+aikido.31.1.0+aikido.21.0.0+aikido.30.45.3+aikido.150.50.0+aikido.3 |
python-starletteSUSE:Linux Enterprise Server 16.0 From an advisory covering 3 CVEs |
before 0.41.3-160000.4.1 | 0.41.3-160000.4.1 |
python-starletteSUSE:Linux Enterprise Server for SAP applications 16.0 From an advisory covering 3 CVEs |
before 0.41.3-160000.4.1 | 0.41.3-160000.4.1 |
starletteUbuntu:22.04:LTS |
All versions, plus listed versions 0.14.1-10.16.0-10.18.0-1 |
None known |
starletteUbuntu:24.04:LTS |
All versions, plus listed versions 0.30.0-10.31.1-1 |
None known |
starletteUbuntu:25.10 |
All versions, plus listed versions 0.46.1-20.46.1-3 |
None known |
starletteUbuntu:26.10 |
All versions, plus listed versions 0.50.0-11.1.0-11.3.1-11.7.0-2 |
None known |
starletteUbuntu:26.04:LTS |
All versions, plus listed versions 0.46.1-30.50.0-1 |
None known |
python-starletteopenSUSE:Tumbleweed |
before 1.3.1-1.1 | 1.3.1-1.1 |
python-starletteopenSUSE:Leap 16.0 From an advisory covering 3 CVEs |
before 0.41.3-160000.4.1 | 0.41.3-160000.4.1 |
History
| Recorded | Changed | Sources |
|---|---|---|
| affected, facts | ||
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-54282 is a low vulnerability (CVSS 3.7) in Encode Starlette, published June 15, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.27%, the 19th percentile. Fixed in starlette 1.3.0.
References
github.com/Kludex/starlette/security/advisories/GHSA-jp82-jpqv-5vv3
nvd.nist.gov/vuln/detail/CVE-2026-54282
github.com/pypa/advisory-database/tree/main/vulns/starlette/PYSEC-2026-248.yaml
github.com/advisories/GHSA-jp82-jpqv-5vv3
github.com/CVEProject/cvelistV5/tree/main/cves/2026/54xxx/CVE-2026-54282.json
security-tracker.debian.org/tracker/CVE-2026-54282
Show 14 moreShow less
github.com/Kludex/starlette
advisories.mageia.org/MGASA-2026-0413.html
bugs.mageia.org/show_bug.cgi?id=36224
lists.debian.org/debian-security-announce/2026/msg00389.html
suse.com/support/update/announcement/2026/suse-su-202622360-1
bugzilla.suse.com/1268389
bugzilla.suse.com/1268517
bugzilla.suse.com/1268520
suse.com/security/cve/CVE-2026-48817
suse.com/security/cve/CVE-2026-54282
suse.com/security/cve/CVE-2026-54283
ubuntu.com/security/CVE-2026-54282
cve.org/CVERecord?id=CVE-2026-54282
github.com/Kludex/starlette/pull/3326
Left out here: 145 versions. The JSON record has them.