{"id":"CVE-2026-121809","kind":"vulnerability","aliases":["CVE-2026-121809"],"related":[],"title":"elixir-grpc: truncated streaming request spins a BEAM scheduler forever","description":"Loop with Unreachable Exit Condition ('Infinite Loop') vulnerability in elixir-grpc grpc_server and grpc allows unauthenticated attackers to occupy a BEAM scheduler indefinitely via a client-streaming or bidirectional-streaming request whose body ends inside a gRPC message.\n\nGRPC.Server.Adapters.Cowboy.read_stream/1 (grpc_server/lib/grpc/server/adapters/cowboy.ex, and the Cowboy adapter in grpc before the package split) asks for more data whenever the buffer does not hold a complete message. Once the request body has ended, every further read returns an empty chunk, so the buffer never changes and the function retries without end. A single 5-byte length prefix sent with END_STREAM keeps one scheduler busy for as long as the connection stays open, and repeated requests exhaust all schedulers.\n\nThis issue affects grpc_server: from 1.0.0 before 1.1.0; grpc: from 0.3.1 before 1.0.0.","summary":"A client-streaming or bidirectional gRPC request whose body ends partway through a message makes the Cowboy adapter retry a read forever. Each such request pins one Erlang/BEAM scheduler for as long as the connection stays open, so repeated requests can stall the server.","severity":"high","cvss":8.2,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["beam","cowboy","elixir","grpc","package"],"not_affected_if":["no-streaming-rpcs","unary-only"],"how_to_check":"- Check the locked version of `grpc_server` (from 1.0.0 before 1.1.0) or `grpc` (from 0.3.1 before 1.0.0) in mix.lock.\n- Look for a Cowboy-based gRPC server that accepts client-streaming or bidirectional-streaming RPCs.","fix":"- `grpc_server`: move to `1.1.0` or later.\n- `grpc`: move to `1.0.0` or later.","status":"open","published_at":"2026-11-13T17:17:19+00:00","first_seen_at":"2026-11-13T17:48:00+00:00","triaged_at":"2026-11-13T17:48:48+00:00","updated_at":"2026-11-13T17:48:48+00:00","category":"package","confidence":0.8,"triage":{"at":"2026-11-13T17:48:48Z","model":"claude-haiku-5-5","output":{"fix":"- `grpc_server`: move to `1.1.0` or later.\n- `grpc`: move to `1.0.0` or later.","reach":"internet","title":"elixir-grpc: truncated streaming request spins a BEAM scheduler forever","impact":"medium","summary":"A client-streaming or bidirectional gRPC request whose body ends partway through a message makes the Cowboy adapter retry a read forever. Each such request pins one Erlang/BEAM scheduler for as long as the connection stays open, so repeated requests can stall the server.","audience":"developers","category":"package","nicknames":[],"who_cares":["elixir","grpc","cowboy","beam"],"confidence":0.8,"fix_status":"available","needs_auth":"no","worst_case":"unauthenticated clients can exhaust BEAM schedulers and stall the service","analyst_note":"NVD entry lists high 8.2 CVSS; linked patch pages not reviewed for exact fixed-version wording beyond product ranges.\n","how_to_check":"- Check the locked version of `grpc_server` (from 1.0.0 before 1.1.0) or `grpc` (from 0.3.1 before 1.0.0) in mix.lock.\n- Look for a Cowboy-based gRPC server that accepts client-streaming or bidirectional-streaming RPCs.","plain_action":"","product_name":"","needs_analyst":false,"not_affected_if":["unary-only","no-streaming-rpcs"],"who_is_affected":"Elixir services that run the grpc_server or grpc packages with the Cowboy adapter and expose client-streaming or bidirectional-streaming RPCs are exposed. The request needs no authentication, so any client that can reach the endpoint can trigger it. Services that only use unary RPCs or do not run the Cowboy adapter are not affected by the described path.","user_interaction":"no","product_ecosystem":"","needs_special_setup":"yes","severity_if_unknown":"unknown"},"cost_usd":0.00082,"input_tokens":4864,"output_tokens":667,"severity_before":"high"},"analyst_status":null,"analyst_note":null,"search":"'-121809':14A,17A '-2026':13A,16A '0.3.1':200C '1.0.0':195C,202C '1.1.0':197C '5':163C 'adapt':41B,117C 'affect':191C 'allow':84C 'ask':124C 'attack':86C 'beam':9A,18B,90C 'bidirect':28B,100C 'bidirectional-stream':99C 'bodi':32B,104C,140C 'buffer':130C,152C 'busi':174C 'byte':164C 'chang':154C 'chunk':149C 'client':25B,96C 'client-stream':24B,95C 'complet':135C 'condit':72C 'connect':58B,180C 'cowboy':19B,40B,116C 'cve':12A,15A 'data':127C 'elixir':2A,20B,78C 'elixir-grpc':1A,77C 'empti':148C 'end':33B,105C,142C,160C,169C 'erlang/beam':51B 'everi':143C 'exhaust':186C 'exit':71C 'forev':11A,45B 'function':157C 'grpc':3A,21B,29B,79C,80C,83C,108C,112C,119C,192C,198C 'grpc.server.adapters.cowboy.read':110C 'hold':133C 'indefinit':92C 'infinit':73C 'insid':106C 'issu':190C 'keep':171C 'length':165C 'long':55B,177C 'loop':68C,74C 'make':38B 'messag':37B,109C,136C 'never':153C 'occupi':88C 'one':50B,172C 'open':60B,182C 'packag':22B,122C 'partway':34B 'pin':49B 'prefix':166C 'read':44B,145C 'repeat':62B,184C 'request':6A,30B,48B,63B,102C,139C,185C 'retri':42B,158C 'return':146C 'schedul':10A,52B,91C,173C,188C 'sent':167C 'server':67B,81C,193C 'server/lib/grpc/server/adapters/cowboy.ex':113C 'singl':162C 'spin':7A 'split':123C 'stall':65B 'stay':59B,181C 'stream':5A,26B,97C,101C,170C 'stream/1':111C 'truncat':4A 'unauthent':85C 'unreach':70C 'via':93C 'vulner':75C 'whenev':128C 'whose':31B,103C 'without':159C","nicknames":[],"mitigations":[],"who_affected":"Elixir services that run the grpc_server or grpc packages with the Cowboy adapter and expose client-streaming or bidirectional-streaming RPCs are exposed. The request needs no authentication, so any client that can reach the endpoint can trigger it. Services that only use unary RPCs or do not run the Cowboy adapter are not affected by the described path.","tier":"B","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"developers","plain_action":null,"pkeys":[],"ptokens":[],"labels":["beam","cowboy","elixir","grpc","high","package"],"campaign_type":null,"search_a":"'-121809':14A,17A '-2026':13A,16A 'beam':9A 'cve':12A,15A 'elixir':2A 'elixir-grpc':1A 'forev':11A 'grpc':3A 'request':6A 'schedul':10A 'spin':7A 'stream':5A 'truncat':4A","search_b":"'adapt':41B 'beam':18B 'bidirect':28B 'bodi':32B 'client':25B 'client-stream':24B 'connect':58B 'cowboy':19B,40B 'elixir':20B 'end':33B 'erlang/beam':51B 'forev':45B 'grpc':21B,29B 'long':55B 'make':38B 'messag':37B 'one':50B 'open':60B 'packag':22B 'partway':34B 'pin':49B 'read':44B 'repeat':62B 'request':30B,48B,63B 'retri':42B 'schedul':52B 'server':67B 'stall':65B 'stay':59B 'stream':26B 'whose':31B","search_c":"'0.3.1':200C '1.0.0':195C,202C '1.1.0':197C '5':163C 'adapt':117C 'affect':191C 'allow':84C 'ask':124C 'attack':86C 'beam':90C 'bidirect':100C 'bidirectional-stream':99C 'bodi':104C,140C 'buffer':130C,152C 'busi':174C 'byte':164C 'chang':154C 'chunk':149C 'client':96C 'client-stream':95C 'complet':135C 'condit':72C 'connect':180C 'cowboy':116C 'data':127C 'elixir':78C 'elixir-grpc':77C 'empti':148C 'end':105C,142C,160C,169C 'everi':143C 'exhaust':186C 'exit':71C 'function':157C 'grpc':79C,80C,83C,108C,112C,119C,192C,198C 'grpc.server.adapters.cowboy.read':110C 'hold':133C 'indefinit':92C 'infinit':73C 'insid':106C 'issu':190C 'keep':171C 'length':165C 'long':177C 'loop':68C,74C 'messag':109C,136C 'never':153C 'occupi':88C 'one':172C 'open':182C 'packag':122C 'prefix':166C 'read':145C 'repeat':184C 'request':102C,139C,185C 'retri':158C 'return':146C 'schedul':91C,173C,188C 'sent':167C 'server':81C,193C 'server/lib/grpc/server/adapters/cowboy.ex':113C 'singl':162C 'split':123C 'stay':181C 'stream':97C,101C,170C 'stream/1':111C 'unauthent':85C 'unreach':70C 'via':93C 'vulner':75C 'whenev':128C 'whose':103C 'without':159C","cause_entry":null,"cause_path":null,"disclosures_checked_at":null,"first_public_at":"2026-11-13T15:29:40+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-121809","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-121809","severity":null,"published_at":"2026-11-13T17:17:19+00:00","modified_at":"2026-11-13T17:17:19+00:00","first_seen_at":"2026-11-13T17:48:00+00:00","fetched_at":"2026-11-13T17:48:00+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":148068,"url":"https://github.com/elixir-grpc/grpc/commit/38955f1392cbf08eef231a347348445410455c85","title":"Patch: github.com","kind":"other","source":"nvd","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Patch: github.com"},{"id":148069,"url":"https://github.com/elixir-grpc/grpc/commit/6d8a09ad919e208fb600538ac8b19bd733a04310","title":"Patch: github.com","kind":"other","source":"nvd","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Patch: github.com"},{"id":148070,"url":"https://github.com/elixir-grpc/grpc/security/advisories/GHSA-c2h9-f9cc-27xh","title":"Vendor advisory: github.com","kind":"vendor","source":"nvd","publisher":"vendor","text":null,"published_at":"2026-11-13T15:29:40+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"}