Sep 18, 2026·8 min read·5 visits
Obot's fallback authorization logic incorrectly treats `/v0.1` API routes as public UI assets, allowing unauthenticated remote access to registered Model Context Protocol (MCP) server metadata.
An authentication bypass vulnerability in Obot versions <= v0.22.1 allows unauthenticated remote attackers to access Model Context Protocol (MCP) registry metadata and retrieve server lists when OBOT_SERVER_ENABLE_REGISTRY_AUTH is configured. This is due to a routing logic flaw where `/v0.1` paths are incorrectly categorized as public frontend user interface assets.
Obot is an enterprise-grade AI Governance and Model Context Protocol (MCP) management platform. It manages integrations between large language models and external computational contexts. The platform includes a management server, frontend user interface, and an API designed to register and orchestrate MCP servers. To manage access control in multi-tenant or protected environments, Obot allows administrators to set the configuration parameter OBOT_SERVER_ENABLE_REGISTRY_AUTH=true. This enforces authentication requirements across all critical registry management APIs.
The vulnerability GHSA-pr6h-vr44-xq8j describes an incorrect authorization flaw (CWE-863) within the application's global access control layer. When registry authentication is enabled, the API endpoints responsible for exposing Model Context Protocol server registries are left accessible to unauthenticated callers. These endpoints are hosted under the /v0.1 and /v0.1/* request paths. Because of a missing exclusion rule in the central routing engine, the system fails to apply authentication checks to these paths, routing them as public assets.
The attack surface is exposed directly on the public-facing HTTP interface of any Obot server deployment. Exploitation does not require prior authentication or session establishment. By querying the /v0.1/servers endpoint, an external network-positioned attacker can bypass the configuration restrictions of OBOT_SERVER_ENABLE_REGISTRY_AUTH=true. This bypass discloses the entire active metadata catalog of internal MCP integrations, compromising architectural boundaries.
The core flaw is located within the custom routing authorizer component inside pkg/api/authz/ui.go. Obot implements a multi-tiered authorization model to differentiate between frontend assets (which must remain accessible to anonymous browsers) and protected backend APIs (which require valid user identities). The system utilizes a 'default-allow' fallback algorithm for route parsing. This algorithm assumes any incoming request that does not explicitly match a restricted backend API pattern is an innocuous user interface resource, such as static HTML, JavaScript, CSS, or images.
The classification is performed by the checkUI helper function. The function inspects the path of the incoming http.Request and compares it against specific prefix lists. Before version v0.23.0, the comparison array and exclusion logic only checked for paths matching /api, /mcp-connect/, /oauth/, and /debug/. Because the Model Context Protocol registry endpoints are routed under the /v0.1 base prefix, requests directed to paths such as /v0.1/servers failed all exclusion checks in checkUI.
As a result, checkUI mistakenly returned true, declaring the backend API path to be a harmless UI resource. This bypassed the global authentication filters entirely, skipping WWW-Authenticate header validation and avoiding session token verification. The application router forwarded the unauthenticated request directly to the backend registry handler.
Once the request bypassed the API authentication layer and reached the backend registry handler, the handler evaluated the user identity. Because the user had no session, they were mapped to the UnauthenticatedGroup (anonymous identity). The registry handler enforces its own per-user Access Control Rules (ACRs). For an anonymous caller, it filters out all credential-carrying variables (such as secret environment parameters, API tokens, and authorization headers). However, the handler is still allowed to return wildcard and default-catalog entries to the user. Consequently, the response returned to the unauthenticated caller contains the inventory of the registry server.
To understand the flaw, we must analyze the vulnerable code path in pkg/api/authz/ui.go prior to the patch. The checkUI function was structured to allow anonymous requests to bypass the main security filters based on a logical OR evaluation.
// Vulnerable Implementation in pkg/api/authz/ui.go
func (a *Authorizer) checkUI(req *http.Request, user user.Info) bool {
// Reject direct access to /debug/, /api or /api paths for UI except for /api/image/{id}
if req.URL.Path == "/api" || hasAnyPrefix(req.URL.Path, "/mcp-connect/", "/oauth/", "/debug/") || (strings.HasPrefix(req.URL.Path, "/api/") && !strings.HasPrefix(req.URL.Path, "/api/image/")) {
return false
}
// Under default-allow logic, if the request does not trigger the 'return false' check,
// the authorizer assumes the request is a static asset and returns true (authorized).
return true
}Because the prefix list "/mcp-connect/", "/oauth/", "/debug/" did not contain the /v0.1/ path, any client seeking resources at /v0.1/servers avoided the false evaluation condition, proceeding to be handled as an authorized UI route.
The official patch introduced in commit 7da59f71ca9a168af7cf53016a75bde90c6a57a3 corrects this logic by explicitly registering the /v0.1 and /v0.1/ prefixes as non-UI routes. This ensures that any incoming connection directed to these API endpoints is rejected by the fallback UI logic, requiring normal user authentication.
// Patched Implementation in pkg/api/authz/ui.go
func (a *Authorizer) checkUI(req *http.Request, user user.Info) bool {
// Reject direct access to non-UI routes except for /api/image/{id}.
if req.URL.Path == "/api" || req.URL.Path == "/v0.1" || hasAnyPrefix(req.URL.Path, "/mcp-connect/", "/oauth/", "/debug/", "/v0.1/") || (strings.HasPrefix(req.URL.Path, "/api/") && !strings.HasPrefix(req.URL.Path, "/api/image/")) {
return false
}
return true
}The patch is logically straightforward and covers the exact API root exposed by the Model Context Protocol service layer. However, the use of 'default-allow' fallback logic inside checkUI remains an architectural concern. If developers introduce new API routes on different path bases in future releases without modifying the exclusion list, similar authorization bypass variants may occur.
Exploiting this vulnerability does not require sophisticated custom tooling, specialized network positions, or complex prerequisites. An attacker only needs basic TCP/IP access to the target port where the Obot management platform is hosted. The bypass is triggered by issuing an unauthenticated HTTP GET request targeting the API registry path /v0.1/servers.
The attack cycle consists of three phases. First, the attacker maps the target Obot service by making a standard probe request. Second, the attacker sends a GET request to /v0.1/servers. If the system is running a vulnerable version and has registry authentication configured, the server bypasses security filtering and returns an HTTP status of 200 OK rather than the expected 401 Unauthorized or 403 Forbidden response.
The following request trace demonstrates a successful exploit query against a vulnerable target:
GET /v0.1/servers HTTP/1.1
Host: vulnerable-obot-instance.local
User-Agent: Security-Audit-Scanner
Accept: application/json
Connection: closeThe response packet returns the application payload disclosing registered MCP services:
[
{
"id": "jira-mcp-endpoint",
"name": "Corporate Jira Bridge",
"description": "Enterprise tool to access ticket states and internal infrastructure planning.",
"repositoryUrl": "https://git.internal-corp.net/sec-ops/mcp-jira-bridge.git",
"connectUrl": "https://mcp-gateway.internal-corp.net/jira/v1"
}
]As demonstrated, no API keys, OAuth session tokens, or username/password combinations are present in the request headers, yet the server fully discloses the internal MCP integration structure.
The security impact of GHSA-pr6h-vr44-xq8j is classified as confidentiality exposure with medium severity. Although the unauthenticated endpoint does not allow attackers to modify, delete, or add registry configuration settings (since WRITE-access requests utilize separate API handlers that enforce strict token validation), the leaked metadata reveals highly sensitive architectural insights. The inventory provides an internal roadmap of the target environment's internal components, connected tools, and external services.
The disclosure of repository URLs, backend service routes, and descriptions gives attackers direct access to names and paths of proprietary systems. For instance, finding a connection endpoint pointing to an internal Git repository (https://git.internal-corp.net/...) or an internal API gateway (https://mcp-gateway.internal-corp.net/...) points to secondary targets. Attackers can leverage this intelligence to design highly targeted attacks, seeking out other internal vulnerabilities based on the specific server descriptions and tools exposed in the JSON response.
The CVSS score of 5.3 reflects the lack of integrity and availability impact, but underscores the low-complexity network-accessible nature of the confidentiality disclosure. Because there is no user interaction required, this vulnerability can be automated by scanning engines on the public internet, exposing systems that run vulnerable configurations of Obot.
The primary remediation path is upgrading the Obot installation to version v0.23.0 or higher. The upgrade completely changes the route handling characteristics of the checkUI block, forcing all requests matching /v0.1 and /v0.1/* to undergo mandatory session-validation and token-checking procedures. This prevents anonymous queries from reaching the backend registry handlers.
If an immediate software upgrade is not possible due to development constraints or change control freezes, administrators should implement a temporary mitigation using a Web Application Firewall (WAF) or reverse proxy. The proxy must inspect the request URI. If the requested path starts with /v0.1, the proxy should verify the existence of authorization parameters. If no authorization is present, the proxy should terminate the request immediately, returning an HTTP 401 Unauthorized status to the client.
For proactive network-level detection, security engineers can deploy signature-based intrusion detection rules. The following Snort signature detects attempt patterns to exploit the registry access bypass over unencrypted network streams:
alert tcp $EXTERNAL_NET any -> $HOME_NET 8080 (msg:"EXPLOIT-ACTIVE Obot MCP Registry Authorization Bypass Attempt (GHSA-pr6h-vr44-xq8j)"; flow:to_server,established; content:"GET"; http_method; content:"/v0.1/servers"; http_uri; fast_pattern; metadata:service http; reference:url,github.com/obot-platform/obot/security/advisories/GHSA-pr6h-vr44-xq8j; classtype:attempted-recon; sid:1000001; rev:1;)Using this rule helps network administrators locate and isolate vulnerable instances of Obot that are active on internal or external networks.
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N| Product | Affected Versions | Fixed Version |
|---|---|---|
Obot Obot AI | <= v0.22.1 | v0.23.0 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-862, CWE-863 |
| Attack Vector | Network (AV:N) |
| CVSS Score | 5.3 (Medium) |
| Exploit Status | PoC / Active Reconnaissance |
| Impact Type | Unauthenticated Metadata Disclosure |
| Remediation | Upgrade to v0.23.0 or restrict /v0.1/ via WAF |
| CISA KEV Status | Not Listed |
The software does not perform an authorization check when an actor attempts to access a resource or perform an action.
CVE-2026-59163 is a critical authentication bypass vulnerability in the Mnemosyne sync server. In versions prior to v3.10.1, the server's authentication logic decoded incoming JSON Web Tokens (JWT) but completely skipped cryptographic signature verification. An unauthenticated remote attacker can exploit this vulnerability to bypass authentication, impersonate arbitrary users, read synchronized AI agent states, or write malicious database updates.
An authorization bypass vulnerability exists in the Moquette MQTT broker prior to version 0.18.1. When an MQTT client registers a Last Will and Testament (LWT) topic during its connection setup, the broker fails to perform write-access checks on that topic. Upon an abrupt client disconnection, the broker publishes the registered Will message to subscribers of the unauthorized topic, bypassing configured Access Control Lists (ACLs).
A concurrent execution vulnerability (CWE-362) exists in the Paymenter webshop solution within the service downgrade execution path (doUpgrade). Authenticated customers can exploit this concurrency issue by sending concurrent HTTP requests to trigger multiple parallel executions of the refund process. Because the application checks for pending upgrades without database transactional isolation or exclusive row locks, attackers can generate multiple duplicate refunds to their account balance for a single downgrade action. This leads to arbitrary credit inflation on the platform.
A critical security vulnerability exists in the Obot Platform (versions < 0.23.0) where unauthenticated OAuth dynamic client registration, a consentless authorization flow, and a lack of JWT audience validation enable remote attackers to steal API tokens via audience confusion.
An authenticated Server-Side Request Forgery (SSRF) vulnerability in the Obot Platform allows administrative or power users to bypass IP verification and scan or query internal resources, private networks, and cloud instance metadata services (IMDS). Because response bodies and error details are reflected back to the client interface, this constitutes a non-blind SSRF.
Semantic MediaWiki starting from version 3.0.0 up to and including 7.2.1 is vulnerable to an unauthenticated missing authorization flaw in its `smwtask` API module. The endpoint fails to execute permission or privilege checks on callers. Instead, it relies on a CSRF token check, which can be satisfied by anonymous users using MediaWiki's static public CSRF token. Remote, unauthenticated attackers can exploit this flaw to retrieve internal database statistics, enqueue background jobs, run database queries, or trigger entity disposal processes, potentially leading to information disclosure, database corruption, and Denial of Service.