{"id":"CVE-2026-119434","kind":"vulnerability","aliases":["CVE-2026-119434"],"related":[],"title":"ezstd: dictionary decompress path lets a small zstd frame kill Erlang node","description":"Improper Handling of Highly Compressed Data (Data Amplification) vulnerability in silviucpp ezstd allows an attacker who supplies a zstd frame to ezstd:decompress_using_ddict/2 to exhaust memory and terminate the Erlang VM via a small frame that declares a very large content size.\n\nzstd_nif_decompress_using_ddict in c_src/ezstd_nif.cc reads the frame's declared content size with ZSTD_getFrameContentSize and passes it directly to enif_make_new_binary, without the 1 GiB MAX_BUFFER_SIZE check that ezstd:decompress/1 applies before allocating. A valid 65,550-byte frame of RLE blocks declaring 2 GiB is rejected by ezstd:decompress/1 but is fully allocated and decompressed by the dictionary path. The allocation happens inside a NIF, so when it exceeds the memory available to the VM the operating system kills the whole node rather than the calling process.\n\nThis issue affects ezstd: from 1.0.5 before 1.2.5.","summary":"The decompress_using_ddict function in the Erlang ezstd library allocates memory based on a size the compressed frame declares, without the 1 GiB limit applied by the plain decompress function. A small crafted zstd frame can make the Erlang VM exhaust memory, and the operating system kills the whole node.","severity":"medium","cvss":6.9,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["erlang","ezstd","package","zstd"],"not_affected_if":["ezstd-1.2.5-or-later","trusted-input-only","uses-decompress-not-ddict"],"how_to_check":"- Check the ezstd version in the project's lock file (for example `rebar.lock` or `mix.lock`) and see whether it is from `1.0.5` up to, but not including, `1.2.5`.\n- Search the code for calls to `ezstd:decompress_using_ddict` that take zstd frames from untrusted input.","fix":"- ezstd `1.2.5` (the first fixed version, per the affected range 1.0.5 to before 1.2.5)","status":"open","published_at":"2026-11-05T21:18:41+00:00","first_seen_at":"2026-11-05T21:40:45+00:00","triaged_at":"2026-11-05T21:41:13+00:00","updated_at":"2026-11-05T21:41:13+00:00","category":"package","confidence":0.7,"triage":{"at":"2026-11-05T21:41:13Z","model":"claude-haiku-5-5","output":{"fix":"- ezstd `1.2.5` (the first fixed version, per the affected range 1.0.5 to before 1.2.5)","reach":"network","title":"ezstd: dictionary decompress path lets a small zstd frame kill Erlang node","impact":"medium","summary":"The decompress_using_ddict function in the Erlang ezstd library allocates memory based on a size the compressed frame declares, without the 1 GiB limit applied by the plain decompress function. A small crafted zstd frame can make the Erlang VM exhaust memory, and the operating system kills the whole node.","audience":"developers","category":"package","nicknames":[],"who_cares":["erlang","ezstd","zstd"],"confidence":0.7,"fix_status":"available","needs_auth":"unknown","worst_case":"attacker crashes the whole Erlang node via memory exhaustion","analyst_note":"","how_to_check":"- Check the ezstd version in the project's lock file (for example `rebar.lock` or `mix.lock`) and see whether it is from `1.0.5` up to, but not including, `1.2.5`.\n- Search the code for calls to `ezstd:decompress_using_ddict` that take zstd frames from untrusted input.","plain_action":"","needs_analyst":false,"not_affected_if":["trusted-input-only","uses-decompress-not-ddict","ezstd-1.2.5-or-later"],"who_is_affected":"Applications that use the ezstd Erlang library from version 1.0.5 up to before 1.2.5 and call decompress_using_ddict on zstd data an outside party can supply. Code that only decompresses trusted data, or that uses only the plain decompress function, is not exposed through this path.","user_interaction":"no","needs_special_setup":"yes","severity_if_unknown":"medium"},"cost_usd":0.000762,"input_tokens":4529,"output_tokens":619,"severity_before":"medium"},"analyst_status":null,"analyst_note":null,"search":"'-119434':15A,18A '-2026':14A,17A '1':45B,147C '1.0.5':219C '1.2.5':221C '2':169C '550':162C '65':161C 'affect':216C 'alloc':33B,158C,179C,187C 'allow':86C 'amplif':81C 'appli':48B,156C 'attack':88C 'avail':198C 'base':35B 'binari':144C 'block':167C 'buffer':150C 'byte':163C 'c':124C 'call':212C 'check':152C 'compress':40B,78C 'content':116C,131C 'craft':56B 'cve':13A,16A 'data':79C,80C 'ddict':26B,122C 'ddict/2':98C 'declar':42B,112C,130C,168C 'decompress':3A,24B,52B,96C,120C,181C 'decompress/1':155C,175C 'dictionari':2A,184C 'direct':139C 'enif':141C 'erlang':11A,19B,30B,62B,105C 'exceed':195C 'exhaust':64B,100C 'ezstd':1A,20B,31B,85C,95C,154C,174C,217C 'frame':9A,41B,58B,93C,110C,128C,164C 'fulli':178C 'function':27B,53B 'getframecontents':135C 'gib':46B,148C,170C 'handl':75C 'happen':188C 'high':77C 'improp':74C 'insid':189C 'issu':215C 'kill':10A,70B,205C 'larg':115C 'let':5A 'librari':32B 'limit':47B 'make':60B,142C 'max':149C 'memori':34B,65B,101C,197C 'new':143C 'nif':119C,191C 'node':12A,73B,208C 'oper':68B,203C 'packag':21B 'pass':137C 'path':4A,185C 'plain':51B 'process':213C 'rather':209C 'read':126C 'reject':172C 'rle':166C 'silviucpp':84C 'size':38B,117C,132C,151C 'small':7A,55B,109C 'src/ezstd_nif.cc':125C 'suppli':90C 'system':69B,204C 'termin':103C 'use':25B,97C,121C 'valid':160C 'via':107C 'vm':63B,106C,201C 'vulner':82C 'whole':72B,207C 'without':43B,145C 'zstd':8A,22B,57B,92C,118C,134C","nicknames":[],"mitigations":[],"who_affected":"Applications that use the ezstd Erlang library from version 1.0.5 up to before 1.2.5 and call decompress_using_ddict on zstd data an outside party can supply. Code that only decompresses trusted data, or that uses only the plain decompress function, is not exposed through this path.","tier":"C","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"developers","plain_action":null,"pkeys":[],"ptokens":[],"labels":["erlang","ezstd","medium","package","zstd"],"campaign_type":null,"first_public_at":"2026-11-05T21:18:41+00:00","kev":null,"cvss_vector":"CVSS:4.0/AV:L/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","cvss_by":"6b3ad84c-e1a6-4bf7-a703-f496b71e49db","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-119434","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-119434","severity":null,"published_at":"2026-11-05T21:18:41+00:00","modified_at":"2026-11-05T21:18:41+00:00","first_seen_at":"2026-11-05T21:40:45+00:00","fetched_at":"2026-11-05T21:40:45+00:00","note":null}],"documents":[{"id":80354,"url":"https://github.com/silviucpp/ezstd/commit/6730128b1d35eca02a2028671421471ff651f423","title":"Patch: github.com","kind":"other","source":"nvd","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Patch: github.com"},{"id":80355,"url":"https://github.com/silviucpp/ezstd/commit/e34f4a4f6dc18d990d1cece2d5fceef8e934a195","title":"Patch: github.com","kind":"other","source":"nvd","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Patch: github.com"},{"id":80356,"url":"https://github.com/silviucpp/ezstd/releases/tag/v1.2.5","title":"Release notes: github.com","kind":"release","source":"nvd","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Release notes: github.com"}],"exploit_sources":[],"notice":"Free to read, with fair use of about 60 pages a minute. For higher limits or API access: sales@infrastack.ai"}