{"id":"CVE-2026-121808","kind":"vulnerability","aliases":["CVE-2026-121808"],"related":[],"title":"elixir-grpc: compressed Erlang terms exhaust server memory without authentication","description":"Improper Handling of Highly Compressed Data (Data Amplification) vulnerability in elixir-grpc grpc_core and grpc allows unauthenticated attackers to exhaust server memory via a compressed Erlang external term in a gRPC message body.\n\nGRPC.Codec.Erlpack.decode/2 (grpc_core/lib/grpc/codec/erlpack.ex, and lib/grpc/codec/erlpack.ex before the package split) passes the message body to :erlang.binary_to_term/2. That function inflates a compressed term in full before it returns. The codec sets no limit on the decoded size, and its type checks run only on the decoded term. The server's max_body_size limit counts the compressed bytes of the request. A request with Content-Type: application/grpc+erlpack can therefore make the server allocate a term much larger than the request body.\n\nThis issue affects grpc: from 0.4.0 before 1.0.0; grpc_core: from 1.0.0 before 1.1.0.","summary":"The Erlpack codec in elixir-grpc decodes message bodies with binary_to_term, which fully inflates a compressed term with no size limit, while the body size limit counts only the compressed bytes. An unauthenticated attacker can send a small request that makes the server allocate far more memory than the request size, exhausting it.","severity":"high","cvss":8.2,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["elixir","erlang","grpc","package","self-hosted"],"not_affected_if":["no-untrusted-grpc-clients","other-codecs-only"],"how_to_check":"- Check the `grpc` version in `mix.lock` or `mix.exs`; affected if it is from `0.4.0` before `1.0.0`.\n- Check the `grpc_core` version in `mix.lock`; affected if it is from `1.0.0` before `1.1.0`.\n- Check whether the server accepts `application/grpc+erlpack` requests (the GRPC.Codec.Erlpack codec is in use).","fix":"- `grpc_core` (1.0.0 to before 1.1.0): upgrade to `1.1.0`.\n- `grpc`: fixed version unknown from the sources; the affected range ends at `1.0.0`.","status":"open","published_at":"2026-11-13T16:17:36+00:00","first_seen_at":"2026-11-13T16:47:33+00:00","triaged_at":"2026-11-13T16:48:31+00:00","updated_at":"2026-11-13T16:48:31+00:00","category":"package","confidence":0.7,"triage":{"at":"2026-11-13T16:48:31Z","model":"claude-haiku-5-5","output":{"fix":"- `grpc_core` (1.0.0 to before 1.1.0): upgrade to `1.1.0`.\n- `grpc`: fixed version unknown from the sources; the affected range ends at `1.0.0`.","reach":"internet","title":"elixir-grpc: compressed Erlang terms exhaust server memory without authentication","impact":"medium","summary":"The Erlpack codec in elixir-grpc decodes message bodies with binary_to_term, which fully inflates a compressed term with no size limit, while the body size limit counts only the compressed bytes. An unauthenticated attacker can send a small request that makes the server allocate far more memory than the request size, exhausting it.","audience":"businesses","category":"package","nicknames":[],"who_cares":["elixir","grpc","erlang","self-hosted"],"confidence":0.7,"fix_status":"available","needs_auth":"no","worst_case":"Unauthenticated requests exhaust server memory and crash the service.","analyst_note":"Confirm the fixed version for grpc (above 1.0.0 range) and the fix commit; the sources only show the grpc_core fix in the product ranges.","how_to_check":"- Check the `grpc` version in `mix.lock` or `mix.exs`; affected if it is from `0.4.0` before `1.0.0`.\n- Check the `grpc_core` version in `mix.lock`; affected if it is from `1.0.0` before `1.1.0`.\n- Check whether the server accepts `application/grpc+erlpack` requests (the GRPC.Codec.Erlpack codec is in use).","plain_action":"","product_name":"","needs_analyst":true,"not_affected_if":["other-codecs-only","no-untrusted-grpc-clients"],"who_is_affected":"Servers built with elixir-grpc that accept gRPC requests using the Erlpack content type are exposed, since the decoder runs on any incoming message body before type checks. Applications that only use other codecs, or that do not expose gRPC to untrusted clients, can skip this.","user_interaction":"no","product_ecosystem":"","needs_special_setup":"yes","severity_if_unknown":"high"},"cost_usd":0.000856,"input_tokens":4846,"output_tokens":742,"severity_before":"high"},"analyst_status":null,"analyst_note":null,"search":"'-121808':14A,17A '-2026':13A,16A '/2':117C '0.4.0':205C '1.0.0':207C,211C '1.1.0':213C 'affect':202C 'alloc':71B,191C 'allow':97C 'amplif':87C 'application/grpc':184C 'attack':61B,99C 'authent':11A 'binari':36B 'bodi':34B,51B,114C,129C,168C,199C 'byte':58B,174C 'check':157C 'codec':27B,146C 'compress':4A,43B,57B,84C,106C,138C,173C 'content':182C 'content-typ':181C 'core':94C,209C 'core/lib/grpc/codec/erlpack.ex':119C 'count':54B,171C 'cve':12A,15A 'data':85C,86C 'decod':32B,152C,162C 'elixir':2A,18B,30B,91C 'elixir-grpc':1A,29B,90C 'erlang':5A,19B,107C 'erlang.binary':131C 'erlpack':26B,185C 'exhaust':7A,79B,101C 'extern':108C 'far':72B 'full':141C 'fulli':40B 'function':135C 'grpc':3A,20B,31B,92C,93C,96C,112C,118C,203C,208C 'grpc.codec.erlpack.decode':116C 'grpc.codec.erlpack.decode/2':115C 'handl':81C 'high':83C 'host':24B 'improp':80C 'inflat':41B,136C 'issu':201C 'larger':195C 'lib/grpc/codec/erlpack.ex':121C 'limit':48B,53B,149C,170C 'make':68B,188C 'max':167C 'memori':9A,74B,103C 'messag':33B,113C,128C 'much':194C 'packag':21B,124C 'pass':126C 'request':66B,77B,177C,179C,198C 'return':144C 'run':158C 'self':23B 'self-host':22B 'send':63B 'server':8A,70B,102C,165C,190C 'set':147C 'size':47B,52B,78B,153C,169C 'small':65B 'split':125C 'term':6A,38B,44B,109C,139C,163C,193C 'term/2':133C 'therefor':187C 'type':156C,183C 'unauthent':60B,98C 'via':104C 'vulner':88C 'without':10A","nicknames":[],"mitigations":[],"who_affected":"Servers built with elixir-grpc that accept gRPC requests using the Erlpack content type are exposed, since the decoder runs on any incoming message body before type checks. Applications that only use other codecs, or that do not expose gRPC to untrusted clients, can skip this.","tier":"B","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"businesses","plain_action":null,"pkeys":[],"ptokens":[],"labels":["elixir","erlang","grpc","high","package","selfhosted"],"campaign_type":null,"search_a":"'-121808':14A,17A '-2026':13A,16A 'authent':11A 'compress':4A 'cve':12A,15A 'elixir':2A 'elixir-grpc':1A 'erlang':5A 'exhaust':7A 'grpc':3A 'memori':9A 'server':8A 'term':6A 'without':10A","search_b":"'alloc':71B 'attack':61B 'binari':36B 'bodi':34B,51B 'byte':58B 'codec':27B 'compress':43B,57B 'count':54B 'decod':32B 'elixir':18B,30B 'elixir-grpc':29B 'erlang':19B 'erlpack':26B 'exhaust':79B 'far':72B 'fulli':40B 'grpc':20B,31B 'host':24B 'inflat':41B 'limit':48B,53B 'make':68B 'memori':74B 'messag':33B 'packag':21B 'request':66B,77B 'self':23B 'self-host':22B 'send':63B 'server':70B 'size':47B,52B,78B 'small':65B 'term':38B,44B 'unauthent':60B","search_c":"'/2':117C '0.4.0':205C '1.0.0':207C,211C '1.1.0':213C 'affect':202C 'alloc':191C 'allow':97C 'amplif':87C 'application/grpc':184C 'attack':99C 'bodi':114C,129C,168C,199C 'byte':174C 'check':157C 'codec':146C 'compress':84C,106C,138C,173C 'content':182C 'content-typ':181C 'core':94C,209C 'core/lib/grpc/codec/erlpack.ex':119C 'count':171C 'data':85C,86C 'decod':152C,162C 'elixir':91C 'elixir-grpc':90C 'erlang':107C 'erlang.binary':131C 'erlpack':185C 'exhaust':101C 'extern':108C 'full':141C 'function':135C 'grpc':92C,93C,96C,112C,118C,203C,208C 'grpc.codec.erlpack.decode':116C 'grpc.codec.erlpack.decode/2':115C 'handl':81C 'high':83C 'improp':80C 'inflat':136C 'issu':201C 'larger':195C 'lib/grpc/codec/erlpack.ex':121C 'limit':149C,170C 'make':188C 'max':167C 'memori':103C 'messag':113C,128C 'much':194C 'packag':124C 'pass':126C 'request':177C,179C,198C 'return':144C 'run':158C 'server':102C,165C,190C 'set':147C 'size':153C,169C 'split':125C 'term':109C,139C,163C,193C 'term/2':133C 'therefor':187C 'type':156C,183C 'unauthent':98C 'via':104C 'vulner':88C","cause_entry":null,"cause_path":null,"disclosures_checked_at":null,"first_public_at":"2026-11-12T20:47:36+00:00","kev":null,"cvss_vector":"CVSS:4.0/AV:N/AC:L/AT:P/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-121808","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-121808","severity":null,"published_at":"2026-11-13T16:17:36+00:00","modified_at":"2026-11-13T16:17:36+00:00","first_seen_at":"2026-11-13T16:47:33+00:00","fetched_at":"2026-11-13T16:47:33+00:00","note":null}],"documents":[{"id":147636,"url":"https://github.com/elixir-grpc/grpc/commit/0332faae5f5e132314794dbfdae5edecbccea292","title":"Patch: github.com","kind":"other","source":"nvd","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Patch: github.com"},{"id":147637,"url":"https://github.com/elixir-grpc/grpc/commit/25bcc569fe2cc4478531a6c546c923205fc751c9","title":"Patch: github.com","kind":"other","source":"nvd","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Patch: github.com"},{"id":147638,"url":"https://github.com/elixir-grpc/grpc/commit/d6bc56ac75dfb6c02db2099909210a37c9be8db6","title":"Patch: github.com","kind":"other","source":"nvd","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Patch: github.com"},{"id":147639,"url":"https://github.com/elixir-grpc/grpc/security/advisories/GHSA-xxp9-7hp4-rqwp","title":"Vendor advisory: github.com","kind":"vendor","source":"nvd","publisher":"vendor","text":null,"published_at":"2026-11-12T20:47:36+00:00","relation":"advisory","confidence":null,"note":"Vendor advisory: github.com"}],"disclosures":[],"exploit_sources":[],"notice":"Free to read, with fair use of about 60 pages a minute. For higher limits or API access: sales@infrastack.ai"}