Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessIdentify endpoint decompressing untrusted zstd
-
DeliverySubmit crafted two-block zstd frame
-
Exploitint16 count overflow bypasses FSE table validation
-
ExecutionStale cross-block table state yields out-of-range index
-
ImpactDecoder goroutine panics, process crashes
Vulnerability Assessment
| Weakness |
CWE
ASVS 5.0
V15 - Secure Coding and Architecture Integer overflow checks
MITRE ATT&CK
1 technique across 1 tactic: Execution The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | The application must decompress untrusted, attacker-controlled zstd data using a vulnerable klauspost/compress version (≤ 1.20.1) through zstd.DecodeAll or the streaming decoder - these are the standard, default decode paths, so no non-default configuration is needed. No authentication (PR:N), user interaction (UI:N), or special attack requirement (AT:N) is required, and the crash occurs against default decoder settings. The practical LIMITING factor is exposure rather than configuration: the attacker needs a reachable path that feeds untrusted zstd bytes into the decoder, and impact is confined to crashing the processing goroutine/process (availability only; no confidentiality or integrity effect). The specific trigger is a crafted two-block frame whose second block carries an FSE normalized count of 32768 that wraps to -32768 in int16 and reuses stale decode-table state from the first block - both blocks are required, as documented in the advisory. |
| Impact | This is a genuine but bounded availability risk - a reachable denial-of-service, not a code-execution or data-exposure flaw. The CVSS 4.0 vector (AV:N/AC:L/AT:N/PR:N/UI:N) with VA:H and VC:N/VI:N confirms the only impact is availability: a crafted ~27 KB two-block zstd frame makes DecodeAll and the streaming decoder panic with an out-of-range slice index that the caller cannot recover with normal error handling, so any service that decompresses attacker-controlled zstd input can be crashed. Signals mostly align on 'important but not emergency': EPSS is low (0.33%, 26th percentile), KEV status is NOT present (SSVC Exploitation: none), and SSVC Technical Impact is 'partial' - all consistent with a crash rather than full compromise. The counter-weight is SSVC Automatable: yes (the same crafted bytes trigger the panic deterministically and reliably, with no per-target tuning) and a confirmed working reproducer in the vendor advisory, which is why the vuln.today Decision label is 'this_week' rather than a lower tier. Note the tension to flag explicitly: EPSS/percentile are low and there is no evidence of active exploitation, yet a fully working PoC is public and the bug is trivially automatable - so the low EPSS reflects limited observed scanning, not low exploitability. Priority should be driven by exposure: schedule the update within the week (consistent with the Decision label), prioritizing any service that decompresses untrusted zstd at the network edge. |
| Exploit ScenarioDerived | An attacker submits a crafted ~27 KB two-block zstd frame to any endpoint that decompresses untrusted zstd input using a vulnerable klauspost/compress version (≤ 1.20.1) via zstd.DecodeAll or the streaming decoder; the malformed Huffman-weight FSE table overflows the decode table and the goroutine panics, crashing the process. A complete, working reproducer is published in the GHSA advisory, so no exploit development is required. Exploitation is remote, unauthenticated (PR:N), requires no user interaction (UI:N), and is low-complexity (AC:L/AT:N), making it reliably repeatable against any default decoder configuration. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 28, 2026
Untrusted zstd input can crash any Go application that decompresses it with klauspost/compress 1.20.1 or earlier: a crafted two-block frame of roughly 27 KB drives the FSE decoder used by huff0.ReadTable into an out-of-range slice index, producing a runtime panic instead of a decode error. Both default decode paths - DecodeAll and the streaming decoder - are affected, and the flaw requires no authentication or user interaction (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H), so impact is availability only; there is no memory corruption, code execution or data exposure. Exploitation is not confirmed (CISA KEV not listed, SSVC exploitation: none), EPSS is a low 0.33%, and a public PoC reference exists in the GitHub advisory as a Go test reproducer; it is not verified as working exploit code beyond that panic reproduction. The vendor ships a fix in 1.20.2, and the issue is assessed as a bounded but genuine denial-of-service, prioritised 'this week'.
RemediationAI
Upgrade to github.com/klauspost/compress v1.20.2, the exact fixed release, for example with 'go get github.com/klauspost/compress@v1.20.2' followed by a dependency-graph rebuild, and confirm no transitive module still pins 1.20.1 or lower; the fix is in commit 7f5d8528720c895a6106f201719f87eb030a565d and details are in advisory GHSA-fpmh-frq8-7rj8 and the v1.20.2 release notes. No configuration-based workaround fully closes the hole, because the vulnerable paths are the default DecodeAll and streaming decoders and the panic cannot be caught through normal error handling; a recover() wrapper around goroutines that decompress untrusted zstd can keep a process alive at the cost of dropping the in-flight request, and rejecting or pre-validating untrusted zstd input at the boundary (size limits, trusted-source-only decompression) reduces exposure but removes functionality. Confirm the running build's actual module version, since the failure only manifests with attacker-supplied two-block frames and will otherwise pass silently.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 2 packages in go, euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
The flaw is a CWE-190 integer overflow in the Finite State Entropy (FSE) decoder that the huff0 Huffman-weight table reader uses. FSE table logs are permitted up to 15, so a symbol's normalised count can reach 32768 (2^15); that count is stored in an int16, where it wraps to -32768, while validation only compares the int32 running totals (remaining and gotTotal) and therefore passes. In buildDtable the wrapped negative value is neither treated as the -1 low-probability marker nor spread, so the loop body never executes and the position != 0 guard succeeds, leaving a table built on top of the previous block's state because huff0 shares one fse.Scratch and allocDtable reuses decTable and ct.stateTable without clearing. At decode time the state advances past the table and d.dt[d.state] panics (index out of range [33077] with length 32768). Both blocks are required: block one leaves the stale state that lets the malformed second table pass the newState >= tableSize guard. The reference C decoder uses short for the count as well but caps FSE tableLog at 12 and the Huffman-weight tableLog at 6, so the count never wraps; huff0.ReadTable did not enforce that 6-bit bound. The upstream fix adds a math.MaxInt16 check in readNCount, corrects validateNorm to charge a -1 count one cell (total++ rather than total -= int(v)), and rejects a weights tableLog above 6 in huff0.ReadTable. The vulnerable module path is go/github.com/klauspost/compress/zstd, and any library or service vendoring it inherits the exposure.
Know when Compress gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
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
Remote unauthenticated decompression of untrusted input (AV:N/PR:N/UI:N), deterministic low-complexity trigger (AC:L), and an unrecoverable panic giving availability-only impact (C:N/I:N/A:H, S:U).
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
2DescriptionCVE.org
compress provides various compression algorithms. Prior to 1.20.2, the zstd DecodeAll and streaming decoder paths can panic when a crafted two-block frame reaches huff0.ReadTable with an FSE normalized count of 32768 that readNCount stores in int16 as -32768. The wrapped count allows buildDtable to retain stale fse.Scratch decode-table state from the prior block, and nextFast then derives an out-of-range state and indexes beyond the table instead of returning a decode error. Both blocks are required to preserve and then reuse the stale state, allowing untrusted zstd input to crash an application. This issue is fixed in version 1.20.2.
Executive ViewAI
A high-severity availability vulnerability in the widely used Go compression library klauspost/compress (versions 1.20.1 and earlier) can cause any Go application that decompresses untrusted zstd data to crash with a runtime panic. This directly impacts service uptime and reliability for organizations relying on Go-based services, potentially disrupting operations and customer-facing systems. While no active exploitation has been confirmed, the low attack complexity and public proof-of-concept reference warrant prioritized remediation.
Apply vendor patch.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Integer overflow occurs when an arithmetic operation produces a result that exceeds the maximum value a given integer type can store.
Denial of Service attacks render applications or systems unavailable by overwhelming resources or triggering failure conditions.
EUVD-2026-110497
GHSA-fpmh-frq8-7rj8
NVD
CVE.org
EPSS
Vulnrichment
Exploit-DB