<?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>Fri, 02 Oct 2026 16:25:26 +0000</lastBuildDate>
    <item>
      <title>fkie_cve-2026-61541</title>
      <link>https://vulnerability.circl.lu/vuln/fkie_cve-2026-61541</link>
      <description>&lt;p&gt;Zapros, a Python HTTP client, prior to version 0.14.0 is vulnerable to denial of service when an application requests content from an untrusted server, or follows a redirect to one, because a malicious response containing an excessive number of chained `Content-Encoding` values causes Zapros to construct a deeply nested decompression chain that consumes excessive resources. Version 0.14.0 patches the vulnerability by limiting responses to five content-encoding layers and raising `DecodingError` when that limit is exceeded. As a workaround, applications can add response middleware that inspects the `Content-Encoding` header and rejects responses containing more than a safe number of encoding layers.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Zapros, a Python HTTP client, prior to version 0.14.0 is vulnerable to denial of service when an application requests content from an untrusted server, or follows a redirect to one, because a malicious response containing an excessive number of chained `Content-Encoding` values causes Zapros to construct a deeply nested decompression chain that consumes excessive resources. Version 0.14.0 patches the vulnerability by limiting responses to five content-encoding layers and raising `DecodingError` when that limit is exceeded. As a workaround, applications can add response middleware that inspects the `Content-Encoding` header and rejects responses containing more than a safe number of encoding layers.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/fkie_cve-2026-61541</guid>
    </item>
    <item>
      <title>GHSA-5vjj-2r48-q622 — Zapros has an Unbounded Content-Encoding decompression chain that allows denial of service</title>
      <link>https://vulnerability.circl.lu/vuln/ghsa-5vjj-2r48-q622</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: zapros&lt;/p&gt;
&lt;p&gt;### Impact&lt;/p&gt;
&lt;p&gt;**Who is impacted**:
  - Any application using Zapros to make HTTP requests to untrusted servers
  - Applications that follow redirects to attacker-controlled hosts&lt;/p&gt;
&lt;p&gt;**Attack vector**:
  - A malicious HTTP server returns a response with many chained content encodings. When the client attempts to decode, it creates a deeply nested decompression chain consuming excessive resources.&lt;/p&gt;
&lt;p&gt;### Patches&lt;/p&gt;
&lt;p&gt;Fixed in version 0.14.0.&lt;/p&gt;
&lt;p&gt;The fix adds a hardcoded limit of **5** `Content-Encoding` layers. Responses exceeding this limit raise `DecodingError`.&lt;/p&gt;
&lt;p&gt;### Workarounds&lt;/p&gt;
&lt;p&gt;Add middleware that checks for a malicious Content-Encoding header.&lt;/p&gt;
&lt;p&gt;```python
from typing import cast&lt;/p&gt;
&lt;p&gt;from zapros import (
    AsyncBaseHandler,
    AsyncBaseMiddleware,
    BaseHandler,
    BaseMiddleware,
    Client,
    DecodingError,
    Request,
    Response,
)&lt;/p&gt;
&lt;p&gt;MAX_DECODE_LAYERS = 5&lt;/p&gt;
&lt;p&gt;class ContentEncodingCheckMiddleware(BaseMiddleware, AsyncBaseMiddleware):
    def __init__(
        self,
        next_handler: BaseHandler | AsyncBaseHandler,
        *,
        max_layers: int = MAX_DECODE_LAYERS,
    ) -&amp;gt; None:
        self.next = cast(BaseHandler, next_handler)
        self.async_next = cast(AsyncBaseHandler, next_handler)
        self._max_layers = max_layers&lt;/p&gt;
&lt;p&gt;def _check(self, response: Response) -&amp;gt; None:
        encoding_header = response.headers.get(&amp;#34;Content-Encoding&amp;#34;)
        if not encoding_header:
            return&lt;/p&gt;
&lt;p&gt;layers = [enc.strip().lower() for enc in encoding_header.split(&amp;#34;,&amp;#34;…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: zapros&lt;/p&gt;
&lt;p&gt;### Impact&lt;/p&gt;
&lt;p&gt;**Who is impacted**:
  - Any application using Zapros to make HTTP requests to untrusted servers
  - Applications that follow redirects to attacker-controlled hosts&lt;/p&gt;
&lt;p&gt;**Attack vector**:
  - A malicious HTTP server returns a response with many chained content encodings. When the client attempts to decode, it creates a deeply nested decompression chain consuming excessive resources.&lt;/p&gt;
&lt;p&gt;### Patches&lt;/p&gt;
&lt;p&gt;Fixed in version 0.14.0.&lt;/p&gt;
&lt;p&gt;The fix adds a hardcoded limit of **5** `Content-Encoding` layers. Responses exceeding this limit raise `DecodingError`.&lt;/p&gt;
&lt;p&gt;### Workarounds&lt;/p&gt;
&lt;p&gt;Add middleware that checks for a malicious Content-Encoding header.&lt;/p&gt;
&lt;p&gt;```python
from typing import cast&lt;/p&gt;
&lt;p&gt;from zapros import (
    AsyncBaseHandler,
    AsyncBaseMiddleware,
    BaseHandler,
    BaseMiddleware,
    Client,
    DecodingError,
    Request,
    Response,
)&lt;/p&gt;
&lt;p&gt;MAX_DECODE_LAYERS = 5&lt;/p&gt;
&lt;p&gt;class ContentEncodingCheckMiddleware(BaseMiddleware, AsyncBaseMiddleware):
    def __init__(
        self,
        next_handler: BaseHandler | AsyncBaseHandler,
        *,
        max_layers: int = MAX_DECODE_LAYERS,
    ) -&amp;gt; None:
        self.next = cast(BaseHandler, next_handler)
        self.async_next = cast(AsyncBaseHandler, next_handler)
        self._max_layers = max_layers&lt;/p&gt;
