{"id":"CVE-2026-90898","state":"PUBLISHED","title":"Bifrost unauthenticated remote code execution via MCP stdio client registration","description":"Bifrost registers MCP clients through its management API. A stdio client is a command plus args. Bifrost starts that program in the gateway the moment the client is added. No MCP handshake required.\n\n\n\nThe default is governance.auth_config.is_enabled=false. Auth off means every caller is a local admin. One unauthenticated POST /api/mcp/client is enough to run a program as the Bifrost process user (appuser on the official image).\n\n\n\n transports/v2.1.0 refuses an unauthenticated stdio registration with 403. transports/v2.0.0 still allows it.","publishedAt":"2026-09-14T10:18:53.454Z","updatedAt":"2026-09-14T11:19:46.276Z","severity":{"score":9.8,"label":"Critical","version":"3.1","vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H","source":"JFROG"},"assigner":"JFROG","products":["maximhq Bifrost"],"affected":[{"vendor":"maximhq","product":"Bifrost","packageName":"github.com/maximhq/bifrost/transports","defaultStatus":"unaffected","versions":[{"version":"0","status":"affected","lessThan":"2.1.0","versionType":"semver"}],"platforms":["Linux","macOS"],"collectionURL":"https://github.com/maximhq/bifrost","repo":"git://github.com/maximhq/bifrost","modules":["transports/bifrost-http","core/mcp"],"programFiles":["transports/bifrost-http/handlers/mcp.go","transports/bifrost-http/handlers/middlewares.go"]}],"references":["https://github.com/maximhq/bifrost/pull/6757","https://github.com/maximhq/bifrost/commit/12e170352bd25eab1ae9ba16611f1797d1fd8fdc","https://github.com/maximhq/bifrost/releases/tag/transports/v2.1.0","https://github.com/maximhq/bifrost"],"weaknesses":["CWE-306","CWE-284"],"ingestedAt":"2026-10-29T20:13:34.582Z","source":{"repository":"CVEProject/cvelistV5","path":"cves/2026/90xxx/CVE-2026-90898.json","commit":"556c9d3a8cd17e218bb8e452ba7cd619a384ff47"},"raw":{"dataType":"CVE_RECORD","dataVersion":"5.2","cveMetadata":{"cveId":"CVE-2026-90898","state":"PUBLISHED","datePublished":"2026-09-14T10:18:53.454Z","dateUpdated":"2026-09-14T11:19:46.276Z","assignerShortName":"JFROG","assignerOrgId":"48a46f29-ae42-4e1d-90dd-c1676c1e5e6d","dateReserved":"2026-09-14T10:13:28.161Z"},"containers":{"cna":{"title":"Bifrost unauthenticated remote code execution via MCP stdio client registration","descriptions":[{"lang":"en","value":"Bifrost registers MCP clients through its management API. A stdio client is a command plus args. Bifrost starts that program in the gateway the moment the client is added. No MCP handshake required.\n\n\n\nThe default is governance.auth_config.is_enabled=false. Auth off means every caller is a local admin. One unauthenticated POST /api/mcp/client is enough to run a program as the Bifrost process user (appuser on the official image).\n\n\n\n transports/v2.1.0 refuses an unauthenticated stdio registration with 403. transports/v2.0.0 still allows it."}],"affected":[{"vendor":"maximhq","product":"Bifrost","packageName":"github.com/maximhq/bifrost/transports","defaultStatus":"unaffected","versions":[{"version":"0","status":"affected","lessThan":"2.1.0","versionType":"semver"}],"platforms":["Linux","macOS"],"collectionURL":"https://github.com/maximhq/bifrost","repo":"git://github.com/maximhq/bifrost","modules":["transports/bifrost-http","core/mcp"],"programFiles":["transports/bifrost-http/handlers/mcp.go","transports/bifrost-http/handlers/middlewares.go"]}],"references":[{"url":"https://github.com/maximhq/bifrost/pull/6757","name":"PR #6757: refuse unauthenticated stdio MCP registration","tags":["patch"]},{"url":"https://github.com/maximhq/bifrost/commit/12e170352bd25eab1ae9ba16611f1797d1fd8fdc","name":"Merge commit for PR #6757","tags":["patch"]},{"url":"https://github.com/maximhq/bifrost/releases/tag/transports/v2.1.0","name":"Bifrost HTTP v2.1.0 (first release containing the fix)","tags":["release-notes"]},{"url":"https://github.com/maximhq/bifrost","name":"Bifrost repository","tags":["product"]}],"metrics":[{"format":"CVSS","scenarios":[{"lang":"en","value":"GENERAL"}],"cvssV3_1":{"version":"3.1","attackVector":"NETWORK","attackComplexity":"LOW","privilegesRequired":"NONE","userInteraction":"NONE","scope":"UNCHANGED","confidentialityImpact":"HIGH","integrityImpact":"HIGH","availabilityImpact":"HIGH","baseSeverity":"CRITICAL","baseScore":9.8,"vectorString":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H"}}],"problemTypes":[{"descriptions":[{"cweId":"CWE-306","lang":"en","description":"CWE-306 Missing Authentication for Critical Function","type":"CWE"}]},{"descriptions":[{"cweId":"CWE-284","lang":"en","description":"CWE-284 Improper Access Control","type":"CWE"}]}],"providerMetadata":{"shortName":"JFROG","orgId":"48a46f29-ae42-4e1d-90dd-c1676c1e5e6d","dateUpdated":"2026-09-14T10:18:53.454Z"},"configurations":[{"lang":"en","value":"Management API reachable and governance.auth_config.is_enabled=false, which is the documented default. Confirmed on maximhq/bifrost v1.6.3. Fixed in transports/v2.1.0 (2026-09-08). An operator who enables management authentication and keeps the admin listener off untrusted networks is not exposed to the unauthenticated form of this issue.","supportingMedia":[{"type":"text/html","base64":false,"value":"<p>Management API reachable and governance.auth_config.is_enabled=false, which is the documented default. Confirmed on maximhq/bifrost v1.6.3. Fixed in transports/v2.1.0 (2026-09-08). An operator who enables management authentication and keeps the admin listener off untrusted networks is not exposed to the unauthenticated form of this issue.</p>"}]}],"workarounds":[{"lang":"en","value":"Set governance.auth_config.is_enabled to true, use strong administrator credentials, and firewall the management listener.","supportingMedia":[{"type":"text/html","base64":false,"value":"<p>Set governance.auth_config.is_enabled to true, use strong administrator credentials, and firewall the management listener.&nbsp;</p>"}]}],"solutions":[{"lang":"en","value":"Upgrade Bifrost HTTP transport to 2.1.0 or later. PR #6757 returns 403 for unauthenticated stdio MCP client registration when dashboard authentication is disabled or unconfigured. Authenticated admins can still add stdio clients. The 1.6.x line through 1.6.11 and transports/v2.0.0 do not include this change.","supportingMedia":[{"type":"text/html","base64":false,"value":"<p>Upgrade Bifrost HTTP transport to 2.1.0 or later. PR #6757 returns 403 for unauthenticated stdio MCP client registration when dashboard authentication is disabled or unconfigured. Authenticated admins can still add stdio clients. The 1.6.x line through 1.6.11 and transports/v2.0.0 do not include this change.</p>"}]}],"exploits":[{"lang":"en","value":"JFrog has a private proof of concept. An unauthenticated POST /api/mcp/client with connection_type stdio and attacker-chosen command and args starts the program in the gateway. Public exploit details are not included in this record.","supportingMedia":[{"type":"text/html","base64":false,"value":"<p>JFrog has a private proof of concept. An unauthenticated POST /api/mcp/client with connection_type stdio and attacker-chosen command and args starts the program in the gateway. Public exploit details are not included in this record.</p>"}]}],"timeline":[{"time":"2026-07-13T10:27:00.000Z","lang":"en","value":"Reported to the Bifrost maintainers (GHSA-86gf-xh3g-rvxq)"},{"time":"2026-09-02T15:14:00.000Z","lang":"en","value":"Fix merged upstream (PR #6757)"},{"time":"2026-09-08T15:15:00.000Z","lang":"en","value":"Fix first shipped in Bifrost HTTP v2.1.0"}],"credits":[{"lang":"en","value":"Yuval Moravchick | JFrog","type":"finder"}],"source":{"discovery":"EXTERNAL"},"x_generator":{"engine":"Vulnogram 1.0.4"}},"adp":[{"title":"CISA ADP Vulnrichment","metrics":[{"other":{"type":"ssvc","content":{"id":"CVE-2026-90898","role":"CISA Coordinator","options":[{"Exploitation":"none"},{"Automatable":"yes"},{"Technical Impact":"total"}],"version":"2.0.3","timestamp":"2026-09-14T11:01:44.207374Z"}}}],"providerMetadata":{"shortName":"CISA-ADP","orgId":"134c704f-9b21-4f2e-91b3-4a467353bcc0","dateUpdated":"2026-09-14T11:19:46.276Z"}}]}}}