<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet href="/static/style.xsl" type="text/xsl"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
  <channel>
    <title>Most recent entries from all</title>
    <link>https://vulnerability.circl.lu</link>
    <description>Contains only the most 10 recent entries.</description>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>python-feedgen</generator>
    <language>en</language>
    <lastBuildDate>Wed, 30 Sep 2026 15:30:10 +0000</lastBuildDate>
    <item>
      <title>CVE-2025-54121 — Starlette has possible denial-of-service vector when parsing large files in multipart forms</title>
      <link>https://vulnerability.circl.lu/vuln/cve-2025-54121</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; encode starlette&lt;/p&gt;
&lt;p&gt;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&amp;#39;t accept new connections. The UploadFile code has a minor bug where instead of just checking for self._in_memory, the logic should also check if the additional bytes will cause a rollover. The vulnerability is fixed in version 0.47.2.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; encode starlette&lt;/p&gt;
&lt;p&gt;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&amp;#39;t accept new connections. The UploadFile code has a minor bug where instead of just checking for self._in_memory, the logic should also check if the additional bytes will cause a rollover. The vulnerability is fixed in version 0.47.2.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/cve-2025-54121</guid>
    </item>
    <item>
      <title>GHSA-2c2j-9gv5-cj73 — Starlette has possible denial-of-service vector when parsing large files in multipart forms</title>
      <link>https://vulnerability.circl.lu/vuln/ghsa-2c2j-9gv5-cj73</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: starlette&lt;/p&gt;
&lt;p&gt;### Summary
When 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&amp;#39;t accept new connections.&lt;/p&gt;
&lt;p&gt;### 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](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.&lt;/p&gt;
&lt;p&gt;```python&lt;/p&gt;
&lt;p&gt;@property
    def _in_memory(self) -&amp;gt; bool:
        # check for SpooledTemporaryFile._rolled
        rolled_to_disk = getattr(self.file, &amp;#34;_rolled&amp;#34;, True)
        return not rolled_to_disk&lt;/p&gt;
&lt;p&gt;async def write(self, data: bytes) -&amp;gt; None:
        if self.size is not None:
            self.size += len(data)&lt;/p&gt;
&lt;p&gt;if self._in_memory:
            self.file.write(data)
        else:
            await run_in_threadpool(self.file.write, data)
```&lt;/p&gt;
&lt;p&gt;I have already created a PR which fixes the problem: https://github.com/encode/starlette/pull/2962&lt;/p&gt;
&lt;p&gt;### PoC
See the discussion [here](https://github.com/encode/starlette/discussions/2927#discussioncomment-13721403) for s…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: starlette&lt;/p&gt;
&lt;p&gt;### Summary
When 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&amp;#39;t accept new connections.&lt;/p&gt;
&lt;p&gt;### 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](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.&lt;/p&gt;
&lt;p&gt;```python&lt;/p&gt;
&lt;p&gt;@property
    def _in_memory(self) -&amp;gt; bool:
        # check for SpooledTemporaryFile._rolled
        rolled_to_disk = getattr(self.file, &amp;#34;_rolled&amp;#34;, True)
        return not rolled_to_disk&lt;/p&gt;
&lt;p&gt;async def write(self, data: bytes) -&amp;gt; None:
        if self.size is not None:
            self.size += len(data)&lt;/p&gt;
&lt;p&gt;if self._in_memory:
            self.file.write(data)
        else:
            await run_in_threadpool(self.file.write, data)
```&lt;/p&gt;
&lt;p&gt;I have already created a PR which fixes the problem: https://github.com/encode/starlette/pull/2962&lt;/p&gt;
&lt;p&gt;### PoC
See the discussion [here](https://github.com/encode/starlette/discussions/2927#discussioncomment-13721403) for s…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/ghsa-2c2j-9gv5-cj73</guid>
    </item>
    <item>
      <title>PYSEC-2026-1941 — Starlette has possible denial-of-service vector when parsing large files in multipart forms</title>
      <link>https://vulnerability.circl.lu/vuln/pysec-2026-1941</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: starlette&lt;/p&gt;
&lt;p&gt;### Summary
When 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&amp;#39;t accept new connections.&lt;/p&gt;
&lt;p&gt;### 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](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.&lt;/p&gt;
&lt;p&gt;```python&lt;/p&gt;
&lt;p&gt;@property
    def _in_memory(self) -&amp;gt; bool:
        # check for SpooledTemporaryFile._rolled
        rolled_to_disk = getattr(self.file, &amp;#34;_rolled&amp;#34;, True)
        return not rolled_to_disk&lt;/p&gt;
&lt;p&gt;async def write(self, data: bytes) -&amp;gt; None:
        if self.size is not None:
            self.size += len(data)&lt;/p&gt;
&lt;p&gt;if self._in_memory:
            self.file.write(data)
        else:
            await run_in_threadpool(self.file.write, data)
```&lt;/p&gt;
&lt;p&gt;I have already created a PR which fixes the problem: https://github.com/encode/starlette/pull/2962&lt;/p&gt;
&lt;p&gt;### PoC
See the discussion [here](https://github.com/encode/starlette/discussions/2927#discussioncomment-13721403) for s…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: starlette&lt;/p&gt;
&lt;p&gt;### Summary
When 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&amp;#39;t accept new connections.&lt;/p&gt;
&lt;p&gt;### 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](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.&lt;/p&gt;
&lt;p&gt;```python&lt;/p&gt;
&lt;p&gt;@property
    def _in_memory(self) -&amp;gt; bool:
        # check for SpooledTemporaryFile._rolled
        rolled_to_disk = getattr(self.file, &amp;#34;_rolled&amp;#34;, True)
        return not rolled_to_disk&lt;/p&gt;
&lt;p&gt;async def write(self, data: bytes) -&amp;gt; None:
        if self.size is not None:
            self.size += len(data)&lt;/p&gt;
&lt;p&gt;if self._in_memory:
            self.file.write(data)
        else:
            await run_in_threadpool(self.file.write, data)
```&lt;/p&gt;
&lt;p&gt;I have already created a PR which fixes the problem: https://github.com/encode/starlette/pull/2962&lt;/p&gt;
&lt;p&gt;### PoC
See the discussion [here](https://github.com/encode/starlette/discussions/2927#discussioncomment-13721403) for s…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/pysec-2026-1941</guid>
    </item>
  </channel>
</rss>
