<?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 12:31:25 +0000</lastBuildDate>
    <item>
      <title>CVE-2025-62727 — Starlette vulnerable to O(n^2) DoS via Range header merging in starlette.responses.FileResponse</title>
      <link>https://vulnerability.circl.lu/vuln/cve-2025-62727</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Kludex starlette&lt;/p&gt;
&lt;p&gt;Starlette is a lightweight ASGI framework/toolkit. Starting in version 0.39.0 and prior to version 0.49.1 , an unauthenticated attacker can send a crafted HTTP Range header that triggers quadratic-time processing in Starlette&amp;#39;s FileResponse Range parsing/merging logic. This enables CPU exhaustion per request, causing denial‑of‑service for endpoints serving files (e.g., StaticFiles or any use of FileResponse). This vulnerability is fixed in 0.49.1.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Kludex starlette&lt;/p&gt;
&lt;p&gt;Starlette is a lightweight ASGI framework/toolkit. Starting in version 0.39.0 and prior to version 0.49.1 , an unauthenticated attacker can send a crafted HTTP Range header that triggers quadratic-time processing in Starlette&amp;#39;s FileResponse Range parsing/merging logic. This enables CPU exhaustion per request, causing denial‑of‑service for endpoints serving files (e.g., StaticFiles or any use of FileResponse). This vulnerability is fixed in 0.49.1.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/cve-2025-62727</guid>
    </item>
    <item>
      <title>GHSA-7f5h-v6xp-fcq8 — Starlette vulnerable to O(n^2) DoS via Range header merging in ``starlette.responses.FileResponse``</title>
      <link>https://vulnerability.circl.lu/vuln/ghsa-7f5h-v6xp-fcq8</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: starlette&lt;/p&gt;
&lt;p&gt;### Summary
An unauthenticated attacker can send a crafted HTTP Range header that triggers quadratic-time processing in Starlette&amp;#39;s `FileResponse` Range parsing/merging logic. This enables CPU exhaustion per request, causing denial‑of‑service for endpoints serving files (e.g., `StaticFiles` or any use of `FileResponse`).&lt;/p&gt;
&lt;p&gt;### Details
Starlette parses multi-range requests in ``FileResponse._parse_range_header()``, then merges ranges using an O(n^2) algorithm.&lt;/p&gt;
&lt;p&gt;```python
# starlette/responses.py
_RANGE_PATTERN = re.compile(r&amp;#34;(\d*)-(\d*)&amp;#34;) # vulnerable to O(n^2) complexity ReDoS&lt;/p&gt;
&lt;p&gt;class FileResponse(Response):
    @staticmethod
    def _parse_range_header(http_range: str, file_size: int) -&amp;gt; list[tuple[int, int]]:
        ranges: list[tuple[int, int]] = []
        try:
            units, range_ = http_range.split(&amp;#34;=&amp;#34;, 1)
        except ValueError:
            raise MalformedRangeHeader()&lt;/p&gt;
&lt;p&gt;# [...]&lt;/p&gt;
&lt;p&gt;ranges = [
            (
                int(_[0]) if _[0] else file_size - int(_[1]),
                int(_[1]) + 1 if _[0] and _[1] and int(_[1]) &amp;lt; file_size else file_size,
            )
            for _ in _RANGE_PATTERN.findall(range_) # vulnerable
            if _ != (&amp;#34;&amp;#34;, &amp;#34;&amp;#34;)
        ]&lt;/p&gt;
&lt;p&gt;```&lt;/p&gt;
&lt;p&gt;The parsing loop of ``FileResponse._parse_range_header()`` uses the regular expression which vulnerable to denial of service for its O(n^2) complexity. A crafted `Range` header can maximize its complexity.&lt;/p&gt;
&lt;p&gt;The merge loop processes each input range by scanning the entire resul…&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
An unauthenticated attacker can send a crafted HTTP Range header that triggers quadratic-time processing in Starlette&amp;#39;s `FileResponse` Range parsing/merging logic. This enables CPU exhaustion per request, causing denial‑of‑service for endpoints serving files (e.g., `StaticFiles` or any use of `FileResponse`).&lt;/p&gt;
&lt;p&gt;### Details
Starlette parses multi-range requests in ``FileResponse._parse_range_header()``, then merges ranges using an O(n^2) algorithm.&lt;/p&gt;
&lt;p&gt;```python
# starlette/responses.py
_RANGE_PATTERN = re.compile(r&amp;#34;(\d*)-(\d*)&amp;#34;) # vulnerable to O(n^2) complexity ReDoS&lt;/p&gt;
&lt;p&gt;class FileResponse(Response):
    @staticmethod
    def _parse_range_header(http_range: str, file_size: int) -&amp;gt; list[tuple[int, int]]:
        ranges: list[tuple[int, int]] = []
        try:
            units, range_ = http_range.split(&amp;#34;=&amp;#34;, 1)
        except ValueError:
            raise MalformedRangeHeader()&lt;/p&gt;
&lt;p&gt;# [...]&lt;/p&gt;
&lt;p&gt;ranges = [
            (
                int(_[0]) if _[0] else file_size - int(_[1]),
                int(_[1]) + 1 if _[0] and _[1] and int(_[1]) &amp;lt; file_size else file_size,
            )
            for _ in _RANGE_PATTERN.findall(range_) # vulnerable
            if _ != (&amp;#34;&amp;#34;, &amp;#34;&amp;#34;)
        ]&lt;/p&gt;
&lt;p&gt;```&lt;/p&gt;
&lt;p&gt;The parsing loop of ``FileResponse._parse_range_header()`` uses the regular expression which vulnerable to denial of service for its O(n^2) complexity. A crafted `Range` header can maximize its complexity.&lt;/p&gt;
&lt;p&gt;The merge loop processes each input range by scanning the entire resul…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/ghsa-7f5h-v6xp-fcq8</guid>
    </item>
    <item>
      <title>PYSEC-2026-1942 — Starlette vulnerable to O(n^2) DoS via Range header merging in ``starlette.responses.FileResponse``</title>
      <link>https://vulnerability.circl.lu/vuln/pysec-2026-1942</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: starlette&lt;/p&gt;
