Every CVE Search/ Get API key

CVE-2026-116591

compress zstd: Panic on two-block frames

8.7 HighFix available

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.

Attack profile

How easy it is to exploit

Attack vector
Network
Complexity
Low
Privileges needed
None
User interaction
None

What an attacker can affect

Confidentiality
None
Integrity
None
Availability
High

Exploit likelihood

0.33%Unchanged since Oct 27, 2026
90%50%10%1%

What each source reports

CVE List Score used 8.7

compress zstd: Panic on two-block frames

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.

Record
CVE-2026-116591
CVSS 4.0
8.7 HighCVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N
Weakness
CWE-190
Updated
2026-11-02
EUVDEUVD-2026-110497 8.7

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.

Record
EUVD-2026-110497
CVSS 4.0
8.7 HighCVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N
Updated
2026-11-02
GitHub AdvisoriesGHSA-fpmh-frq8-7rj8 8.7

compress zstd: Panic on two-block frames

Summary

A crafted ~27 KB two-block zstd frame makes DecodeAll and the streaming decoder panic with an out-of-range slice index instead of returning a decode error. The same bytes decode fine with the reference zstd. Any program that decompresses untrusted zstd input can be crashed by it. Reproduced on v1.20.0 and v1.20.1.

Released in https://github.com/klauspost/compress/releases/tag/v1.20.2

Details

The panic is in the FSE decoder that huff0.ReadTable uses to read a block's Huffman-weight table. Three conditions have to hold at once, and the crafted frame arranges all three.

1. A count that doesn't fit is accepted. readNCount permits a tableLog up to 15 (tablelogAbsoluteMax, checked at fse/decompress.go:54), so a symbol's normalized count can reach 32768 (2^15). The count is stored in an int16 at fse/decompress.go:126, where 32768 wraps to −32768. The validation only looks at the int32 running totals (remaining and gotTotal), which still match, so the bad value passes. The crafted second block produces norm = [0, -32768], symbolLen = 2.

2. The decode table is built empty, with no error. In buildDtable, −32768 isn't the −1 that flags a low-probability symbol, so it skips that branch, and the spread loop for i := 0; i < int(v); i++ runs zero times for a negative v. position never advances, so the position != 0 guard passes as well.

3. Stale state from the previous block is reused. huff0 shares one fse.Scratch across both blocks, and allocDtable reuses decTable and ct.stateTable without clearing them. So the table is rebuilt on top of block 1's symbols and symbolNext values. Many cells end up with nbBits == 0, because the leftover nextState is ≥ 32768.

At decode time, every symbol's count is below largeLimit, so zeroBits stays false and decompress takes the nextFast path. On a cell with nbBits == 0, getBitsFast(0) shifts by (64-0)&63 == 0 and returns the low 16 bits of the whole register instead of 0. The state runs past the end of the table, and d.dt[d.state] panics:

panic: runtime error: index out of range [33077] with length 32768

Both blocks are needed. With a fresh Scratch, every cell would be symbol 0 with symbolNext 0, highBits(0) would underflow, newState would reach 32768, and the newState >= tableSize guard would return an error. Block 1's leftover state is what carries the malformed table past that guard.

The underlying bug is the int16 storage combined with a tableLog allowed to reach 15. The C reference uses short too, but caps the FSE tableLog at 12 and the Huffman-weight tableLog at 6, so the count never wraps. huff0.ReadTable doesn't enforce that 6-bit bound.

A fix: reject a count of 1<<15 (or nbBits > 14) in readNCount, and enforce the weight-table tableLog in huff0. Clearing the reused table would also turn the panic into an error.

Proof of concept

Run the following repro:

package compression

import (
	"bytes"
	"slices"
	"testing"

	"github.com/klauspost/compress/zstd"
	"github.com/stretchr/testify/require"
)

