Skip to content
Heist/ feed
UnratedFix available

Zapros has an Unbounded Content-Encoding decompression chain that allows denial of service

Type: advisorySource: OSV2 source records

### Impact **Who is impacted**: - Any application using Zapros to make HTTP requests to untrusted servers - Applications that follow redirects to attacker-controlled hosts **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. ### Patches Fixed in version 0.14.0. The fix adds a hardcoded limit of **5** `Content-Encoding` layers. Responses exceeding this limit raise `DecodingError`. ### Workarounds Add middleware that checks for a malicious Content-Encoding header. ```python from typing import cast from zapros import ( AsyncBaseHandler, AsyncBaseMiddleware, BaseHandler, BaseMiddleware, Client, DecodingError, Request, Response, ) MAX_DECODE_LAYERS = 5 class ContentEncodingCheckMiddleware(BaseMiddleware, AsyncBaseMiddleware): def __init__( self, next_handler: BaseHandler | AsyncBaseHandler, *, max_layers: int = MAX_DECODE_LAYERS, ) -> None: self.next = cast(BaseHandler, next_handler) self.async_next = cast(AsyncBaseHandler, next_handler) self._max_layers = max_layers def _check(self, response: Response) -> None: encoding_header = response.headers.get("Content-Encoding") if not encoding_header: return layers = [enc.strip().lower() for enc in encoding_header.split(",") if enc.strip()] if len(layers) > self._max_layers: raise DecodingError(f"Too many Content-Encoding layers ({len(layers)}), maximum is {self._max_layers}") de

Announced Group revision 1
Original source ↗

PYSEC-2026-4181

Revision 1

Zapros has an Unbounded Content-Encoding decompression chain that allows denial of service

### Impact **Who is impacted**: - Any application using Zapros to make HTTP requests to untrusted servers - Applications that follow redirects to attacker-controlled hosts **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. ### Patches Fixed in version 0.14.0. The fix adds a hardcoded limit of **5** `Content-Encoding` layers. Responses exceeding this limit raise `DecodingError`. ### Workarounds Add middleware that checks for a malicious Content-Encoding header. ```python from typing import cast from zapros import ( AsyncBaseHandler, AsyncBaseMiddleware, BaseHandler, BaseMiddleware, Client, DecodingError, Request, Response, ) MAX_DECODE_LAYERS = 5 class ContentEncodingCheckMiddleware(BaseMiddleware, AsyncBaseMiddleware): def __init__( self, next_handler: BaseHandler | AsyncBaseHandler, *, max_layers: int = MAX_DECODE_LAYERS, ) -> None: self.next = cast(BaseHandler, next_handler) self.async_next = cast(AsyncBaseHandler, next_handler) self._max_layers = max_layers def _check(self, response: Response) -> None: encoding_header = response.headers.get("Content-Encoding") if not encoding_header: return layers = [enc.strip().lower() for enc in encoding_header.split(",") if enc.strip()] if len(layers) > self._max_layers: raise DecodingError(f"Too many Content-Encoding layers ({len(layers)}), maximum is {self._max_layers}") de

Imported from structured advisory data. Source references identify upstream records or fields; verify affected versions and your deployed configuration.

Security context

Source reference: osv:PYSEC-2026-4181

zapros

Source reference: /affected/0/package/name

Affected versions
0.10.0

Source reference: /affected/0/versions

0.11.0

Source reference: /affected/0/versions

0.11.1

Source reference: /affected/0/versions

0.12.0

Source reference: /affected/0/versions

0.13.0

Source reference: /affected/0/versions

0.2.0

Source reference: /affected/0/versions

0.2.1

Source reference: /affected/0/versions

0.2.2

Source reference: /affected/0/versions

0.2.3

Source reference: /affected/0/versions

0.3.0

Source reference: /affected/0/versions

0.4.0

Source reference: /affected/0/versions

0.5.0

Source reference: /affected/0/versions

0.5.1

Source reference: /affected/0/versions

