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
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/versions0.11.0Source reference:
/affected/0/versions0.11.1Source reference:
/affected/0/versions0.12.0Source reference:
/affected/0/versions0.13.0Source reference:
/affected/0/versions0.2.0Source reference:
/affected/0/versions0.2.1Source reference:
/affected/0/versions0.2.2Source reference:
/affected/0/versions0.2.3Source reference:
/affected/0/versions0.3.0Source reference:
/affected/0/versions0.4.0Source reference:
/affected/0/versions0.5.0Source reference:
/affected/0/versions0.5.1Source reference:
/affected/0/versions0.6.0Source reference:
/affected/0/versions0.7.0Source reference:
/affected/0/versions0.8.0Source reference:
/affected/0/versions0.9.0Source 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
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/versions0.11.0Source reference:
/affected/0/versions0.11.1Source reference:
/affected/0/versions0.12.0Source reference:
/affected/0/versions0.13.0Source reference:
/affected/0/versions0.2.0Source reference:
/affected/0/versions0.2.1Source reference:
/affected/0/versions0.2.2Source reference:
/affected/0/versions0.2.3Source reference:
/affected/0/versions0.3.0Source reference:
/affected/0/versions0.4.0Source reference:
/affected/0/versions0.5.0Source reference:
/affected/0/versions0.5.1Source reference:
/affected/0/versions0.6.0Source reference:
/affected/0/versions0.7.0Source reference:
/affected/0/versions0.8.0Source reference:
/affected/0/versions0.9.0Source 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