{"api_version":"1","generated_at":"2026-11-13T23:02:28+00:00","cve":"CVE-2026-124278","urls":{"html":"https://cve.report/CVE-2026-124278","api":"https://cve.report/api/cve/CVE-2026-124278.json","docs":"https://cve.report/api","cve_org":"https://www.cve.org/CVERecord?id=CVE-2026-124278","nvd":"https://nvd.nist.gov/vuln/detail/CVE-2026-124278"},"summary":{"title":"Path bindings ignored for gRPC Content-Types on transcoded routes in elixir-grpc grpc_server","description":"Authorization Bypass Through User-Controlled Key vulnerability in elixir-grpc grpc_server and grpc allows an attacker to make a handler act on a resource other than the one named in the URL of an HTTP-transcoded route, via a request with a gRPC Content-Type.\n\nOnly the transcoding clause of GRPC.Server.do_handle_request/4 (grpc_server/lib/grpc/server.ex, and lib/grpc/server.ex before the package split) applies the route's path bindings to the request message. The Cowboy handler picks that clause from the request Content-Type, not from the route. A request to a transcoded URL with application/grpc or application/grpc-web is decoded from the body alone, so every path-bound field takes its value from the body. A gateway, proxy rule or WAF that authorizes on the URL path sees one resource while the handler receives another.\n\nThis issue affects grpc_server: from 1.0.0 before 1.1.0; grpc: from 0.8.0 before 1.0.0.","state":"PUBLISHED","assigner":"EEF","published_at":"2026-11-13 16:17:39","updated_at":"2026-11-13 16:17:39"},"problem_types":["CWE-436","CWE-639","CWE-436 CWE-436 Interpretation Conflict","CWE-639 CWE-639 Authorization Bypass Through User-Controlled Key"],"metrics":[{"version":"4.0","source":"6b3ad84c-e1a6-4bf7-a703-f496b71e49db","type":"Secondary","score":"7.6","severity":"HIGH","vector":"CVSS:4.0/AV:N/AC:L/AT:P/PR:L/UI:N/VC:H/VI:H/VA:N/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","data":{"version":"4.0","vectorString":"CVSS:4.0/AV:N/AC:L/AT:P/PR:L/UI:N/VC:H/VI:H/VA:N/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","baseScore":7.6,"baseSeverity":"HIGH","attackVector":"NETWORK","attackComplexity":"LOW","attackRequirements":"PRESENT","privilegesRequired":"LOW","userInteraction":"NONE","vulnConfidentialityImpact":"HIGH","vulnIntegrityImpact":"HIGH","vulnAvailabilityImpact":"NONE","subConfidentialityImpact":"NONE","subIntegrityImpact":"NONE","subAvailabilityImpact":"NONE","exploitMaturity":"NOT_DEFINED","confidentialityRequirement":"NOT_DEFINED","integrityRequirement":"NOT_DEFINED","availabilityRequirement":"NOT_DEFINED","modifiedAttackVector":"NOT_DEFINED","modifiedAttackComplexity":"NOT_DEFINED","modifiedAttackRequirements":"NOT_DEFINED","modifiedPrivilegesRequired":"NOT_DEFINED","modifiedUserInteraction":"NOT_DEFINED","modifiedVulnConfidentialityImpact":"NOT_DEFINED","modifiedVulnIntegrityImpact":"NOT_DEFINED","modifiedVulnAvailabilityImpact":"NOT_DEFINED","modifiedSubConfidentialityImpact":"NOT_DEFINED","modifiedSubIntegrityImpact":"NOT_DEFINED","modifiedSubAvailabilityImpact":"NOT_DEFINED","Safety":"NOT_DEFINED","Automatable":"NOT_DEFINED","Recovery":"NOT_DEFINED","valueDensity":"NOT_DEFINED","vulnerabilityResponseEffort":"NOT_DEFINED","providerUrgency":"NOT_DEFINED"}},{"version":"4.0","source":"CNA","type":"CVSS","score":"7.6","severity":"HIGH","vector":"CVSS:4.0/AV:N/AC:L/AT:P/PR:L/UI:N/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N","data":{"Automatable":"NOT_DEFINED","Recovery":"NOT_DEFINED","Safety":"NOT_DEFINED","attackComplexity":"LOW","attackRequirements":"PRESENT","attackVector":"NETWORK","baseScore":7.6,"baseSeverity":"HIGH","privilegesRequired":"LOW","providerUrgency":"NOT_DEFINED","subAvailabilityImpact":"NONE","subConfidentialityImpact":"NONE","subIntegrityImpact":"NONE","userInteraction":"NONE","valueDensity":"NOT_DEFINED","vectorString":"CVSS:4.0/AV:N/AC:L/AT:P/PR:L/UI:N/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N","version":"4.0","vulnAvailabilityImpact":"NONE","vulnConfidentialityImpact":"HIGH","vulnIntegrityImpact":"HIGH","vulnerabilityResponseEffort":"NOT_DEFINED"}}],"references":[{"url":"https://github.com/elixir-grpc/grpc/commit/0332faae5f5e132314794dbfdae5edecbccea292","name":"https://github.com/elixir-grpc/grpc/commit/0332faae5f5e132314794dbfdae5edecbccea292","refsource":"6b3ad84c-e1a6-4bf7-a703-f496b71e49db","tags":[],"title":"","mime":"","httpstatus":"","archivestatus":"0"},{"url":"https://github.com/elixir-grpc/grpc/security/advisories/GHSA-xc5v-89vq-hv5m","name":"https://github.com/elixir-grpc/grpc/security/advisories/GHSA-xc5v-89vq-hv5m","refsource":"6b3ad84c-e1a6-4bf7-a703-f496b71e49db","tags":[],"title":"","mime":"","httpstatus":"","archivestatus":"0"},{"url":"https://cna.erlef.org/cves/CVE-2026-124278.html","name":"https://cna.erlef.org/cves/CVE-2026-124278.html","refsource":"6b3ad84c-e1a6-4bf7-a703-f496b71e49db","tags":[],"title":"","mime":"","httpstatus":"","archivestatus":"0"},{"url":"https://github.com/elixir-grpc/grpc/commit/8aaf3d3a8c4c7b08ac65e9c6f254e0d24da1d048","name":"https://github.com/elixir-grpc/grpc/commit/8aaf3d3a8c4c7b08ac65e9c6f254e0d24da1d048","refsource":"6b3ad84c-e1a6-4bf7-a703-f496b71e49db","tags":[],"title":"","mime":"","httpstatus":"","archivestatus":"0"},{"url":"https://github.com/elixir-grpc/grpc/commit/953ab980d8a127e895d3ab9505fc4b9337bb32f7","name":"https://github.com/elixir-grpc/grpc/commit/953ab980d8a127e895d3ab9505fc4b9337bb32f7","refsource":"6b3ad84c-e1a6-4bf7-a703-f496b71e49db","tags":[],"title":"","mime":"","httpstatus":"","archivestatus":"0"},{"url":"https://osv.dev/vulnerability/EEF-CVE-2026-124278","name":"https://osv.dev/vulnerability/EEF-CVE-2026-124278","refsource":"6b3ad84c-e1a6-4bf7-a703-f496b71e49db","tags":[],"title":"","mime":"","httpstatus":"","archivestatus":"0"},{"url":"https://www.cve.org/CVERecord?id=CVE-2026-124278","name":"CVE Program record","refsource":"CVE.ORG","tags":["canonical"]},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2026-124278","name":"NVD vulnerability detail","refsource":"NVD","tags":["canonical","analysis"]}],"affected":[{"source":"CNA","vendor":"elixir-grpc","product":"grpc_server","version":"affected 1.0.0 1.1.0 semver","platforms":[]},{"source":"CNA","vendor":"elixir-grpc","product":"grpc_server","version":"affected 0332faae5f5e132314794dbfdae5edecbccea292 953ab980d8a127e895d3ab9505fc4b9337bb32f7 git","platforms":[]},{"source":"CNA","vendor":"elixir-grpc","product":"grpc","version":"affected 0.8.0 1.0.0 semver","platforms":[]},{"source":"CNA","vendor":"elixir-grpc","product":"grpc","version":"affected 8aaf3d3a8c4c7b08ac65e9c6f254e0d24da1d048 0332faae5f5e132314794dbfdae5edecbccea292 git","platforms":[]}],"timeline":[],"solutions":[],"workarounds":[],"exploits":[],"credits":[{"source":"CNA","value":"Eurico Nicacio","lang":"en"},{"source":"CNA","value":"Eurico Nicacio","lang":"en"},{"source":"CNA","value":"Paulo Valente","lang":"en"},{"source":"CNA","value":"Peter Ullrich","lang":"en"},{"source":"CNA","value":"Jonatan Männchen / EEF","lang":"en"}],"nvd_cpes":[],"vendor_comments":[],"enrichments":{"kev":null,"epss":null,"legacy_qids":[]},"source_records":{"cve_program":{"containers":{"cna":{"affected":[{"collectionURL":"https://repo.hex.pm","cpes":["cpe:2.3:a:elixir-grpc:grpc_server:*:*:*:*:*:*:*:*"],"defaultStatus":"unaffected","modules":["'Elixir.GRPC.Server'","'Elixir.GRPC.Server.Adapters.Cowboy.Handler'"],"packageName":"grpc_server","packageURL":"pkg:hex/grpc_server","product":"grpc_server","programFiles":["lib/grpc/server.ex","lib/grpc/server/adapters/cowboy/handler.ex"],"programRoutines":[{"name":"'Elixir.GRPC.Server':do_handle_request/4"},{"name":"'Elixir.GRPC.Server.Adapters.Cowboy.Handler':init/2"}],"repo":"https://github.com/elixir-grpc/grpc","vendor":"elixir-grpc","versions":[{"lessThan":"1.1.0","status":"affected","version":"1.0.0","versionType":"semver"}]},{"collectionURL":"https://github.com","cpes":["cpe:2.3:a:elixir-grpc:grpc_server:*:*:*:*:*:*:*:*"],"defaultStatus":"unaffected","modules":["'Elixir.GRPC.Server'","'Elixir.GRPC.Server.Adapters.Cowboy.Handler'"],"packageName":"elixir-grpc/grpc","packageURL":"pkg:github/elixir-grpc/grpc","product":"grpc_server","programFiles":["grpc_server/lib/grpc/server.ex","grpc_server/lib/grpc/server/adapters/cowboy/handler.ex"],"programRoutines":[{"name":"'Elixir.GRPC.Server':do_handle_request/4"},{"name":"'Elixir.GRPC.Server.Adapters.Cowboy.Handler':init/2"}],"repo":"https://github.com/elixir-grpc/grpc","vendor":"elixir-grpc","versions":[{"lessThan":"953ab980d8a127e895d3ab9505fc4b9337bb32f7","status":"affected","version":"0332faae5f5e132314794dbfdae5edecbccea292","versionType":"git"}]},{"collectionURL":"https://repo.hex.pm","cpes":["cpe:2.3:a:elixir-grpc:grpc:*:*:*:*:*:*:*:*"],"defaultStatus":"unaffected","modules":["'Elixir.GRPC.Server'","'Elixir.GRPC.Server.Adapters.Cowboy.Handler'"],"packageName":"grpc","packageURL":"pkg:hex/grpc","product":"grpc","programFiles":["lib/grpc/server.ex","lib/grpc/server/adapters/cowboy/handler.ex"],"programRoutines":[{"name":"'Elixir.GRPC.Server':do_handle_request/4"},{"name":"'Elixir.GRPC.Server.Adapters.Cowboy.Handler':init/2"}],"repo":"https://github.com/elixir-grpc/grpc","vendor":"elixir-grpc","versions":[{"lessThan":"1.0.0","status":"affected","version":"0.8.0","versionType":"semver"}]},{"collectionURL":"https://github.com","cpes":["cpe:2.3:a:elixir-grpc:grpc:*:*:*:*:*:*:*:*"],"defaultStatus":"unaffected","modules":["'Elixir.GRPC.Server'","'Elixir.GRPC.Server.Adapters.Cowboy.Handler'"],"packageName":"elixir-grpc/grpc","packageURL":"pkg:github/elixir-grpc/grpc","product":"grpc","programFiles":["lib/grpc/server.ex","lib/grpc/server/adapters/cowboy/handler.ex"],"programRoutines":[{"name":"'Elixir.GRPC.Server':do_handle_request/4"},{"name":"'Elixir.GRPC.Server.Adapters.Cowboy.Handler':init/2"}],"repo":"https://github.com/elixir-grpc/grpc","vendor":"elixir-grpc","versions":[{"lessThan":"0332faae5f5e132314794dbfdae5edecbccea292","status":"affected","version":"8aaf3d3a8c4c7b08ac65e9c6f254e0d24da1d048","versionType":"git"}]}],"configurations":[{"lang":"en","supportingMedia":[{"base64":false,"type":"text/html","value":"<p>HTTP-to-gRPC transcoding must be enabled with <code>http_transcode: true</code>. Access to a resource must be decided from the URL path rather than from the decoded request, for example by an API gateway, proxy rule or WAF in front of the server.</p>"},{"base64":false,"type":"text/markdown","value":"HTTP-to-gRPC transcoding must be enabled with `http_transcode: true`. Access to a resource must be decided from the URL path rather than from the decoded request, for example by an API gateway, proxy rule or WAF in front of the server."}],"value":"HTTP-to-gRPC transcoding must be enabled with http_transcode: true. Access to a resource must be decided from the URL path rather than from the decoded request, for example by an API gateway, proxy rule or WAF in front of the server."}],"cpeApplicability":[{"nodes":[{"cpeMatch":[{"criteria":"cpe:2.3:a:elixir-grpc:grpc_server:*:*:*:*:*:*:*:*","versionEndExcluding":"1.1.0","versionStartIncluding":"1.0.0","vulnerable":true},{"criteria":"cpe:2.3:a:elixir-grpc:grpc:*:*:*:*:*:*:*:*","versionEndExcluding":"1.0.0","versionStartIncluding":"0.8.0","vulnerable":true}],"negate":false,"operator":"OR"}],"operator":"AND"}],"credits":[{"lang":"en","type":"reporter","value":"Eurico Nicacio"},{"lang":"en","type":"finder","value":"Eurico Nicacio"},{"lang":"en","type":"remediation developer","value":"Paulo Valente"},{"lang":"en","type":"coordinator","value":"Peter Ullrich"},{"lang":"en","type":"coordinator","value":"Jonatan Männchen / EEF"}],"dateAssigned":"2026-11-13T11:18:41.000Z","descriptions":[{"lang":"en","supportingMedia":[{"base64":false,"type":"text/html","value":"<p>Authorization Bypass Through User-Controlled Key vulnerability in elixir-grpc grpc_server and grpc allows an attacker to make a handler act on a resource other than the one named in the URL of an HTTP-transcoded route, via a request with a gRPC Content-Type.</p>\n<p>Only the transcoding clause of <code>GRPC.Server.do_handle_request/4</code> (<code>grpc_server/lib/grpc/server.ex</code>, and <code>lib/grpc/server.ex</code> before the package split) applies the route's path bindings to the request message. The Cowboy handler picks that clause from the request <code>Content-Type</code>, not from the route. A request to a transcoded URL with <code>application/grpc</code> or <code>application/grpc-web</code> is decoded from the body alone, so every path-bound field takes its value from the body. A gateway, proxy rule or WAF that authorizes on the URL path sees one resource while the handler receives another.</p>\n<p>This issue affects grpc_server: from 1.0.0 before 1.1.0; grpc: from 0.8.0 before 1.0.0.</p>"},{"base64":false,"type":"text/markdown","value":"Authorization Bypass Through User-Controlled Key vulnerability in elixir-grpc grpc_server and grpc allows an attacker to make a handler act on a resource other than the one named in the URL of an HTTP-transcoded route, via a request with a gRPC Content-Type.\n\nOnly the transcoding clause of `GRPC.Server.do_handle_request/4` (`grpc_server/lib/grpc/server.ex`, and `lib/grpc/server.ex` before the package split) applies the route's path bindings to the request message. The Cowboy handler picks that clause from the request `Content-Type`, not from the route. A request to a transcoded URL with `application/grpc` or `application/grpc-web` is decoded from the body alone, so every path-bound field takes its value from the body. A gateway, proxy rule or WAF that authorizes on the URL path sees one resource while the handler receives another.\n\nThis issue affects grpc_server: from 1.0.0 before 1.1.0; grpc: from 0.8.0 before 1.0.0."}],"value":"Authorization Bypass Through User-Controlled Key vulnerability in elixir-grpc grpc_server and grpc allows an attacker to make a handler act on a resource other than the one named in the URL of an HTTP-transcoded route, via a request with a gRPC Content-Type.\n\nOnly the transcoding clause of GRPC.Server.do_handle_request/4 (grpc_server/lib/grpc/server.ex, and lib/grpc/server.ex before the package split) applies the route's path bindings to the request message. The Cowboy handler picks that clause from the request Content-Type, not from the route. A request to a transcoded URL with application/grpc or application/grpc-web is decoded from the body alone, so every path-bound field takes its value from the body. A gateway, proxy rule or WAF that authorizes on the URL path sees one resource while the handler receives another.\n\nThis issue affects grpc_server: from 1.0.0 before 1.1.0; grpc: from 0.8.0 before 1.0.0."}],"impacts":[{"capecId":"CAPEC-460","descriptions":[{"lang":"en","supportingMedia":[{"base64":false,"type":"text/html","value":"<p>An attacker whose requests are authorized by URL path can make the handler read or modify a resource the path does not name, such as another tenant's data.</p>"},{"base64":false,"type":"text/markdown","value":"An attacker whose requests are authorized by URL path can make the handler read or modify a resource the path does not name, such as another tenant's data."}],"value":"An attacker whose requests are authorized by URL path can make the handler read or modify a resource the path does not name, such as another tenant's data."}]}],"metrics":[{"cvssV4_0":{"Automatable":"NOT_DEFINED","Recovery":"NOT_DEFINED","Safety":"NOT_DEFINED","attackComplexity":"LOW","attackRequirements":"PRESENT","attackVector":"NETWORK","baseScore":7.6,"baseSeverity":"HIGH","privilegesRequired":"LOW","providerUrgency":"NOT_DEFINED","subAvailabilityImpact":"NONE","subConfidentialityImpact":"NONE","subIntegrityImpact":"NONE","userInteraction":"NONE","valueDensity":"NOT_DEFINED","vectorString":"CVSS:4.0/AV:N/AC:L/AT:P/PR:L/UI:N/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N","version":"4.0","vulnAvailabilityImpact":"NONE","vulnConfidentialityImpact":"HIGH","vulnIntegrityImpact":"HIGH","vulnerabilityResponseEffort":"NOT_DEFINED"},"format":"CVSS","scenarios":[{"lang":"en","value":"GENERAL"}]}],"problemTypes":[{"descriptions":[{"cweId":"CWE-436","description":"CWE-436 Interpretation Conflict","lang":"en","type":"CWE"}]},{"descriptions":[{"cweId":"CWE-639","description":"CWE-639 Authorization Bypass Through User-Controlled Key","lang":"en","type":"CWE"}]}],"providerMetadata":{"dateUpdated":"2026-11-13T15:58:08.134Z","orgId":"6b3ad84c-e1a6-4bf7-a703-f496b71e49db","shortName":"EEF"},"references":[{"name":"Path bindings ignored for gRPC Content-Types on transcoded routes in elixir-grpc grpc_server","tags":["vendor-advisory","related"],"url":"https://github.com/elixir-grpc/grpc/security/advisories/GHSA-xc5v-89vq-hv5m"},{"name":"EEF CNA record for CVE-2026-124278","tags":["related"],"url":"https://cna.erlef.org/cves/CVE-2026-124278.html"},{"name":"OSV record EEF-CVE-2026-124278","tags":["related"],"url":"https://osv.dev/vulnerability/EEF-CVE-2026-124278"},{"name":"Introducing commit 0332faa in elixir-grpc/grpc","tags":["related"],"url":"https://github.com/elixir-grpc/grpc/commit/0332faae5f5e132314794dbfdae5edecbccea292"},{"name":"Fix commit 953ab98 in elixir-grpc/grpc","tags":["patch"],"url":"https://github.com/elixir-grpc/grpc/commit/953ab980d8a127e895d3ab9505fc4b9337bb32f7"},{"name":"Introducing commit 8aaf3d3 in elixir-grpc/grpc","tags":["related"],"url":"https://github.com/elixir-grpc/grpc/commit/8aaf3d3a8c4c7b08ac65e9c6f254e0d24da1d048"}],"source":{"discovery":"EXTERNAL"},"title":"Path bindings ignored for gRPC Content-Types on transcoded routes in elixir-grpc grpc_server","x_proofOfConcept":[{"lang":"en","supportingMedia":[{"base64":false,"type":"text/html","value":"<ol>\n<li>Start a server with <code>http_transcode: true</code> and a transcoded route that binds a field from the path, for example <code>GET /v1/messages/{name}</code>.</li>\n<li>Build a gRPC frame whose message sets <code>name</code> to <code>victim</code>.</li>\n<li>Send it over HTTP/1.1 as <code>GET /v1/messages/alice</code> with <code>Content-Type: application/grpc</code>.</li>\n<li>Observe that the handler receives <code>name</code> set to <code>victim</code>, not <code>alice</code>.</li>\n</ol>"},{"base64":false,"type":"text/markdown","value":"1. Start a server with `http_transcode: true` and a transcoded route that binds a field from the path, for example `GET /v1/messages/{name}`.\n2. Build a gRPC frame whose message sets `name` to `victim`.\n3. Send it over HTTP/1.1 as `GET /v1/messages/alice` with `Content-Type: application/grpc`.\n4. Observe that the handler receives `name` set to `victim`, not `alice`."}],"value":"* Start a server with http_transcode: true and a transcoded route that binds a field from the path, for example GET /v1/messages/{name}.\n* Build a gRPC frame whose message sets name to victim.\n* Send it over HTTP/1.1 as GET /v1/messages/alice with Content-Type: application/grpc.\n* Observe that the handler receives name set to victim, not alice."}],"x_technicalAnalysis":[{"lang":"en","supportingMedia":[{"base64":false,"type":"text/html","value":"<p><strong>1. The header selects the clause</strong></p>\n<p>The Cowboy handler derives the access mode from the request <code>Content-Type</code>. <code>application/json</code> selects <code>:http_transcoding</code>, <code>application/grpc</code> selects <code>:grpc</code> and <code>application/grpc-web+proto</code> selects <code>:grpcweb</code>. The router still matches the transcoded URL template and extracts its path bindings.</p>\n<p><strong>2. Bindings are applied in one clause only</strong></p>\n<p><code>GRPC.Server.do_handle_request/4</code> reads the bindings with <code>adapter.get_bindings/1</code> and merges them through <code>GRPC.Server.Transcode.map_request/5</code> only in the <code>:http_transcoding</code> clause. The unary and request-streaming clauses decode the body alone with the selected codec. <code>GRPC.Codec.Proto</code> is in the default codecs of every server, so <code>application/grpc</code> is always accepted.</p>\n<p><strong>3. The HTTP/1.1 guard never matches</strong></p>\n<p><code>resolve_access_mode/3</code> has a clause that forces transcoding for HTTP/1.1 requests. It matches the version as the binary <code>\"HTTP/1.1\"</code>, while Cowboy stores the version as an atom, so the clause never applies and the request works over plain HTTP/1.1.</p>\n<p><strong>4. Result</strong></p>\n<p>A request to <code>/v1/messages/alice</code> with <code>Content-Type: application/grpc</code> and a message that sets <code>name</code> to <code>victim</code> reaches the handler with <code>name</code> set to <code>victim</code>. With an empty message the field is empty: the path binding is never consulted.</p>"},{"base64":false,"type":"text/markdown","value":"**1. The header selects the clause**\n\nThe Cowboy handler derives the access mode from the request `Content-Type`. `application/json` selects `:http_transcoding`, `application/grpc` selects `:grpc` and `application/grpc-web+proto` selects `:grpcweb`. The router still matches the transcoded URL template and extracts its path bindings.\n\n**2. Bindings are applied in one clause only**\n\n`GRPC.Server.do_handle_request/4` reads the bindings with `adapter.get_bindings/1` and merges them through `GRPC.Server.Transcode.map_request/5` only in the `:http_transcoding` clause. The unary and request-streaming clauses decode the body alone with the selected codec. `GRPC.Codec.Proto` is in the default codecs of every server, so `application/grpc` is always accepted.\n\n**3. The HTTP/1.1 guard never matches**\n\n`resolve_access_mode/3` has a clause that forces transcoding for HTTP/1.1 requests. It matches the version as the binary `\"HTTP/1.1\"`, while Cowboy stores the version as an atom, so the clause never applies and the request works over plain HTTP/1.1.\n\n**4. Result**\n\nA request to `/v1/messages/alice` with `Content-Type: application/grpc` and a message that sets `name` to `victim` reaches the handler with `name` set to `victim`. With an empty message the field is empty: the path binding is never consulted."}],"value":"1. The header selects the clause\n\nThe Cowboy handler derives the access mode from the request Content-Type. application/json selects :http_transcoding, application/grpc selects :grpc and application/grpc-web+proto selects :grpcweb. The router still matches the transcoded URL template and extracts its path bindings.\n\n2. Bindings are applied in one clause only\n\nGRPC.Server.do_handle_request/4 reads the bindings with adapter.get_bindings/1 and merges them through GRPC.Server.Transcode.map_request/5 only in the :http_transcoding clause. The unary and request-streaming clauses decode the body alone with the selected codec. GRPC.Codec.Proto is in the default codecs of every server, so application/grpc is always accepted.\n\n3. The HTTP/1.1 guard never matches\n\nresolve_access_mode/3 has a clause that forces transcoding for HTTP/1.1 requests. It matches the version as the binary \"HTTP/1.1\", while Cowboy stores the version as an atom, so the clause never applies and the request works over plain HTTP/1.1.\n\n4. Result\n\nA request to /v1/messages/alice with Content-Type: application/grpc and a message that sets name to victim reaches the handler with name set to victim. With an empty message the field is empty: the path binding is never consulted."}]}},"cveMetadata":{"assignerOrgId":"6b3ad84c-e1a6-4bf7-a703-f496b71e49db","assignerShortName":"EEF","cveId":"CVE-2026-124278","datePublished":"2026-11-13T15:58:08.134Z","dateReserved":"2026-11-09T23:03:52.038Z","dateUpdated":"2026-11-13T15:58:08.134Z","state":"PUBLISHED"},"dataType":"CVE_RECORD","dataVersion":"5.2"},"nvd":{"publishedDate":"2026-11-13 16:17:39","lastModifiedDate":"2026-11-13 16:17:39","problem_types":["CWE-436","CWE-639","CWE-436 CWE-436 Interpretation Conflict","CWE-639 CWE-639 Authorization Bypass Through User-Controlled Key"],"metrics":{"cvssMetricV40":[{"source":"6b3ad84c-e1a6-4bf7-a703-f496b71e49db","type":"Secondary","cvssData":{"version":"4.0","vectorString":"CVSS:4.0/AV:N/AC:L/AT:P/PR:L/UI:N/VC:H/VI:H/VA:N/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","baseScore":7.6,"baseSeverity":"HIGH","attackVector":"NETWORK","attackComplexity":"LOW","attackRequirements":"PRESENT","privilegesRequired":"LOW","userInteraction":"NONE","vulnConfidentialityImpact":"HIGH","vulnIntegrityImpact":"HIGH","vulnAvailabilityImpact":"NONE","subConfidentialityImpact":"NONE","subIntegrityImpact":"NONE","subAvailabilityImpact":"NONE","exploitMaturity":"NOT_DEFINED","confidentialityRequirement":"NOT_DEFINED","integrityRequirement":"NOT_DEFINED","availabilityRequirement":"NOT_DEFINED","modifiedAttackVector":"NOT_DEFINED","modifiedAttackComplexity":"NOT_DEFINED","modifiedAttackRequirements":"NOT_DEFINED","modifiedPrivilegesRequired":"NOT_DEFINED","modifiedUserInteraction":"NOT_DEFINED","modifiedVulnConfidentialityImpact":"NOT_DEFINED","modifiedVulnIntegrityImpact":"NOT_DEFINED","modifiedVulnAvailabilityImpact":"NOT_DEFINED","modifiedSubConfidentialityImpact":"NOT_DEFINED","modifiedSubIntegrityImpact":"NOT_DEFINED","modifiedSubAvailabilityImpact":"NOT_DEFINED","Safety":"NOT_DEFINED","Automatable":"NOT_DEFINED","Recovery":"NOT_DEFINED","valueDensity":"NOT_DEFINED","vulnerabilityResponseEffort":"NOT_DEFINED","providerUrgency":"NOT_DEFINED"}}]},"configurations":[]},"legacy_mitre":{"record":{"CveYear":"2026","CveId":"124278","Ordinal":"1","Title":"Path bindings ignored for gRPC Content-Types on transcoded route","CVE":"CVE-2026-124278","Year":"2026"},"notes":[{"CveYear":"2026","CveId":"124278","Ordinal":"1","NoteData":"Authorization Bypass Through User-Controlled Key vulnerability in elixir-grpc grpc_server and grpc allows an attacker to make a handler act on a resource other than the one named in the URL of an HTTP-transcoded route, via a request with a gRPC Content-Type.\n\nOnly the transcoding clause of GRPC.Server.do_handle_request/4 (grpc_server/lib/grpc/server.ex, and lib/grpc/server.ex before the package split) applies the route's path bindings to the request message. The Cowboy handler picks that clause from the request Content-Type, not from the route. A request to a transcoded URL with application/grpc or application/grpc-web is decoded from the body alone, so every path-bound field takes its value from the body. A gateway, proxy rule or WAF that authorizes on the URL path sees one resource while the handler receives another.\n\nThis issue affects grpc_server: from 1.0.0 before 1.1.0; grpc: from 0.8.0 before 1.0.0.","Type":"Description","Title":"Path bindings ignored for gRPC Content-Types on transcoded route"}]}}}