CVE-2025-54121: Starlette has possible denial-of-service vector when parsing large files in multipart forms
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
Event History
Frequently Asked Questions
What is the severity of CVE-2025-54121?
CVE-2025-54121 is classified as a medium severity vulnerability.
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.
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.
What versions of starlette are affected by CVE-2025-54121?
CVE-2025-54121 affects starlette version up to and including 0.47.2.
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.