&lt;p&gt;### Summary
An unauthenticated attacker can send a crafted HTTP Range header that triggers quadratic-time processing in Starlette&amp;#39;s `FileResponse` Range parsing/merging logic. This enables CPU exhaustion per request, causing denial‑of‑service for endpoints serving files (e.g., `StaticFiles` or any use of `FileResponse`).&lt;/p&gt;
&lt;p&gt;### Details
Starlette parses multi-range requests in ``FileResponse._parse_range_header()``, then merges ranges using an O(n^2) algorithm.&lt;/p&gt;
&lt;p&gt;```python
# starlette/responses.py
_RANGE_PATTERN = re.compile(r&amp;#34;(\d*)-(\d*)&amp;#34;) # vulnerable to O(n^2) complexity ReDoS&lt;/p&gt;
&lt;p&gt;class FileResponse(Response):
    @staticmethod
    def _parse_range_header(http_range: str, file_size: int) -&amp;gt; list[tuple[int, int]]:
        ranges: list[tuple[int, int]] = []
        try:
            units, range_ = http_range.split(&amp;#34;=&amp;#34;, 1)
        except ValueError:
            raise MalformedRangeHeader()&lt;/p&gt;
&lt;p&gt;# [...]&lt;/p&gt;
&lt;p&gt;ranges = [
            (
                int(_[0]) if _[0] else file_size - int(_[1]),
                int(_[1]) + 1 if _[0] and _[1] and int(_[1]) &amp;lt; file_size else file_size,
            )
            for _ in _RANGE_PATTERN.findall(range_) # vulnerable
            if _ != (&amp;#34;&amp;#34;, &amp;#34;&amp;#34;)
        ]&lt;/p&gt;
&lt;p&gt;```&lt;/p&gt;
&lt;p&gt;The parsing loop of ``FileResponse._parse_range_header()`` uses the regular expression which vulnerable to denial of service for its O(n^2) complexity. A crafted `Range` header can maximize its complexity.&lt;/p&gt;
&lt;p&gt;The merge loop processes each input range by scanning the entire resul…&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
An unauthenticated attacker can send a crafted HTTP Range header that triggers quadratic-time processing in Starlette&amp;#39;s `FileResponse` Range parsing/merging logic. This enables CPU exhaustion per request, causing denial‑of‑service for endpoints serving files (e.g., `StaticFiles` or any use of `FileResponse`).&lt;/p&gt;
&lt;p&gt;### Details
Starlette parses multi-range requests in ``FileResponse._parse_range_header()``, then merges ranges using an O(n^2) algorithm.&lt;/p&gt;
&lt;p&gt;```python
# starlette/responses.py
_RANGE_PATTERN = re.compile(r&amp;#34;(\d*)-(\d*)&amp;#34;) # vulnerable to O(n^2) complexity ReDoS&lt;/p&gt;
&lt;p&gt;class FileResponse(Response):
    @staticmethod
    def _parse_range_header(http_range: str, file_size: int) -&amp;gt; list[tuple[int, int]]:
        ranges: list[tuple[int, int]] = []
        try:
            units, range_ = http_range.split(&amp;#34;=&amp;#34;, 1)
        except ValueError:
            raise MalformedRangeHeader()&lt;/p&gt;
&lt;p&gt;# [...]&lt;/p&gt;
&lt;p&gt;ranges = [
            (
                int(_[0]) if _[0] else file_size - int(_[1]),
                int(_[1]) + 1 if _[0] and _[1] and int(_[1]) &amp;lt; file_size else file_size,
            )
            for _ in _RANGE_PATTERN.findall(range_) # vulnerable
            if _ != (&amp;#34;&amp;#34;, &amp;#34;&amp;#34;)
        ]&lt;/p&gt;
&lt;p&gt;```&lt;/p&gt;
&lt;p&gt;The parsing loop of ``FileResponse._parse_range_header()`` uses the regular expression which vulnerable to denial of service for its O(n^2) complexity. A crafted `Range` header can maximize its complexity.&lt;/p&gt;
&lt;p&gt;The merge loop processes each input range by scanning the entire resul…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/pysec-2026-1942</guid>
    </item>
  </channel>
</rss>
