id: PYSEC-2026-1941 published: "2026-07-07T16:02:58.086064Z" modified: "2026-07-07T17:25:25.776263Z" aliases: - CVE-2025-54121 - GHSA-2c2j-9gv5-cj73 summary: Starlette has possible denial-of-service vector when parsing large files in multipart forms details: "### Summary\nWhen parsing a multi-part form with large files (greater than the [default max spool size](https://github.com/encode/starlette/blob/fa5355442753f794965ae1af0f87f9fec1b9a3de/starlette/formparsers.py#L126)) `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.\n\n### Details\nPlease see this discussion for details: https://github.com/encode/starlette/discussions/2927#discussioncomment-13721403. In summary the following UploadFile code (copied from [here](https://github.com/encode/starlette/blob/fa5355442753f794965ae1af0f87f9fec1b9a3de/starlette/datastructures.py#L436C5-L447C14)) has a minor bug. Instead of just checking for `self._in_memory` we should also check if the additional bytes will cause a rollover.\n\n```python\n\n @property\n def _in_memory(self) -> bool:\n # check for SpooledTemporaryFile._rolled\n rolled_to_disk = getattr(self.file, \"_rolled\", True)\n return not rolled_to_disk\n\n async def write(self, data: bytes) -> None:\n if self.size is not None:\n self.size += len(data)\n\n if self._in_memory:\n self.file.write(data)\n else:\n await run_in_threadpool(self.file.write, data)\n```\n\nI have already created a PR which fixes the problem: https://github.com/encode/starlette/pull/2962\n\n\n### PoC\nSee the discussion [here](https://github.com/encode/starlette/discussions/2927#discussioncomment-13721403) for steps on how to reproduce.\n\n### Impact\nTo 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." affected: - package: name: starlette ecosystem: PyPI purl: pkg:pypi/starlette ranges: - type: ECOSYSTEM events: - introduced: "0" - fixed: 0.47.2 versions: - 0.1.0 - 0.1.1 - 0.1.10 - 0.1.11 - 0.1.12 - 0.1.13 - 0.1.14 - 0.1.15 - 0.1.16 - 0.1.17 - 0.1.2 - 0.1.3 - 0.1.4 - 0.1.5 - 0.1.6 - 0.1.7 - 0.1.8 - 0.1.9 - 0.10.0 - 0.10.1 - 0.10.2 - 0.10.3 - 0.10.4 - 0.10.5 - 0.10.6 - 0.10.7 - 0.11.0 - 0.11.1 - 0.11.2 - 0.11.3 - 0.11.4 - 0.12.0 - 0.12.0b1 - 0.12.0b2 - 0.12.0b3 - 0.12.1 - 0.12.10 - 0.12.11 - 0.12.12 - 0.12.13 - 0.12.2 - 0.12.3 - 0.12.4 - 0.12.5 - 0.12.6 - 0.12.7 - 0.12.8 - 0.12.9 - 0.13.0 - 0.13.1 - 0.13.2 - 0.13.3 - 0.13.4 - 0.13.5 - 0.13.6 - 0.13.7 - 0.13.8 - 0.14.0 - 0.14.1 - 0.14.2 - 0.15.0 - 0.16.0 - 0.17.0 - 0.17.1 - 0.18.0 - 0.19.0 - 0.19.1 - 0.2.0 - 0.2.1 - 0.2.2 - 0.2.3 - 0.20.0 - 0.20.1 - 0.20.2 - 0.20.3 - 0.20.4 - 0.21.0 - 0.22.0 - 0.23.0 - 0.23.1 - 0.24.0 - 0.25.0 - 0.26.0 - 0.26.0.post1 - 0.26.1 - 0.27.0 - 0.28.0 - 0.29.0 - 0.3.0 - 0.3.1 - 0.3.2 - 0.3.3 - 0.3.4 - 0.3.5 - 0.3.6 - 0.3.7 - 0.30.0 - 0.31.0 - 0.31.1 - 0.32.0 - 0.32.0.post1 - 0.33.0 - 0.34.0 - 0.35.0 - 0.35.1 - 0.36.0 - 0.36.1 - 0.36.2 - 0.36.3 - 0.37.0 - 0.37.1 - 0.37.2 - 0.38.0 - 0.38.1 - 0.38.2 - 0.38.3 - 0.38.4 - 0.38.5 - 0.38.6 - 0.39.0 - 0.39.1 - 0.39.2 - 0.4.0 - 0.4.1 - 0.4.2 - 0.40.0 - 0.41.0 - 0.41.1 - 0.41.2 - 0.41.3 - 0.42.0 - 0.43.0 - 0.44.0 - 0.45.0 - 0.45.1 - 0.45.2 - 0.45.3 - 0.46.0 - 0.46.1 - 0.46.2 - 0.47.0 - 0.47.1 - 0.5.0 - 0.5.1 - 0.5.2 - 0.5.3 - 0.5.4 - 0.5.5 - 0.6.0 - 0.6.1 - 0.6.2 - 0.6.3 - 0.7.0 - 0.7.1 - 0.7.2 - 0.7.3 - 0.7.4 - 0.8.0 - 0.8.1 - 0.8.2 - 0.8.3 - 0.8.4 - 0.8.5 - 0.8.6 - 0.8.7 - 0.8.8 - 0.9.0 - 0.9.1 - 0.9.10 - 0.9.11 - 0.9.2 - 0.9.3 - 0.9.4 - 0.9.5 - 0.9.6 - 0.9.7 - 0.9.8 - 0.9.9 references: - type: WEB url: https://github.com/encode/starlette/security/advisories/GHSA-2c2j-9gv5-cj73 - type: ADVISORY url: https://nvd.nist.gov/vuln/detail/CVE-2025-54121 - type: FIX url: https://github.com/encode/starlette/commit/9f7ec2eb512fcc3fe90b43cb9dd9e1d08696bec1 - type: PACKAGE url: https://github.com/encode/starlette - type: WEB url: "https://github.com/encode/starlette/blob/fa5355442753f794965ae1af0f87f9fec1b9a3de/starlette/datastructures.py#L436C5-L447C14" - type: WEB url: "https://github.com/encode/starlette/discussions/2927#discussioncomment-13721403" - type: PACKAGE url: https://pypi.org/project/starlette - type: ADVISORY url: https://github.com/advisories/GHSA-2c2j-9gv5-cj73 severity: - type: CVSS_V3 score: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L