{"id":"CVE-2026-81755","kind":"vulnerability","aliases":["CVE-2026-81755"],"related":[],"title":"Apache bRPC: streaming RPC lets one request exhaust server memory","description":"Uncontrolled resource consumption in the streaming RPC component of Apache bRPC (version < 1.18.0) allows a remote attacker to exhaust server memory and cause denial of service by sending a single RPC request that declares an excessive number of streams.\n\nRoot Cause:\nIn the streaming RPC feature, a client can declare multiple streams in one RPC request by putting extra stream identifiers into the repeated field `stream_settings.extra_stream_ids` of the RPC meta. On the server side, `StreamAccept` creates one response stream for every stream identifier declared by the request, without limiting the number of streams accepted in a single RPC. The request body size is only bounded by `max_body_size` (default 64MB), which is enough to carry millions of stream identifiers. Each accepted stream allocates its own bthread execution queue and associated resources, so a single crafted request can make the server create a huge number of streams and exhaust memory, leading to denial of service.\n\nAffected Scenarios:\nUse a bRPC server that serves streaming RPC and calls `StreamAccept` to accept streams from untrusted clients.\n\nHow to Fix: \n(Choose one of the following options) \n1. Upgrade bRPC to the 1.18.0 version.\n2. Apply this patch:  https://github.com/apache/brpc/pull/3493 \n\n\nNote:\nThe fix adds a new gflag `stream_max_streams_per_request` with a default value of 64. Requests declaring more streams than the limit are rejected before any response stream is created. Applications that legitimately need to accept more than 64 streams in one RPC must raise this flag; otherwise such requests will fail after applying the fix.","summary":"A single RPC request can declare a huge number of extra stream identifiers, and the server's StreamAccept creates a response stream and bthread execution queue for each one. An unauthenticated remote client can exhaust server memory and cause denial of service.","severity":"high","cvss":null,"epss":0.00233,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["brpc","c++","package","self-hosted","streaming-rpc"],"not_affected_if":["no-streaming-rpc","trusted-clients-only"],"how_to_check":"- Check the bRPC version in use, for example with `grep -ri brpc` in the build files or by inspecting the linked library version.\n- Confirm whether the server calls `StreamAccept` for streams from untrusted clients.","fix":"- Upgrade bRPC to `1.18.0` or later.\n- Alternatively, apply the patch from https://github.com/apache/brpc/pull/3493, which adds the `stream_max_streams_per_request` gflag (default `64`); raise it only if legitimate requests need more streams per RPC.","status":"open","published_at":"2026-10-21T12:17:24+00:00","first_seen_at":"2026-10-23T21:57:28+00:00","triaged_at":"2026-10-25T05:02:31+00:00","updated_at":"2026-10-25T05:02:31+00:00","category":"package","confidence":0.8,"triage":{"at":"2026-10-25T05:02:31Z","model":"claude-haiku-5-5","output":{"fix":"- Upgrade bRPC to `1.18.0` or later.\n- Alternatively, apply the patch from https://github.com/apache/brpc/pull/3493, which adds the `stream_max_streams_per_request` gflag (default `64`); raise it only if legitimate requests need more streams per RPC.","reach":"internet","title":"Apache bRPC: streaming RPC lets one request exhaust server memory","impact":"medium","summary":"A single RPC request can declare a huge number of extra stream identifiers, and the server's StreamAccept creates a response stream and bthread execution queue for each one. An unauthenticated remote client can exhaust server memory and cause denial of service.","category":"package","nicknames":[],"who_cares":["brpc","c++","streaming-rpc","self-hosted"],"confidence":0.8,"needs_auth":"no","worst_case":"Remote attacker exhausts server memory, causing denial of service","analyst_note":"","how_to_check":"- Check the bRPC version in use, for example with `grep -ri brpc` in the build files or by inspecting the linked library version.\n- Confirm whether the server calls `StreamAccept` for streams from untrusted clients.","needs_analyst":false,"not_affected_if":["no-streaming-rpc","trusted-clients-only"],"who_is_affected":"Servers built on Apache bRPC that serve streaming RPC and call StreamAccept on streams from untrusted clients are exposed. Services that do not use streaming RPC, or that only accept streams from trusted peers, can skip it.","user_interaction":"no","needs_special_setup":"yes","severity_if_unknown":"high"},"cost_usd":0.000665,"input_tokens":3802,"output_tokens":569,"severity_before":"unknown"},"analyst_status":null,"analyst_note":null,"search":"'-2026':12A,15A '-81755':13A,16A '/apache/brpc/pull/3493':266C '1':253C '1.18.0':80C,258C '2':260C '64':284C,308C '64mb':180C 'accept':163C,191C,239C,305C 'add':270C 'affect':225C 'alloc':193C 'allow':81C 'apach':1A,77C 'appli':261C,323C 'applic':300C 'associ':200C 'attack':84C 'bodi':170C,177C 'bound':174C 'brpc':2A,17B,78C,229C,255C 'bthread':49B,196C 'c':18B 'call':236C 'carri':185C 'caus':64B,90C,108C 'choos':247C 'client':58B,115C,243C 'compon':75C 'consumpt':70C 'craft':205C 'creat':44B,145C,211C,299C 'cve':11A,14A 'declar':31B,101C,117C,153C,286C 'default':179C,281C 'denial':65B,91C,222C 'enough':183C 'everi':150C 'excess':103C 'execut':50B,197C 'exhaust':8A,60B,86C,218C 'extra':36B,126C 'fail':321C 'featur':113C 'field':132C 'fix':246C,269C,325C 'flag':316C 'follow':251C 'gflag':273C 'github.com':265C 'github.com/apache/brpc/pull/3493':264C 'host':22B 'huge':33B,213C 'id':135C 'identifi':38B,128C,152C,189C 'lead':220C 'legitim':302C 'let':5A 'limit':158C,291C 'make':208C 'max':176C,275C 'memori':10A,62B,88C,219C 'meta':139C 'million':186C 'multipl':118C 'must':313C 'need':303C 'new':272C 'note':267C 'number':34B,104C,160C,214C 'one':6A,54B,121C,146C,248C,311C 'option':252C 'otherwis':317C 'packag':19B 'patch':263C 'per':277C 'put':125C 'queue':51B,198C 'rais':314C 'reject':293C 'remot':57B,83C 'repeat':131C 'request':7A,29B,99C,123C,156C,169C,206C,278C,285C,319C 'resourc':69C,201C 'respons':46B,147C,296C 'root':107C 'rpc':4A,25B,28B,74C,98C,112C,122C,138C,167C,234C,312C 'scenario':226C 'self':21B 'self-host':20B 'send':95C 'serv':232C 'server':9A,41B,61B,87C,142C,210C,230C 'servic':67B,93C,224C 'side':143C 'singl':27B,97C,166C,204C 'size':171C,178C 'stream':3A,24B,37B,47B,73C,106C,111C,119C,127C,134C,148C,151C,162C,188C,192C,216C,233C,240C,274C,276C,288C,297C,309C 'stream_settings.extra':133C 'streamaccept':43B,144C,237C 'streaming-rpc':23B 'unauthent':56B 'uncontrol':68C 'untrust':242C 'upgrad':254C 'use':227C 'valu':282C 'version':79C,259C 'without':157C","nicknames":[],"mitigations":[],"who_affected":"Servers built on Apache bRPC that serve streaming RPC and call StreamAccept on streams from untrusted clients are exposed. Services that do not use streaming RPC, or that only accept streams from trusted peers, can skip it.","tier":"B","verified":{},"analyst_revisit_at":null,"first_public_at":"2026-10-21T12:17:24+00:00","kev":null,"cvss_vector":null,"cvss_by":null,"poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-81755","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-81755","severity":null,"published_at":"2026-10-21T12:17:24+00:00","modified_at":"2026-10-22T16:56:37+00:00","first_seen_at":"2026-10-23T21:57:28+00:00","fetched_at":"2026-10-23T22:29:01+00:00","note":null},{"source":"epss","external_id":"CVE-2026-81755","url":"https://api.first.org/data/v1/epss?cve=CVE-2026-81755","severity":null,"published_at":null,"modified_at":null,"first_seen_at":"2026-10-24T13:15:54+00:00","fetched_at":"2026-10-24T13:15:54+00:00","note":null}],"documents":[],"notice":"Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai"}