CVE-2025-54121: Starlette has possible denial-of-service vector when parsing large files in multipart forms

Published Jul 21, 2025
·
Updated

Summary When parsing a multi-part form with large files (greater than the default max spool size) starlette will block the main thread to roll the file over to disk. This blocks the event thread which means we can't accept new connections.

Details Please see this discussion for details: https://github.com/encode/starlette/discussions/2927#discussioncomment-13721403. In summary the following UploadFile code (copied from here) has a minor bug. Instead of just checking for self.inmemory we should also check if the additional bytes will cause a rollover.

python

@property def inmemory(self) -> bool: # check for SpooledTemporaryFile.rolled rolledtodisk = getattr(self.file, "rolled", True) return not rolledtodisk

async def write(self, data: bytes) -> None: if self.size is not None: self.size += len(data)

if self.inmemory: self.file.write(data) else: await runinthreadpool(self.file.write, data)

I have already created a PR which fixes the problem: https://github.com/encode/starlette/pull/2962

PoC See the discussion here for steps on how to reproduce.

Impact To be honest, very low and not many users will be impacted. Parsing large forms is already CPU intensive so the additional IO block doesn't slow down starlette that much on systems with modern HDDs/SSDs. If someone is running on tape they might see a greater impact.

Other sources

Starlette is a lightweight ASGI (Asynchronous Server Gateway Interface) framework/toolkit, designed for building async web services in Python. In versions 0.47.1 and below, when parsing a multi-part form with large files (greater than the default max spool size) starlette will block the main thread to roll the file over to disk. This blocks the event thread which means the application can't accept new connections. The UploadFile code has a minor bug where instead of just checking for self.inmemory, the logic should also check if the additional bytes will cause a rollover. The vulnerability is fixed in version 0.47.2.

MITRE

Affected Software

2 affected componentsFixes available
pip/starlette<0.47.2
0.47.2
IBM Concert Software<=1.0.0-2.1.0

Event History

Jul 21, 2025
Advisory Published
via GitHub·07:34 PM
Data Sourced
via GitHub·07:34 PM
DescriptionSeverityWeaknessAffected Software
CVE Published
via MITRE·08:06 PM
Data Sourced
via MITRE·08:06 PM
DescriptionSeverityWeakness
Data Sourced
via NVD·08:15 PM
DescriptionSeverityWeakness
Jan 21, 2026
Data Sourced
via IBM·12:00 AM
DescriptionAffected Software

Parent advisories

This vulnerability appears in the following advisories.

Free Weekly Intel

Don't miss critical vulnerabilities

Join thousands of security professionals who receive our weekly digest of trending CVEs, zero-days, and exploited vulnerabilities.

No spam. Unsubscribe anytime.

Frequently Asked Questions

1

What is the severity of CVE-2025-54121?

CVE-2025-54121 is classified as a medium severity vulnerability.

2

How does CVE-2025-54121 affect the starlette package?

CVE-2025-54121 affects the starlette package by causing the main thread to block when parsing large multi-part form files.

3

How do I fix CVE-2025-54121?

To fix CVE-2025-54121, you should upgrade to a version of starlette greater than 0.47.2.

4

What versions of starlette are affected by CVE-2025-54121?

CVE-2025-54121 affects starlette version up to and including 0.47.2.

5

Is my application vulnerable if I use starlette version 0.47.2?

Yes, if you are using starlette version 0.47.2, your application is vulnerable to CVE-2025-54121.

Contact

SecAlerts Pty Ltd.
132 Wickham Terrace
Fortitude Valley,
QLD 4006, Australia
info@secalerts.co
By using SecAlerts services, you agree to our services end-user license agreement. This website is safeguarded by reCAPTCHA and governed by the Google Privacy Policy and Terms of Service. All names, logos, and brands of products are owned by their respective owners, and any usage of these names, logos, and brands for identification purposes only does not imply endorsement. If you possess any content that requires removal, please get in touch with us.
© 2026 SecAlerts Pty Ltd.
ABN: 70 645 966 203, ACN: 645 966 203