0.6.0

Source reference: /affected/0/versions

0.7.0

Source reference: /affected/0/versions

0.8.0

Source reference: /affected/0/versions

0.9.0

Source reference: /affected/0/versions

Fixed versions
0.14.0

Source reference: /affected/0/ranges

Prerequisites
Not stated in this record

Structured affected-version data

Original package identities and version rules from this source.

[
  {
    "ranges": [
      {
        "type": "ECOSYSTEM",
        "events": [
          {
            "introduced": "0"
          },
          {
            "fixed": "0.14.0"
          }
        ]
      }
    ],
    "package": {
      "name": "zapros",
      "purl": "pkg:pypi/zapros",
      "ecosystem": "PyPI"
    },
    "versions": [
      "0.10.0",
      "0.11.0",
      "0.11.1",
      "0.12.0",
      "0.13.0",
      "0.2.0",
      "0.2.1",
      "0.2.2",
      "0.2.3",
      "0.3.0",
      "0.4.0",
      "0.5.0",
      "0.5.1",
      "0.6.0",
      "0.7.0",
      "0.8.0",
      "0.9.0"
    ],
    "database_specific": {
      "source": "https://github.com/pypa/advisory-database/blob/main/vulns/zapros/PYSEC-2026-4181.yaml"
    }
  }
]
Related CVEs
CVE-2026-61541

Source reference: /aliases

Publisher severity

No explicit severity was provided.

Event
#62520 · Revision 1
Added to Heist Feed
Publisher date
Read the original announcement

GHSA-5vjj-2r48-q622

Primary source · Revision 1

Imported from structured advisory data. Source references identify upstream records or fields; verify affected versions and your deployed configuration.

Security context

Source reference: osv:GHSA-5vjj-2r48-q622

zapros

Source reference: /affected/0/package/name

Affected versions
0.10.0

Source reference: /affected/0/versions

0.11.0

Source reference: /affected/0/versions

0.11.1

Source reference: /affected/0/versions

0.12.0

Source reference: /affected/0/versions

0.13.0

Source reference: /affected/0/versions

0.2.0

Source reference: /affected/0/versions

0.2.1

Source reference: /affected/0/versions

0.2.2

Source reference: /affected/0/versions

0.2.3

Source reference: /affected/0/versions

0.3.0

Source reference: /affected/0/versions

0.4.0

Source reference: /affected/0/versions

0.5.0

Source reference: /affected/0/versions

0.5.1

Source reference: /affected/0/versions

0.6.0

Source reference: /affected/0/versions

0.7.0

Source reference: /affected/0/versions

0.8.0

Source reference: /affected/0/versions

0.9.0

Source reference: /affected/0/versions

Fixed versions
0.14.0

Source reference: /affected/0/ranges

Prerequisites
Not stated in this record

Structured affected-version data

Original package identities and version rules from this source.

[
  {
    "ranges": [
      {
        "type": "ECOSYSTEM",
        "events": [
          {
            "introduced": "0"
          },
          {
            "fixed": "0.14.0"
          }
        ]
      }
    ],
    "package": {
      "name": "zapros",
      "purl": "pkg:pypi/zapros",
      "ecosystem": "PyPI"
    },
    "versions": [
      "0.10.0",
      "0.11.0",
      "0.11.1",
      "0.12.0",
      "0.13.0",
      "0.2.0",
      "0.2.1",
      "0.2.2",
      "0.2.3",
      "0.3.0",
      "0.4.0",
      "0.5.0",
      "0.5.1",
      "0.6.0",
      "0.7.0",
      "0.8.0",
      "0.9.0"
    ],
    "database_specific": {
      "source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/09/GHSA-5vjj-2r48-q622/GHSA-5vjj-2r48-q622.json"
    }
  }
]
Related CVEs
CVE-2026-61541

Source reference: /aliases

Publisher severity

No explicit severity was provided.

Event
#62602 · Revision 1
Added to Heist Feed
Publisher date
Read the original announcement