Every CVE Search/ Get API key

CVE-2026-54282

Starlette: Unvalidated request path concatenated into authority poisons request.url.hostname

3.7 LowFix available

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

0.27%Up 0.2 points since Jun 13, 2026
90%50%10%1%

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 LowCVSS: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 LowCVSS: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 LowCVSS: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 LowCVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:N
CVSS 3.1
5.3 MediumCVSS: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 LowCVSS: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 MediumCVSS: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 LowCVSS: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 MediumCVSS: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 LowCVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:N
CVSS 3.1
5.3 MediumCVSS: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 HTTPEndpoint attributes via getattr (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 HTTPEndpoint attributes via getattr (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

Affected packages
PackageAffectedFixed
starlette
PyPI
before 1.3.0
1.3.0
starlette
TuxCare: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
starlette
TuxCare:PyPI
From an advisory covering 8 CVEs
0.25.0 up to 0.25.0.post1+tuxcare
0.25.0.post1+tuxcare
starlette
TuxCare: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
starlette
Debian:12
before 0.26.1-1+deb12u2, plus listed versions
0.26.1-10.26.1-1+deb12u1
0.26.1-1+deb12u2
starlette
Debian: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
starlette
Debian: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
starlette
PyPI
before 1.3.0, plus listed versions
0.1.00.1.10.1.100.1.110.1.12
Show 45 moreShow less
0.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-starlette
Mageia:10
From an advisory covering 3 CVEs
before 0.46.0-3.2.mga10
0.46.0-3.2.mga10
rootio-starlette
Root: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
Affected packages
PackageAffectedFixed
starlette
Root: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-starlette
SUSE: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-starlette
SUSE: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
starlette
Ubuntu:22.04:LTS
All versions, plus listed versions
0.14.1-10.16.0-10.18.0-1
None known
starlette
Ubuntu:24.04:LTS
All versions, plus listed versions
0.30.0-10.31.1-1
None known
starlette
Ubuntu:25.10
All versions, plus listed versions
0.46.1-20.46.1-3
None known
starlette
Ubuntu:26.10
All versions, plus listed versions
0.50.0-11.1.0-11.3.1-11.7.0-2
None known
starlette
Ubuntu:26.04:LTS
All versions, plus listed versions
0.46.1-30.50.0-1
None known
python-starlette
openSUSE:Tumbleweed
before 1.3.1-1.1
1.3.1-1.1
python-starlette
openSUSE:Leap 16.0
From an advisory covering 3 CVEs
before 0.41.3-160000.4.1
0.41.3-160000.4.1

History

History
RecordedChangedSources
affected, facts
first indexedCVE 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

Show 14 moreShow less
This page doesn't list everything

Left out here: 145 versions. The JSON record has them.

MoveEnter Open