CVE-2026-124278 (GCVE-0-2026-124278)
Vulnerability from cvelistv5 – Published: 2026-11-13 15:58 – Updated: 2026-11-13 15:58| URL | Tags |
|---|---|
| https://github.com/elixir-grpc/grpc/security/advi… | vendor-advisoryrelated |
| https://cna.erlef.org/cves/CVE-2026-124278.html | related |
| https://osv.dev/vulnerability/EEF-CVE-2026-124278 | related |
| https://github.com/elixir-grpc/grpc/commit/0332fa… | related |
| https://github.com/elixir-grpc/grpc/commit/953ab9… | patch |
| https://github.com/elixir-grpc/grpc/commit/8aaf3d… | related |
| Vendor | Product | Version | CPE status | |
|---|---|---|---|---|
| elixir-grpc | grpc_server |
Affected:
1.0.0 , < 1.1.0
(semver)
cpe:2.3:a:elixir-grpc:grpc_server:*:*:*:*:*:*:*:* |
||
| elixir-grpc | grpc_server |
Affected:
0332faae5f5e132314794dbfdae5edecbccea292 , < 953ab980d8a127e895d3ab9505fc4b9337bb32f7
(git)
cpe:2.3:a:elixir-grpc:grpc_server:*:*:*:*:*:*:*:* |
||
| elixir-grpc | grpc |
Affected:
0.8.0 , < 1.0.0
(semver)
cpe:2.3:a:elixir-grpc:grpc:*:*:*:*:*:*:*:* |
||
| elixir-grpc | grpc |
Affected:
8aaf3d3a8c4c7b08ac65e9c6f254e0d24da1d048 , < 0332faae5f5e132314794dbfdae5edecbccea292
(git)
cpe:2.3:a:elixir-grpc:grpc:*:*:*:*:*:*:*:* |
{
"containers": {
"cna": {
"affected": [
{
"collectionURL": "https://repo.hex.pm",
"cpes": [
"cpe:2.3:a:elixir-grpc:grpc_server:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.GRPC.Server\u0027",
"\u0027Elixir.GRPC.Server.Adapters.Cowboy.Handler\u0027"
],
"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": "\u0027Elixir.GRPC.Server\u0027:do_handle_request/4"
},
{
"name": "\u0027Elixir.GRPC.Server.Adapters.Cowboy.Handler\u0027: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": [
"\u0027Elixir.GRPC.Server\u0027",
"\u0027Elixir.GRPC.Server.Adapters.Cowboy.Handler\u0027"
],
"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": "\u0027Elixir.GRPC.Server\u0027:do_handle_request/4"
},
{
"name": "\u0027Elixir.GRPC.Server.Adapters.Cowboy.Handler\u0027: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": [
"\u0027Elixir.GRPC.Server\u0027",
"\u0027Elixir.GRPC.Server.Adapters.Cowboy.Handler\u0027"
],
"packageName": "grpc",
"packageURL": "pkg:hex/grpc",
"product": "grpc",
"programFiles": [
"lib/grpc/server.ex",
"lib/grpc/server/adapters/cowboy/handler.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.GRPC.Server\u0027:do_handle_request/4"
},
{
"name": "\u0027Elixir.GRPC.Server.Adapters.Cowboy.Handler\u0027: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": [
"\u0027Elixir.GRPC.Server\u0027",
"\u0027Elixir.GRPC.Server.Adapters.Cowboy.Handler\u0027"
],
"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": "\u0027Elixir.GRPC.Server\u0027:do_handle_request/4"
},
{
"name": "\u0027Elixir.GRPC.Server.Adapters.Cowboy.Handler\u0027: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": "\u003cp\u003eHTTP-to-gRPC transcoding must be enabled with \u003ccode\u003ehttp_transcode: true\u003c/code\u003e. 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.\u003c/p\u003e"
},
{
"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\u00e4nnchen / EEF"
}
],
"dateAssigned": "2026-11-13T11:18:41.000Z",
"descriptions": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eAuthorization 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.\u003c/p\u003e\n\u003cp\u003eOnly the transcoding clause of \u003ccode\u003eGRPC.Server.do_handle_request/4\u003c/code\u003e (\u003ccode\u003egrpc_server/lib/grpc/server.ex\u003c/code\u003e, and \u003ccode\u003elib/grpc/server.ex\u003c/code\u003e before the package split) applies the route\u0027s path bindings to the request message. The Cowboy handler picks that clause from the request \u003ccode\u003eContent-Type\u003c/code\u003e, not from the route. A request to a transcoded URL with \u003ccode\u003eapplication/grpc\u003c/code\u003e or \u003ccode\u003eapplication/grpc-web\u003c/code\u003e 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.\u003c/p\u003e\n\u003cp\u003eThis issue affects grpc_server: from 1.0.0 before 1.1.0; grpc: from 0.8.0 before 1.0.0.\u003c/p\u003e"
},
{
"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\u0027s 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\u0027s 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": "\u003cp\u003eAn 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\u0027s data.\u003c/p\u003e"
},
{
"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\u0027s 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\u0027s 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": "\u003col\u003e\n\u003cli\u003eStart a server with \u003ccode\u003ehttp_transcode: true\u003c/code\u003e and a transcoded route that binds a field from the path, for example \u003ccode\u003eGET /v1/messages/{name}\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eBuild a gRPC frame whose message sets \u003ccode\u003ename\u003c/code\u003e to \u003ccode\u003evictim\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eSend it over HTTP/1.1 as \u003ccode\u003eGET /v1/messages/alice\u003c/code\u003e with \u003ccode\u003eContent-Type: application/grpc\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eObserve that the handler receives \u003ccode\u003ename\u003c/code\u003e set to \u003ccode\u003evictim\u003c/code\u003e, not \u003ccode\u003ealice\u003c/code\u003e.\u003c/li\u003e\n\u003c/ol\u003e"
},
{
"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": "\u003cp\u003e\u003cstrong\u003e1. The header selects the clause\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eThe Cowboy handler derives the access mode from the request \u003ccode\u003eContent-Type\u003c/code\u003e. \u003ccode\u003eapplication/json\u003c/code\u003e selects \u003ccode\u003e:http_transcoding\u003c/code\u003e, \u003ccode\u003eapplication/grpc\u003c/code\u003e selects \u003ccode\u003e:grpc\u003c/code\u003e and \u003ccode\u003eapplication/grpc-web+proto\u003c/code\u003e selects \u003ccode\u003e:grpcweb\u003c/code\u003e. The router still matches the transcoded URL template and extracts its path bindings.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2. Bindings are applied in one clause only\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eGRPC.Server.do_handle_request/4\u003c/code\u003e reads the bindings with \u003ccode\u003eadapter.get_bindings/1\u003c/code\u003e and merges them through \u003ccode\u003eGRPC.Server.Transcode.map_request/5\u003c/code\u003e only in the \u003ccode\u003e:http_transcoding\u003c/code\u003e clause. The unary and request-streaming clauses decode the body alone with the selected codec. \u003ccode\u003eGRPC.Codec.Proto\u003c/code\u003e is in the default codecs of every server, so \u003ccode\u003eapplication/grpc\u003c/code\u003e is always accepted.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e3. The HTTP/1.1 guard never matches\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eresolve_access_mode/3\u003c/code\u003e has a clause that forces transcoding for HTTP/1.1 requests. It matches the version as the binary \u003ccode\u003e\"HTTP/1.1\"\u003c/code\u003e, while Cowboy stores the version as an atom, so the clause never applies and the request works over plain HTTP/1.1.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e4. Result\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eA request to \u003ccode\u003e/v1/messages/alice\u003c/code\u003e with \u003ccode\u003eContent-Type: application/grpc\u003c/code\u003e and a message that sets \u003ccode\u003ename\u003c/code\u003e to \u003ccode\u003evictim\u003c/code\u003e reaches the handler with \u003ccode\u003ename\u003c/code\u003e set to \u003ccode\u003evictim\u003c/code\u003e. With an empty message the field is empty: the path binding is never consulted.\u003c/p\u003e"
},
{
"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",
"vulnerability-lookup:meta": {
"nvd": {
"cve": {
"affected": [
{
"affectedData": [
{
"collectionURL": "https://repo.hex.pm",
"cpes": [
"cpe:2.3:a:elixir-grpc:grpc_server:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.GRPC.Server\u0027",
"\u0027Elixir.GRPC.Server.Adapters.Cowboy.Handler\u0027"
],
"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": "\u0027Elixir.GRPC.Server\u0027:do_handle_request/4"
},
{
"name": "\u0027Elixir.GRPC.Server.Adapters.Cowboy.Handler\u0027: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": [
"\u0027Elixir.GRPC.Server\u0027",
"\u0027Elixir.GRPC.Server.Adapters.Cowboy.Handler\u0027"
],
"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": "\u0027Elixir.GRPC.Server\u0027:do_handle_request/4"
},
{
"name": "\u0027Elixir.GRPC.Server.Adapters.Cowboy.Handler\u0027: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": [
"\u0027Elixir.GRPC.Server\u0027",
"\u0027Elixir.GRPC.Server.Adapters.Cowboy.Handler\u0027"
],
"packageName": "grpc",
"packageURL": "pkg:hex/grpc",
"product": "grpc",
"programFiles": [
"lib/grpc/server.ex",
"lib/grpc/server/adapters/cowboy/handler.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.GRPC.Server\u0027:do_handle_request/4"
},
{
"name": "\u0027Elixir.GRPC.Server.Adapters.Cowboy.Handler\u0027: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": [
"\u0027Elixir.GRPC.Server\u0027",
"\u0027Elixir.GRPC.Server.Adapters.Cowboy.Handler\u0027"
],
"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": "\u0027Elixir.GRPC.Server\u0027:do_handle_request/4"
},
{
"name": "\u0027Elixir.GRPC.Server.Adapters.Cowboy.Handler\u0027:init/2"
}
],
"repo": "https://github.com/elixir-grpc/grpc",
"vendor": "elixir-grpc",
"versions": [
{
"lessThan": "0332faae5f5e132314794dbfdae5edecbccea292",
"status": "affected",
"version": "8aaf3d3a8c4c7b08ac65e9c6f254e0d24da1d048",
"versionType": "git"
}
]
}
],
"source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db"
}
],
"cveTags": [],
"descriptions": [
{
"lang": "en",
"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\u0027s 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."
}
],
"id": "CVE-2026-124278",
"lastModified": "2026-11-13T16:17:39.297",
"metrics": {
"cvssMetricV40": [
{
"cvssData": {
"Automatable": "NOT_DEFINED",
"Recovery": "NOT_DEFINED",
"Safety": "NOT_DEFINED",
"attackComplexity": "LOW",
"attackRequirements": "PRESENT",
"attackVector": "NETWORK",
"availabilityRequirement": "NOT_DEFINED",
"baseScore": 7.6,
"baseSeverity": "HIGH",
"confidentialityRequirement": "NOT_DEFINED",
"exploitMaturity": "NOT_DEFINED",
"integrityRequirement": "NOT_DEFINED",
"modifiedAttackComplexity": "NOT_DEFINED",
"modifiedAttackRequirements": "NOT_DEFINED",
"modifiedAttackVector": "NOT_DEFINED",
"modifiedPrivilegesRequired": "NOT_DEFINED",
"modifiedSubAvailabilityImpact": "NOT_DEFINED",
"modifiedSubConfidentialityImpact": "NOT_DEFINED",
"modifiedSubIntegrityImpact": "NOT_DEFINED",
"modifiedUserInteraction": "NOT_DEFINED",
"modifiedVulnAvailabilityImpact": "NOT_DEFINED",
"modifiedVulnConfidentialityImpact": "NOT_DEFINED",
"modifiedVulnIntegrityImpact": "NOT_DEFINED",
"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/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",
"version": "4.0",
"vulnAvailabilityImpact": "NONE",
"vulnConfidentialityImpact": "HIGH",
"vulnIntegrityImpact": "HIGH",
"vulnerabilityResponseEffort": "NOT_DEFINED"
},
"source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"type": "Secondary"
}
]
},
"published": "2026-11-13T16:17:39.297",
"references": [
{
"source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"url": "https://cna.erlef.org/cves/CVE-2026-124278.html"
},
{
"source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"url": "https://github.com/elixir-grpc/grpc/commit/0332faae5f5e132314794dbfdae5edecbccea292"
},
{
"source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"url": "https://github.com/elixir-grpc/grpc/commit/8aaf3d3a8c4c7b08ac65e9c6f254e0d24da1d048"
},
{
"source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"url": "https://github.com/elixir-grpc/grpc/commit/953ab980d8a127e895d3ab9505fc4b9337bb32f7"
},
{
"source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"url": "https://github.com/elixir-grpc/grpc/security/advisories/GHSA-xc5v-89vq-hv5m"
},
{
"source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"url": "https://osv.dev/vulnerability/EEF-CVE-2026-124278"
}
],
"sourceIdentifier": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"vulnStatus": "Received",
"weaknesses": [
{
"description": [
{
"lang": "en",
"value": "CWE-436"
},
{
"lang": "en",
"value": "CWE-639"
}
],
"source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"type": "Secondary"
}
]
}
}
}
}
Configurations
Drag nodes to arrange them. Double-click a related vulnerability to open it, or a source to visit its link. The Physics button on the left tunes the layout and the simulation; the legend at the bottom left hides or shows nodes by kind and by sighting type.
Sightings
| Author | Source | Type | Date | Other |
|---|
Nomenclature
- Seen: The vulnerability was mentioned, discussed, or observed by the user.
- Confirmed: The vulnerability has been validated from an analyst's perspective.
- Published Proof of Concept: A public proof of concept is available for this vulnerability.
- Exploited: The vulnerability was observed as exploited by the user who reported the sighting.
- Patched: The vulnerability was observed as successfully patched by the user who reported the sighting.
- Not exploited: The vulnerability was not observed as exploited by the user who reported the sighting.
- Not confirmed: The user expressed doubt about the validity of the vulnerability.
- Not patched: The vulnerability was not observed as successfully patched by the user who reported the sighting.
Vulnerability timeline
Sightings and recorded dates, grouped by day · UTC
How durations are calculated
Following the VTEM framework (Black Hat USA 2015), time to patch starts when the vendor or a coordinator was informed, total time to patch at discovery, and disclosure to patch at public disclosure; vendor response time runs from the report to its acknowledgement. Time to exploit and time unpatched start at the earliest discovery or report, falling back to public disclosure. Unpatched time ends at the first recorded patch, or the calculation time when no patch is recorded. Exploitation to patch shows the interval between those two events; a published proof of concept is a public exploit, not exploitation.
Each result shows its source dates. A negative interval means the end event came first; when date-only inputs leave the order open, the result says so. Date-only inputs are approximate. The earliest evidence wins: KEV report dates and sightings are labelled as such. Records describing another vulnerability are listed but never calculated from, and a PoC alone does not establish exploitation. Missing patch evidence does not prove that no patch exists. Filters below change the event list only.
Loading timeline…
The approach is described in our paper Mapping CVEs to MITRE ATT&CK Techniques: A Curated Gold-Set Classifier and the Limits of LLM-Assisted Label Expansion.
Browse all ATT&CK techniques and the vulnerabilities related to each.
Related by attack behaviour
Vulnerabilities whose description is nearest to this one in the vector space of the CIRCL/vulnerability-attack-technique-biencoder model. This is a similarity search over the bi-encoder space (plain cosine), not a classification, and it has no measured accuracy.