This vulnerability in the screenpresso decoder (CVE-2026-70630) is a heap information disclosure with blast radius that far exceeds its CVSS 5.5 rating. The mechanism: the decoder allocates a persistent buffer (ctx->inflated_buf) once and reuses it across frame boundaries. When a crafted SPV1 packet decompresses to fewer bytes than the frame dimensions require, the subsequent av_image_copy_plane() call copies the full expected dimensions from this buffer — pulling unwritten heap padding or, critically, residual data from previously decoded frames that were never zeroed. In a long-running FFmpeg process (transcoding server, media analysis pipeline), a single malicious packet can expose fragments of videos processed hours earlier. The temporal blast radius is the real danger, not the single-frame leak the CVSS score implies.
The deeper problem is structural. This exact pattern — persistent decoder buffer plus missing post-decompression length validation — has appeared across multiple FFmpeg decoders (CVE-2016-6832 in HEVC, CVE-2018-19198 in VPX, CVE-2021-38090 in APE). Each CVE gets patched in isolation while the underlying API contract remains unenforced. The zlib API returns bytes-produced but doesn't mandate validation against declared output dimensions. FFmpeg's avcodec layer inherits this gap, and no reusable verification primitive exists. The av_image_copy_plane() call assumes fully-populated source buffers with no dimension contract to enforce otherwise.
For defenders: audit any custom or obscure FFmpeg decoders for this pattern — persistent working buffers reused across frames without explicit length validation after decompression. If you run long-lived FFmpeg processes handling untrusted input, treat any decoder for a proprietary or niche format as higher-risk, regardless of apparent activity. The screenpresso decoder may have no active maintainer, meaning it receives neither fuzzer attention nor security review. Consider whether such decoders need to be compiled into your build at all. The vulnerability patch lands in FFmpeg, but the closure gap — between upstream patch and downstream deployment — is where persistent services remain exposed.