&lt;p&gt;def _check(self, response: Response) -&amp;gt; None:
        encoding_header = response.headers.get(&amp;#34;Content-Encoding&amp;#34;)
        if not encoding_header:
            return&lt;/p&gt;
&lt;p&gt;layers = [enc.strip().lower() for enc in encoding_header.split(&amp;#34;,&amp;#34;…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/ghsa-5vjj-2r48-q622</guid>
    </item>
    <item>
      <title>PYSEC-2026-4181 — Zapros has an Unbounded Content-Encoding decompression chain that allows denial of service</title>
      <link>https://vulnerability.circl.lu/vuln/pysec-2026-4181</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: zapros&lt;/p&gt;
&lt;p&gt;### Impact&lt;/p&gt;
&lt;p&gt;**Who is impacted**:
  - Any application using Zapros to make HTTP requests to untrusted servers
  - Applications that follow redirects to attacker-controlled hosts&lt;/p&gt;
&lt;p&gt;**Attack vector**:
  - A malicious HTTP server returns a response with many chained content encodings. When the client attempts to decode, it creates a deeply nested decompression chain consuming excessive resources.&lt;/p&gt;
&lt;p&gt;### Patches&lt;/p&gt;
&lt;p&gt;Fixed in version 0.14.0.&lt;/p&gt;
&lt;p&gt;The fix adds a hardcoded limit of **5** `Content-Encoding` layers. Responses exceeding this limit raise `DecodingError`.&lt;/p&gt;
&lt;p&gt;### Workarounds&lt;/p&gt;
&lt;p&gt;Add middleware that checks for a malicious Content-Encoding header.&lt;/p&gt;
&lt;p&gt;```python
from typing import cast&lt;/p&gt;
&lt;p&gt;from zapros import (
    AsyncBaseHandler,
    AsyncBaseMiddleware,
    BaseHandler,
    BaseMiddleware,
    Client,
    DecodingError,
    Request,
    Response,
)&lt;/p&gt;
&lt;p&gt;MAX_DECODE_LAYERS = 5&lt;/p&gt;
&lt;p&gt;class ContentEncodingCheckMiddleware(BaseMiddleware, AsyncBaseMiddleware):
    def __init__(
        self,
        next_handler: BaseHandler | AsyncBaseHandler,
        *,
        max_layers: int = MAX_DECODE_LAYERS,
    ) -&amp;gt; None:
        self.next = cast(BaseHandler, next_handler)
        self.async_next = cast(AsyncBaseHandler, next_handler)
        self._max_layers = max_layers&lt;/p&gt;
&lt;p&gt;def _check(self, response: Response) -&amp;gt; None:
        encoding_header = response.headers.get(&amp;#34;Content-Encoding&amp;#34;)
        if not encoding_header:
            return&lt;/p&gt;
&lt;p&gt;layers = [enc.strip().lower() for enc in encoding_header.split(&amp;#34;,&amp;#34;…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: zapros&lt;/p&gt;
&lt;p&gt;### Impact&lt;/p&gt;
&lt;p&gt;**Who is impacted**:
  - Any application using Zapros to make HTTP requests to untrusted servers
  - Applications that follow redirects to attacker-controlled hosts&lt;/p&gt;
&lt;p&gt;**Attack vector**:
  - A malicious HTTP server returns a response with many chained content encodings. When the client attempts to decode, it creates a deeply nested decompression chain consuming excessive resources.&lt;/p&gt;
&lt;p&gt;### Patches&lt;/p&gt;
&lt;p&gt;Fixed in version 0.14.0.&lt;/p&gt;
&lt;p&gt;The fix adds a hardcoded limit of **5** `Content-Encoding` layers. Responses exceeding this limit raise `DecodingError`.&lt;/p&gt;
&lt;p&gt;### Workarounds&lt;/p&gt;
&lt;p&gt;Add middleware that checks for a malicious Content-Encoding header.&lt;/p&gt;
&lt;p&gt;```python
from typing import cast&lt;/p&gt;
&lt;p&gt;from zapros import (
    AsyncBaseHandler,
    AsyncBaseMiddleware,
    BaseHandler,
    BaseMiddleware,
    Client,
    DecodingError,
    Request,
    Response,
)&lt;/p&gt;
&lt;p&gt;MAX_DECODE_LAYERS = 5&lt;/p&gt;
&lt;p&gt;class ContentEncodingCheckMiddleware(BaseMiddleware, AsyncBaseMiddleware):
    def __init__(
        self,
        next_handler: BaseHandler | AsyncBaseHandler,
        *,
        max_layers: int = MAX_DECODE_LAYERS,
    ) -&amp;gt; None:
        self.next = cast(BaseHandler, next_handler)
        self.async_next = cast(AsyncBaseHandler, next_handler)
        self._max_layers = max_layers&lt;/p&gt;
&lt;p&gt;def _check(self, response: Response) -&amp;gt; None:
        encoding_header = response.headers.get(&amp;#34;Content-Encoding&amp;#34;)
        if not encoding_header:
            return&lt;/p&gt;
&lt;p&gt;layers = [enc.strip().lower() for enc in encoding_header.split(&amp;#34;,&amp;#34;…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/pysec-2026-4181</guid>
    </item>
  </channel>
</rss>
