Decompression Bomb Detection

SkillDocs & knowledge

Detect decompression bomb vulnerabilities where compressed input can expand to exhaust memory, targeting buffer-based decompression without size limits.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the Decompression Bomb Detection skill

What this skill tells your AI

The instructions your AI receives, as published by byamb4/find-cve-agent in skills/decompression-bomb/SKILL.md and read by ahel’s review.

When to Use

Audit archive/compression libraries, file upload handlers, content-encoding processors, and any package that decompresses user-supplied data.

Key Insight

Buffer-based decompression is vulnerable: the entire decompressed output is loaded into memory at once. A 1KB compressed payload can expand to 1GB+.

Stream-based MAY have backpressure: but only if the consumer applies it. Many stream implementations still buffer the entire output.

Process

Step 1: Find Decompression Sinks

# JavaScript
grep -rn "zlib\.gunzip\|zlib\.inflate\|zlib\.unzip\|zlib\.brotli" .
grep -rn "gunzipSync\|inflateSync\|unzipSync\|brotliDecompress" .
grep -rn "pako\|fflate\|lz-string\|snappy" .
grep -rn "decompress\|decompressSync\|uncompress" .

# Python
grep -rn "zlib\.decompress\|gzip\.decompress\|bz2\.decompress" .
grep -rn "lzma\.decompress\|snappy\.decompress" .

# Go
grep -rn "gzip\.NewReader\|zlib\.NewReader\|flate\.NewReader" .
grep -rn "compress/gzip\|compress/zlib\|compress/flate" .

Step 2: Check for Size Limits

grep -rn "maxSize\|maxOutput\|maxLength\|MAX_SIZE\|outputLimit\|sizeLimit" .
grep -rn "ratio\|compressionRatio\|maxRatio" .

Step 3: Check Buffer vs Stream

Buffer-based (VULNERABLE):

zlib.gunzipSync(input)                    // Entire output in memory
zlib.gunzip(input, (err, result) => {})   // Callback with full buffer

Stream-based (CHECK):

input.pipe(zlib.createGunzip()).pipe(output)  // Streaming, may have backpressure

Even stream-based can be vulnerable if:

  • Output is collected into a buffer: const chunks = []; stream.on('data', c => chunks.push(c))
  • No backpressure is applied
  • Consumer reads faster than it can process

Step 4: Verify Exploitability

  1. Can the attacker supply compressed data? (file upload, HTTP content-encoding, archive processing)
  2. Is there an input size limit that would prevent the bomb?
  3. Is there a decompressed size limit?
  4. Is the process memory-limited?

CVSS Guidance

  • Unauthenticated OOM crash: HIGH 7.5
  • Authenticated OOM crash: MEDIUM 6.5
  • Stream-based with memory growth: MEDIUM 5.3
  • With input size limits that bound expansion: may not be exploitable

References

Signals

GitHub stars
50
Forks
9
Last commit
Mar 2026
Advanced
Catalog kind
skill
Gateway key
decompression-bomb
Source
github.com/byamb4/find-cve-agent