func TestDecodeAll(t *testing.T) {
	// zstdFSEPanic is a crafted two-block…
Record
GHSA-fpmh-frq8-7rj8
CVSS 4.0
8.7 HighCVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N
Weakness
CWE-190
Updated
2026-11-02
NVD 8.7

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.

Record
CVE-2026-116591
CVSS 4.0
8.7 HighCVSS: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:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X
Weakness
CWE-190
Updated
2026-11-02
OSVALPINE-CVE-2026-116591 8.7

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.

Record
ALPINE-CVE-2026-116591
CVSS 4.0
8.7 HighCVSS: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:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X
Updated
2026-11-05
OSV 8.7

compress zstd: Panic on two-block frames

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.

Record
CVE-2026-116591
CVSS 4.0
8.7 HighCVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N
Weakness
CWE-190
Updated
2026-11-07
Show 46 moreShow less
OSVDEBIAN-CVE-2026-116591 8.7

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.

Record
DEBIAN-CVE-2026-116591
CVSS 4.0
8.7 HighCVSS: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:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X
Updated
2026-11-02
OSVGHSA-fpmh-frq8-7rj8 8.7

compress zstd: Panic on two-block frames

Summary

A crafted ~27 KB two-block zstd frame makes DecodeAll and the streaming decoder panic with an out-of-range slice index instead of returning a decode error. The same bytes decode fine with the reference zstd. Any program that decompresses untrusted zstd input can be crashed by it. Reproduced on v1.20.0 and v1.20.1.

Released in https://github.com/klauspost/compress/releases/tag/v1.20.2

Details

The panic is in the FSE decoder that huff0.ReadTable uses to read a block's Huffman-weight table. Three conditions have to hold at once, and the crafted frame arranges all three.

1. A count that doesn't fit is accepted. readNCount permits a tableLog up to 15 (tablelogAbsoluteMax, checked at fse/decompress.go:54), so a symbol's normalized count can reach 32768 (2^15). The count is stored in an int16 at fse/decompress.go:126, where 32768 wraps to −32768. The validation only looks at the int32 running totals (remaining and gotTotal), which still match, so the bad value passes. The crafted second block produces norm = [0, -32768], symbolLen = 2.

2. The decode table is built empty, with no error. In buildDtable, −32768 isn't the −1 that flags a low-probability symbol, so it skips that branch, and the spread loop for i := 0; i < int(v); i++ runs zero times for a negative v. position never advances, so the position != 0 guard passes as well.

3. Stale state from the previous block is reused. huff0 shares one fse.Scratch across both blocks, and allocDtable reuses decTable and ct.stateTable without clearing them. So the table is rebuilt on top of block 1's symbols and symbolNext values. Many cells end up with nbBits == 0, because the leftover nextState is ≥ 32768.

At decode time, every symbol's count is below largeLimit, so zeroBits stays false and decompress takes the nextFast path. On a cell with nbBits == 0, getBitsFast(0) shifts by (64-0)&63 == 0 and returns the low 16 bits of the whole register instead of 0. The state runs past the end of the table, and d.dt[d.state] panics:

panic: runtime error: index out of range [33077] with length 32768

Both blocks are needed. With a fresh Scratch, every cell would be symbol 0 with symbolNext 0, highBits(0) would underflow, newState would reach 32768, and the newState >= tableSize guard would return an error. Block 1's leftover state is what carries the malformed table past that guard.

The underlying bug is the int16 storage combined with a tableLog allowed to reach 15. The C reference uses short too, but caps the FSE tableLog at 12 and the Huffman-weight tableLog at 6, so the count never wraps. huff0.ReadTable doesn't enforce that 6-bit bound.

A fix: reject a count of 1<<15 (or nbBits > 14) in readNCount, and enforce the weight-table tableLog in huff0. Clearing the reused table would also turn the panic into an error.

Proof of concept

Run the following repro:

package compression

import (
	"bytes"
	"slices"
	"testing"

	"github.com/klauspost/compress/zstd"
	"github.com/stretchr/testify/require"
)

func TestDecodeAll(t *testing.T) {
	// zstdFSEPanic is a crafted two-block…
Record
GHSA-fpmh-frq8-7rj8
CVSS 4.0
8.7 HighCVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N
Weakness
CWE-190
Updated
2026-11-06
OSVUBUNTU-CVE-2026-116591 8.7

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.

Record
UBUNTU-CVE-2026-116591
CVSS 4.0
8.7 HighCVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N
Updated
2026-11-02
OSVAZL-111664 No score

CVE-2026-116591 affecting package azl-otel-collector 0.127.0-1

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.

Record
AZL-111664
Updated
2026-11-05
OSVAZL-111676 No score

CVE-2026-116591 affecting package buildah 1.43.1-3

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.

Record
AZL-111676
Updated
2026-11-05
OSVAZL-111700 No score

CVE-2026-116591 affecting package cri-o 1.30.1-1

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.

Record
AZL-111700
Updated
2026-11-05
OSVAZL-111709 No score

CVE-2026-116591 affecting package kata-containers-preview 3.27.0~preview2-2

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.

Record
AZL-111709
Updated
2026-11-05
OSVAZL-111718 No score

CVE-2026-116591 affecting package podman 5.6.1-10

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.

Record
AZL-111718
Updated
2026-11-05
OSVAZL-111754 No score

CVE-2026-116591 affecting package umoci 0.4.7-13

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.

Record
AZL-111754
Updated
2026-11-05
OSVAZL-111817 No score

CVE-2026-116591 affecting package azurelinux-image-tools 1.7.0-2

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.

Record
AZL-111817
Updated
2026-11-05
OSVAZL-111827 No score

CVE-2026-116591 affecting package cert-manager 1.12.15-15

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.

Record
AZL-111827
Updated
2026-11-05
OSVAZL-111866 No score

CVE-2026-116591 affecting package containerd2 2.3.7-1

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.

Record
AZL-111866
Updated
2026-11-05
OSVAZL-111881 No score

CVE-2026-116591 affecting package containerized-data-importer 1.62.0-9

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.

Record
AZL-111881
Updated
2026-11-05
OSVAZL-111890 No score

CVE-2026-116591 affecting package coredns 1.11.4-23

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.

Record
AZL-111890
Updated
2026-11-05
OSVAZL-111917 No score

CVE-2026-116591 affecting package docker-buildx 0.14.0-19

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.

Record
AZL-111917
Updated
2026-11-05
OSVAZL-111926 No score

CVE-2026-116591 affecting package docker-cli 25.0.7-6

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.

Record
AZL-111926
Updated
2026-11-05
OSVAZL-111941 No score

CVE-2026-116591 affecting package docker-compose 2.27.0-16

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.

Record
AZL-111941
Updated
2026-11-05
OSVAZL-111953 No score

CVE-2026-116591 affecting package gh 2.102.0-2

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.

Record
AZL-111953
Updated
2026-11-05
OSVAZL-111983 No score

CVE-2026-116591 affecting package influxdb 2.7.5-23

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.

Record
AZL-111983
Updated
2026-11-05
OSVAZL-111992 No score

CVE-2026-116591 affecting package kata-containers 4.1.0.kata1-2

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.

Record
AZL-111992
Updated
2026-11-05
OSVAZL-111995 No score

CVE-2026-116591 affecting package kata-containers-cc 3.15.0.aks0-23

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.

Record
AZL-111995
Updated
2026-11-05
OSVAZL-112010 No score

CVE-2026-116591 affecting package keda 2.14.1-19

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.

Record
AZL-112010
Updated
2026-11-02
OSVAZL-112025 No score

CVE-2026-116591 affecting package kubernetes 1.30.10-32

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.

Record
AZL-112025
Updated
2026-11-05
OSVAZL-112052 No score

CVE-2026-116591 affecting package libcontainers-common 20240213-3

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.

Record
AZL-112052
Updated
2026-11-05
OSVAZL-112067 No score

CVE-2026-116591 affecting package kubevirt-openvmm 1.9.0-1

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.

Record
AZL-112067
Updated
2026-11-05
OSVAZL-112073 No score

CVE-2026-116591 affecting package moby-containerd-cc 1.7.7-19

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.

Record
AZL-112073
Updated
2026-11-05
OSVAZL-112085 No score

CVE-2026-116591 affecting package moby-engine 25.0.18-1

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.

Record
AZL-112085
Updated
2026-11-05
OSVAZL-112100 No score

CVE-2026-116591 affecting package opa 0.63.0-6

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.

Record
AZL-112100
Updated
2026-11-05
OSVAZL-112109 No score

CVE-2026-116591 affecting package packer 1.9.5-23

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.

Record
AZL-112109
Updated
2026-11-05
OSVAZL-112235 No score

CVE-2026-116591 affecting package skopeo 1.14.4-15

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.

Record
AZL-112235
Updated
2026-11-05
OSVAZL-112247 No score

CVE-2026-116591 affecting package telegraf 1.31.0-36

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.

Record
AZL-112247
Updated
2026-11-05
OSVAZL-112274 No score

CVE-2026-116591 affecting package vitess 19.0.4-16

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.

Record
AZL-112274
Updated
2026-11-05
OSVGO-2026-6865 No score

Panic on two-block frames in github.com/klauspost/compress

Panic on two-block frames in github.com/klauspost/compress

Record
GO-2026-6865
Updated
2026-11-06
OSVopenSUSE-SU-2026:12313-1 No score

aliyun-cli-3.5.2-2.1 on GA media

These are all security issues fixed in the aliyun-cli-3.5.2-2.1 package on the GA media of openSUSE Tumbleweed.

Record
openSUSE-SU-2026:12313-1
Updated
2026-11-02
OSVopenSUSE-SU-2026:12317-1 No score

cadvisor-0.60.6-5.1 on GA media

These are all security issues fixed in the cadvisor-0.60.6-5.1 package on the GA media of openSUSE Tumbleweed.

Record
openSUSE-SU-2026:12317-1
Updated
2026-11-02
OSVopenSUSE-SU-2026:12318-1 No score

distribution-registry-3.1.2-4.1 on GA media

These are all security issues fixed in the distribution-registry-3.1.2-4.1 package on the GA media of openSUSE Tumbleweed.

Record
openSUSE-SU-2026:12318-1
Updated
2026-11-02
OSVopenSUSE-SU-2026:12323-1 No score

crane-0.22.1-3.1 on GA media

These are all security issues fixed in the crane-0.22.1-3.1 package on the GA media of openSUSE Tumbleweed.

Record
openSUSE-SU-2026:12323-1
Updated
2026-11-02
OSVopenSUSE-SU-2026:12325-1 No score

hauler-2.1.2-3.1 on GA media

These are all security issues fixed in the hauler-2.1.2-3.1 package on the GA media of openSUSE Tumbleweed.

Record
openSUSE-SU-2026:12325-1
Updated
2026-11-02
OSVopenSUSE-SU-2026:12326-1 No score

helm-4.3.1-3.1 on GA media

These are all security issues fixed in the helm-4.3.1-3.1 package on the GA media of openSUSE Tumbleweed.

Record
openSUSE-SU-2026:12326-1
Updated
2026-11-02
OSVopenSUSE-SU-2026:12327-1 No score

helm3-3.22.1-2.1 on GA media

These are all security issues fixed in the helm3-3.22.1-2.1 package on the GA media of openSUSE Tumbleweed.

Record
openSUSE-SU-2026:12327-1
Updated
2026-11-02
OSVopenSUSE-SU-2026:12340-1 No score

amazon-cloudwatch-agent-1.300073.2-3.1 on GA media

These are all security issues fixed in the amazon-cloudwatch-agent-1.300073.2-3.1 package on the GA media of openSUSE Tumbleweed.

Record
openSUSE-SU-2026:12340-1
Updated
2026-11-02
OSVopenSUSE-SU-2026:12430-1 No score

google-osconfig-agent-20261103.02-1.1 on GA media

These are all security issues fixed in the google-osconfig-agent-20261103.02-1.1 package on the GA media of openSUSE Tumbleweed.

Record
openSUSE-SU-2026:12430-1
Updated
2026-11-06
OSVopenSUSE-SU-2026:12479-1 No score

syft-1.56.0-1.1 on GA media

These are all security issues fixed in the syft-1.56.0-1.1 package on the GA media of openSUSE Tumbleweed.

Record
openSUSE-SU-2026:12479-1
Updated
2026-11-07
OSVopenSUSE-SU-2026:22218-1 No score

Security update for cadvisor

This update for cadvisor fixes the following issues:

Changes in cadvisor:

  • update vendor.tar to address:
    • bsc#1288588, CVE-2026-116591: github.com/klauspost/compress/zstd: crafted ~27 KB two-block zstd frame makes DecodeAll and the streaming decoder panic

    • bsc#1288212, CVE-2026-78663: golang.org/x/net/http2: double flow control refund on HTTP/2 server streams

Record
openSUSE-SU-2026:22218-1
Updated
2026-11-04
OSVopenSUSE-SU-2026:22227-1 No score

Security update for go-containerregistry

This update for go-containerregistry fixes the following issues:

Changes in go-containerregistry:

  • update vendor.tar to address:

    • bsc#1288488, CVE-2026-116591: github.com/klauspost/compress/zstd: crafted ~27 KB two-block zstd frame makes DecodeAll and the streaming decoder panic
  • update to 0.22.1:

    • Reject non-canonical IP literals in all SSRF guards
    • daemon: fix stale docker/docker reference in WithClient docs
    • build(deps): bump the go-deps group across 2 directories with 4 updates
    • authn: do not overwrite AuthConfig.Auth when username and password are empty
    • build(deps): bump the actions group across 1 directory with 8 updates
    • Support pulling images by sha512 digest
    • Allow empty label and annotation values in crane mutate
    • fix(build): Use dependencies.gitSource in cloudbuild_v2.yaml
    • validate: support index attestation manifests and empty configs
    • name: improve error when parsing a reference with a URL scheme
    • fix(build): install binaries to /ko-app and add to PATH
    • fix(release): honor declared Go toolchain
    • remote: apply checkRedirectSSRF to writer-side HTTP clients
    • flatten: preserve config and layer media types when flattening
    • fix(mutate): make Time layer updates lazy
    • build(deps): bump the go-deps group across 2 directories with 3 updates
    • remote: copy manifest annotations to referrers fallback tag descriptors
  • update to 0.22.0:

    • mutate: let Time and Canonical take tarball.LayerOption
    • build: add multi-architecture Cloud Build configurations for crane, gcrane, and krane
    • remote: resolve push-check credentials against the repository
    • Allow single-character repository paths
    • fix: add missing substitutions and workspace cleanup to new build files
    • remote: retry failed Puller and Pusher initialization
    • build(deps): bump the actions group across 1 directory with 8 updates
    • build(deps): bump the go-deps group across 1 directory with 3 updates
    • go.mod: bump Go version + add toolchain directive to replace .go-version file
    • fix: Fix new build options and provenance
    • fix(build): unify new build flow into cloudbuild_v2.yaml
  • update to 0.21.8 (bsc#1283692, CVE-2026-63209):

    • The artifacts attached to this release are missing SLSA provenance, see #2390.
    • build(deps): bump the go-deps group across 1 directory with 3 updates
    • build(deps): bump golang.org/x/crypto from 0.45.0 to 0.52.0 in /cmd/krane
    • build(deps): bump golang.org/x/crypto from 0.50.0 to 0.52.0 in /pkg/authn/k8schain
    • build(deps): bump golang.org/x/net from 0.49.0 to 0.55.0 in /pkg/authn/kubernetes
    • build(deps): bump the go-deps group across 3 directories with 7 updates
    • build(deps): bump the actions group across 1 directory with 5 updates
    • Reject unsafe Windows archive paths in Extract
    • feat(goreleaser): add loong64 build support for crane/gcrane/krane
    • Document tag and digest reference semantics
    • remote: release pull limiter slot when body is read to EOF
    • tarball: bounds-check layer index in uncompressed LayerByDiffID
    • authn: read Podman auth from XDG config
    • transport: per-host bearer token exchange on cross-host redirect
    • mutate: bounds-check layer index when building rebase addendums
    • fix(daemon): copy ExposedPorts from source config in computeImageConfig
    • feat(remote): add WithReferrersTagFallback option
    • mutate: apply opaque-directory whiteouts (.wh..wh..opq) in Extract
    • tarball: use correct file extension for zstd/uncompressed
    • build(deps): bump github.com/moby/moby/client from 0.5.0 to 0.5.1 in the go-deps group across 1 directory
    • actions: update actions to be pinned by hash
    • Bump go version to 1.26.5
  • update to 0.21.7:

    • tarball: return error instead of panicking on missing rootfs.diff_ids
    • gcrane: honor --platform flag in copy
    • mutate: verify layer digests in Extract and…
Record
openSUSE-SU-2026:22227-1
Updated
2026-11-04
OSVopenSUSE-SU-2026:22228-1 No score

Security update for hauler

This update for hauler fixes the following issues:

Changes in hauler:

  • update vendor.tar to address:
    • bsc#1288460, CVE-2026-116591, github.com/klauspost/compress/zstd: crafted ~27 KB two-block zstd frame makes DecodeAll and the streaming decoder panic
Record
openSUSE-SU-2026:22228-1
Updated
2026-11-04

Affected products

Affected packages

Affected packages
PackageAffectedFixed
github.com/klauspost/compress/zstd
Go
through 1.20.1
1.20.2
docker
Alpine:v3.24
before 29.9.3-r0
29.9.3-r0
azl-otel-collector
Azure Linux:3
through 0.127.0-1 None known
buildah
Azure Linux:3
through 1.43.1-3 None known
cri-o
Azure Linux:3
through 1.30.1-1 None known
kata-containers-preview
Azure Linux:3
through 3.27.0~preview2-2 None known
podman
Azure Linux:3
through 5.6.1-10 None known
umoci
Azure Linux:3
through 0.4.7-13 None known
azurelinux-image-tools
Azure Linux:3
through 1.7.0-2 None known
cert-manager
Azure Linux:3
through 1.12.15-15 None known
Show 46 moreShow less
Affected packages
PackageAffectedFixed
containerd2
Azure Linux:3
through 2.3.7-1 None known
containerized-data-importer
Azure Linux:3
through 1.62.0-9 None known
coredns
Azure Linux:3
through 1.11.4-23 None known
docker-buildx
Azure Linux:3
through 0.14.0-19 None known
docker-cli
Azure Linux:3
through 25.0.7-6 None known
docker-compose
Azure Linux:3
through 2.27.0-16 None known
gh
Azure Linux:3
through 2.102.0-2 None known
influxdb
Azure Linux:3
through 2.7.5-23 None known
kata-containers
Azure Linux:3
through 4.1.0.kata1-2 None known
kata-containers-cc
Azure Linux:3
through 3.15.0.aks0-23 None known
keda
Azure Linux:3
through 2.14.1-19 None known
kubernetes
Azure Linux:3
through 1.30.10-32 None known
libcontainers-common
Azure Linux:3
through 20240213-3 None known
kubevirt-openvmm
Azure Linux:3
through 1.9.0-1 None known
moby-containerd-cc
Azure Linux:3
through 1.7.7-19 None known
moby-engine
Azure Linux:3
through 25.0.18-1 None known
opa
Azure Linux:3
through 0.63.0-6 None known
packer
Azure Linux:3
through 1.9.5-23 None known
skopeo
Azure Linux:3
through 1.14.4-15 None known
telegraf
Azure Linux:3
through 1.31.0-36 None known
vitess
Azure Linux:3
through 19.0.4-16 None known
golang-github-klauspost-compress
Debian:12
All versions, plus listed versions
1.15.12+ds1-31.17.0+ds1-11.17.0+ds1-1~exp11.17.10+ds1-11.17.11+ds1-1
Show 12 moreShow less
1.17.2+ds1-11.17.7+ds1-11.17.9+ds1-11.17.9+ds1-1~bpo12+11.18.0+ds1-11.18.1+ds1-11.18.6+ds1-11.18.6+ds1-21.19.0+ds1-11.19.0+ds1-21.20.0+ds1-11.20.3+ds1-1
None known
golang-github-klauspost-compress
Debian:13
All versions, plus listed versions
1.18.0+ds1-11.18.1+ds1-11.18.6+ds1-11.18.6+ds1-21.19.0+ds1-11.19.0+ds1-21.20.0+ds1-11.20.3+ds1-1
None known
golang-github-klauspost-compress
Debian:14
before 1.20.3+ds1-1, plus listed versions
1.18.0+ds1-11.18.1+ds1-11.18.6+ds1-11.18.6+ds1-21.19.0+ds1-11.19.0+ds1-21.20.0+ds1-1
1.20.3+ds1-1
github.com/klauspost/compress/zstd
Go
before 1.20.2
1.20.2
github.com/klauspost/compress
Go
before 1.20.2
1.20.2
golang-github-klauspost-compress
Ubuntu:16.04:LTS
All versions, plus listed versions
0.0~git20151221.0.2dd54ae-1
None known
golang-github-klauspost-compress
Ubuntu:18.04:LTS
All versions, plus listed versions
1.2.1-11.2.1-21.2.1-41.2.1-5
None known
golang-github-klauspost-compress
Ubuntu:20.04:LTS
All versions, plus listed versions
1.2.1-51.7.6-21.9.5-11.9.5-2
None known
golang-github-klauspost-compress
Ubuntu:22.04:LTS
All versions, plus listed versions
1.11.7-2
None known
golang-github-klauspost-compress
Ubuntu:24.04:LTS
All versions, plus listed versions
1.15.12+ds1-31.17.7+ds1-1
None known
golang-github-klauspost-compress
Ubuntu:26.10
All versions, plus listed versions
1.18.1+ds1-11.19.0+ds1-11.20.0+ds1-1
None known
golang-github-klauspost-compress
Ubuntu:26.04:LTS
All versions, plus listed versions
1.18.0+ds1-11.18.1+ds1-1
None known
aliyun-cli
openSUSE:Tumbleweed
before 3.5.2-2.1
3.5.2-2.1
cadvisor
openSUSE:Tumbleweed
From an advisory covering 2 CVEs
before 0.60.6-5.1
0.60.6-5.1
distribution
openSUSE:Tumbleweed
before 3.1.2-4.1
3.1.2-4.1
go-containerregistry
openSUSE:Tumbleweed
before 0.22.1-3.1
0.22.1-3.1
hauler
openSUSE:Tumbleweed
before 2.1.2-3.1
2.1.2-3.1
helm
openSUSE:Tumbleweed
From an advisory covering 5 CVEs
before 4.3.1-3.1
4.3.1-3.1
helm3
openSUSE:Tumbleweed
before 3.22.1-2.1
3.22.1-2.1
amazon-cloudwatch-agent
openSUSE:Tumbleweed
before 1.300073.2-3.1
1.300073.2-3.1
google-osconfig-agent
openSUSE:Tumbleweed
From an advisory covering 4 CVEs
before 20261103.02-1.1
20261103.02-1.1
syft
openSUSE:Tumbleweed
From an advisory covering 2 CVEs
before 1.56.0-1.1
1.56.0-1.1
cadvisor
openSUSE:Leap 16.0
From an advisory covering 2 CVEs
before 0.60.6-bp160.4.1
0.60.6-bp160.4.1
go-containerregistry
openSUSE:Leap 16.0
From an advisory covering 3 CVEs
before 0.22.1-bp160.1.1
0.22.1-bp160.1.1
hauler
openSUSE:Leap 16.0
before 2.1.2-bp160.2.1
2.1.2-bp160.2.1

History

History
RecordedChangedSources
affected, aliases, referencesOSV
affected, aliases, referencesOSV
affected
affected, aliasesOSV
affected, aliases, referencesOSV
affectedOSV
affected, aliases, referencesOSV
affected, aliases, facts, referencesOSV
first indexedCVE List, EUVD, GitHub Advisories, NVD, OSV

Dates are when Every CVE recorded each change. Upstream dates may differ.

In short

CVE-2026-116591 is a high vulnerability (CVSS 8.7) in Klauspost Compress, published October 26, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.33%, the 26th percentile. Fixed in github.com/klauspost/compress/zstd 1.20.2.

References

Show 22 moreShow less
This page doesn't list everything

Left out here: the rest of 3 source descriptions. The JSON record has them.

MoveEnter Open