<?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>Sat, 10 Oct 2026 20:07:34 +0000</lastBuildDate>
    <item>
      <title>GHSA-rgwj-5xj2-c3m3 — MySQL2: Unbounded zlib inflate in compressed MySQL protocol handler allows decompression-bomb DoS</title>
      <link>https://vulnerability.circl.lu/vuln/ghsa-rgwj-5xj2-c3m3</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; npm: mysql2&lt;/p&gt;
&lt;p&gt;## Vulnerability Details&lt;/p&gt;
&lt;p&gt;**File**: `lib/compressed_protocol.js`
**Line**: 43 (`zlib.inflate(body, (err, data) =&amp;gt; { ... })` inside `handleCompressedPacket`)&lt;/p&gt;
&lt;p&gt;### Root Cause
When a connection is created with `compress: true` (and the server advertises `CLIENT_COMPRESS`), every incoming packet is unwrapped by `handleCompressedPacket()` in `lib/compressed_protocol.js`, which calls:&lt;/p&gt;
&lt;p&gt;```js
zlib.inflate(body, (err, data) =&amp;gt; { ... });
```&lt;/p&gt;
&lt;p&gt;No options object (in particular, no `maxOutputLength`) is passed. Node&amp;#39;s zlib convenience methods default `maxOutputLength` to `buffer.kMaxLength`, which on this platform is `Number.MAX_SAFE_INTEGER` — i.e. effectively unbounded until the process runs out of memory. The 3-byte &amp;#34;length of payload before compression&amp;#34; field in the compressed-packet header is read (`packet.readInt24()`) but is only used to branch on `!== 0`; it is never used to cap or validate the actual inflate output size, and the real decompressed size is determined purely by the attacker-supplied deflate stream.&lt;/p&gt;
&lt;p&gt;Because DEFLATE can reach compression ratios over 1000:1 for crafted repetitive input, an attacker who controls (or MITMs, on a non-TLS connection) the MySQL server endpoint can send a single small compressed packet that expands to gigabytes in the client&amp;#39;s memory — a classic decompression-bomb / &amp;#34;zip bomb&amp;#34; applied to MySQL&amp;#39;s client-compression protocol.&lt;/p&gt;
&lt;p&gt;### Attack Scenario
1. Application connects with `mysql2`/`mysql2/promise` using `compress: true` (a documented opt…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; npm: mysql2&lt;/p&gt;
&lt;p&gt;## Vulnerability Details&lt;/p&gt;
&lt;p&gt;**File**: `lib/compressed_protocol.js`
**Line**: 43 (`zlib.inflate(body, (err, data) =&amp;gt; { ... })` inside `handleCompressedPacket`)&lt;/p&gt;
&lt;p&gt;### Root Cause
When a connection is created with `compress: true` (and the server advertises `CLIENT_COMPRESS`), every incoming packet is unwrapped by `handleCompressedPacket()` in `lib/compressed_protocol.js`, which calls:&lt;/p&gt;
&lt;p&gt;```js
zlib.inflate(body, (err, data) =&amp;gt; { ... });
```&lt;/p&gt;
&lt;p&gt;No options object (in particular, no `maxOutputLength`) is passed. Node&amp;#39;s zlib convenience methods default `maxOutputLength` to `buffer.kMaxLength`, which on this platform is `Number.MAX_SAFE_INTEGER` — i.e. effectively unbounded until the process runs out of memory. The 3-byte &amp;#34;length of payload before compression&amp;#34; field in the compressed-packet header is read (`packet.readInt24()`) but is only used to branch on `!== 0`; it is never used to cap or validate the actual inflate output size, and the real decompressed size is determined purely by the attacker-supplied deflate stream.&lt;/p&gt;
&lt;p&gt;Because DEFLATE can reach compression ratios over 1000:1 for crafted repetitive input, an attacker who controls (or MITMs, on a non-TLS connection) the MySQL server endpoint can send a single small compressed packet that expands to gigabytes in the client&amp;#39;s memory — a classic decompression-bomb / &amp;#34;zip bomb&amp;#34; applied to MySQL&amp;#39;s client-compression protocol.&lt;/p&gt;
&lt;p&gt;### Attack Scenario
1. Application connects with `mysql2`/`mysql2/promise` using `compress: true` (a documented opt…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/ghsa-rgwj-5xj2-c3m3</guid>
    </item>
  </channel>
</rss>
