CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-73841

CVE-2026-73841: Broken Object Level Authorization (BOLA) in OpenChoreo Container Exec and Wirelogs Endpoints

Alon Barad
Alon Barad
Software Engineer

Sep 3, 2026·7 min read·13 visits

Executive Summary (TL;DR)

OpenChoreo failed to validate if a target component belonged to the caller's authorized project when processing container command executions and wirelog requests. Attackers could specify a project they owned while targeting components in other projects, gaining unauthorized remote shell access to arbitrary pods.

An Insecure Direct Object Reference (IDOR) / Broken Object Level Authorization (BOLA) vulnerability in OpenChoreo allows authenticated users with project-level permissions to bypass tenant boundaries. By manipulating client-controlled query parameters, an attacker can execute arbitrary commands inside Kubernetes containers or view sensitive communication streams of resources belonging to other, highly privileged projects within the same namespace.

Vulnerability Overview

OpenChoreo is an open-source developer platform designed for Kubernetes orchestration. Within its architecture, the openchoreo-api component exposes critical management endpoints. Among these, the exec endpoint allows interactive command execution within container terminals, and the wirelogs endpoint provides real-time access to inter-container communication data.

Because these endpoints manage low-level system interactions and sensitive diagnostic data, they represent a significant attack surface. In environments where multiple teams share a single Kubernetes namespace, strict boundary enforcement is required to maintain isolation between separate developer projects.

Prior to the patched versions, the authorization layer relied on client-supplied input rather than verifying the authoritative state of the targeted resource. This architectural oversight led to a critical Broken Object Level Authorization (BOLA) vulnerability, classified as CWE-639 and CWE-863. This flaw permitted users with minimal privileges in one project to escape their boundaries and compromise workloads in other projects.

Root Cause Analysis

The root cause of this vulnerability lies in the implementation of the authorization checking and pod resolution sequence within internal/openchoreo-api/api/handlers/exec.go and internal/openchoreo-api/api/handlers/wirelogs.go.

When a client issues a request to execute a command inside a component's container, the API server extracts the target component name from the request path and reads the project identifier from the project query parameter. This project value, directly controlled by the client, is passed to the Casbin Policy Decision Point (PDP) as part of the ResourceHierarchy struct to evaluate authorization.

If the client has valid permissions (such as component:exec) for the requested project name, Casbin approves the request. However, during the subsequent pod resolution step, the handler retrieves the target pod from the Kubernetes API using only the component name. It fails to verify if the resolved component is actually owned by the authorized project.

Additionally, the pre-patch logic failed to pass the specific component name to the Casbin context. Because the policy engine requires strict hierarchy matching, omitting the component name from the authorization path meant that component-specific role bindings were ignored, and authorization evaluations reverted to broader, project-level permissions. This structural omission facilitated the scope bypass.

Code Analysis

The remediation introduces structured component lookup to retrieve the authoritative owning project prior to any authorization check. The following diff displays the core modifications made to the API handlers:

// Fragment from internal/openchoreo-api/api/handlers/exec.go
 
	componentName := parts[1]
 
 	query := r.URL.Query()
-	project := query.Get("project")
+	requestedProject := query.Get("project")
 	envName := query.Get("env")
 	container := query.Get("container")
 	commands := query["command"]
@@ -75,12 +76,31 @@ func (h *ExecHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 	ctx := r.Context()
 	logger := h.logger.With("namespace", namespace, "component", componentName)
 
-	// Authorize: check that the caller has component:exec permission.
+	// Authorization must be configured before any access decision is made.
 	if h.authzChecker == nil {
 		logger.Error("Authorization checker not configured")
 		http.Error(w, "authorization not configured", http.StatusInternalServerError)
 		return
 	}
+
+	// Pin authorization and pod resolution to the component's real owning project
+	// rather than the caller-supplied `project`.
+	project, err := h.resolveComponentProject(ctx, namespace, componentName)
+	if err != nil {
+		logger.Warn("Failed to resolve component for exec", "error", err)
+		http.Error(w, fmt.Sprintf("failed to resolve component: %v", err), http.StatusBadRequest)
+		return
+	}
+	// Fail closed if the caller named a project that does not own the component.
+	if requestedProject != "" && requestedProject != project {
+		logger.Warn("requested project does not own the target component; denying exec",
+			"requestedProject", requestedProject, "ownerProject", project)
+		http.Error(w, "you do not have permission to exec into this component", http.StatusForbidden)
+		return
+	}

To support this check, the helper function resolveComponentProject queries the Kubernetes API server directly to fetch the Component resource and extract the authoritative owner:

func (h *ExecHandler) resolveComponentProject(ctx context.Context, namespace, componentName string) (string, error) {
	comp := &openchoreov1alpha1.Component{}
	if err := h.k8sClient.Get(ctx, client.ObjectKey{Namespace: namespace, Name: componentName}, comp); err != nil {
		if apierrors.IsNotFound(err) {
			return "", fmt.Errorf("component %q not found in namespace %q", componentName, namespace)
		}
		return "", fmt.Errorf("failed to look up component %q: %w", componentName, err)
	}
	if comp.Spec.Owner.ProjectName == "" {
		return "", fmt.Errorf("component %q has no owning project", componentName)
	}
	return comp.Spec.Owner.ProjectName, nil
}

This implementation prevents the authorization bypass by binding the Casbin decision strictly to the comp.Spec.Owner.ProjectName metadata. If the user-supplied project query parameter does not match the actual owning project of the target component, the request is denied immediately with a generic 403 Forbidden error.

Exploitation Methodology

An attacker with valid, low-privilege credentials belonging to a designated project (e.g., project-a) can compromise workloads belonging to a separate project (e.g., project-b) inside the same namespace.

The following sequence diagram details the exploitation flow:

To perform the attack, the adversary establishes a connection to the terminal endpoint, passing their authorized project ID in the query string while naming the targeted component in the path:

GET /exec/namespaces/default/components/sensitive-db-service?project=attacker-owned-project

If the connection is upgraded to a WebSocket, the API establishes an interactive SPDY stream directly into the container running sensitive-db-service. The attacker gains full command-line execution privileges as configured inside the target container's runtime security profile.

Impact Assessment & Residual Risk

The impact of this vulnerability is significant, as it leads to multi-tenant isolation collapse within shared Kubernetes clusters managed by OpenChoreo. Successful exploitation yields remote command execution inside arbitrary container workloads, potentially exposing cluster service account tokens, database credentials, and application source code.

Although the core patch effectively resolves the primary execution path, security teams should evaluate the following residual risks:

  1. Dynamic Metadata Mutations (TOCTOU): Because Kubernetes Custom Resources are evaluated dynamically, there is a minor race window between the component ownership lookup and the establishment of the SPDY tunnel. Mutating resource specifications rapidly could theoretically exploit synchronization delays.

  2. The Wirelogs Parameter Validation Gap: In the live traffic streaming handler (wirelogs), if the component parameter is omitted, the project-lookup function is bypassed. System engineers must verify that the underlying logging backend (such as Hubble) enforces strict network-level security controls independently of OpenChoreo's API layer.

Detection and Verification

To detect exploitation attempts prior to patching, security administrators should audit API server logs for diagnostic mismatches. Look for requests where the supplied project query string diverges from the target component's actual namespace or known namespace mappings.

Following the patch, failed exploitation attempts generate explicit warnings in the API logs:

requested project does not own the target component; denying exec

To query these occurrences within centralized log aggregators, use the following search syntax:

"requested project does not own the target component" OR "you do not have permission to view wirelogs for this scope"

In addition, deployment integrity can be verified via the following programmatic test case, which checks that mismatching projects trigger an explicit 403 Forbidden response and bypass policy execution entirely:

func TestExecHandler_DeniesComponentProjectMismatch(t *testing.T) {
	pdp := testutil.AllowPDP()
	h := newExecHandler(t, pdp, execComponent("default", "victim-svc", "team-b"))
 
	rec := httptest.NewRecorder()
	h.ServeHTTP(rec, httptest.NewRequest(http.MethodGet,
		"/exec/namespaces/default/components/victim-svc?env=development&project=team-a",
		nil).WithContext(testutil.AuthzContext()))
 
	require.Equal(t, http.StatusForbidden, rec.Code)
	require.Empty(t, pdp.Captured, "authz must not run when requested project does not own the component")
}

Fix Analysis (3)

Technical Appendix

CVSS Score
8.8/ 10
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
EPSS Probability
0.35%
Top 72% most exploited

Affected Systems

OpenChoreo API Server (openchoreo-api)

Affected Versions Detail

Product
Affected Versions
Fixed Version
OpenChoreo
openchoreo
< 1.1.61.1.6
OpenChoreo
openchoreo
>= 1.2.0-m.1, < 1.2.31.2.3
AttributeDetail
CWE IDCWE-639 / CWE-863
Attack VectorNetwork (AV:N)
CVSS v3.1 Score8.8 (High)
EPSS Score0.00353 (Percentile: 28.24%)
ImpactCommand Execution / Information Disclosure
Exploit StatusProof-of-Concept
KEV StatusNot Listed

MITRE ATT&CK Mapping

T1068Exploitation for Privilege Escalation
Privilege Escalation
CWE-639
Authorization Bypass Through User-Controlled Key

The system uses a client-provided key to perform authorization checks, rather than verifying the real owner or identity of the targeted resource.

References & Sources

  • [1]GitHub Security Advisory GHSA-52gf-6rpq-fgmx
  • [2]CVE-2026-73841 Record on CVE.org
  • [3]OpenChoreo Pull Request 4251
  • [4]OpenChoreo Pull Request 4516
  • [5]OpenChoreo Pull Request 4538

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•about 16 hours ago•CVE-2026-11748
6.9

CVE-2026-11748: Unauthenticated LDAP Injection in Central Dogma Server Authentication

An LDAP injection vulnerability exists in the centraldogma-server-auth-shiro module of LY Corporation Central Dogma before version 0.84.0. The search logic dynamically constructs LDAP search filters by interpolating user-provided usernames without escaping RFC 4515 metacharacters. Unauthenticated remote attackers can leverage this flaw to bypass authentication, enumerate directory hierarchies, and access unauthorized resources.

Alon Barad
Alon Barad
7 views•6 min read
•about 17 hours ago•CVE-2026-11746
9.4

CVE-2026-11746: Use of Hard-coded ZooKeeper Replication Secret 'ch4n63m3' in Central Dogma Server

CVE-2026-11746 is a critical vulnerability in Central Dogma Server prior to version 0.84.0, where an embedded ZooKeeper replication secret silently falls back to a publicly known, hard-coded default string ('ch4n63m3'). Remote attackers with access to the replication network can authenticate as legitimate cluster peers, potentially leading to unauthorized data exposure, state manipulation, or complete cluster takeover.

Amit Schendel
Amit Schendel
4 views•6 min read
•about 18 hours ago•CVE-2026-56665
4.2

CVE-2026-56665: Logical Validation Bypass in ZITADEL External JWT Identity Provider

A logical verification flaw in ZITADEL's external JWT Identity Provider validation allows attackers to bypass session expiration checks. If an incoming JWT lacks the 'exp' claim, the system skips validation entirely, creating an indefinitely valid session. This issue has been addressed in versions 3.4.12 and 4.15.2.

Alon Barad
Alon Barad
4 views•7 min read
•about 19 hours ago•CVE-2026-59149
6.5

CVE-2026-59149: Sibling Directory Path Traversal in Mockoon Backend Server

CVE-2026-59149 identifies a directory traversal vulnerability in `@mockoon/commons-server`, the backend mock-server library powering the Mockoon application. The flaw occurs in the path containment validation logic used during raw file response generation. An unauthenticated attacker can exploit this weakness to retrieve arbitrary files from sibling directories sharing a common prefix with the designated static base directory.

Amit Schendel
Amit Schendel
6 views•5 min read
•about 20 hours ago•CVE-2026-59148
8.8

CVE-2026-59148: Unauthenticated Administrative API and CORS Misconfiguration in Mockoon

An in-depth analysis of CVE-2026-59148, a high-severity flaw in Mockoon where unauthenticated administrative endpoints and a wildcard Cross-Origin Resource Sharing (CORS) policy allow remote execution, state poisoning, and credential theft.

Alon Barad
Alon Barad
5 views•6 min read
•about 21 hours ago•CVE-2026-56666
4.8

CVE-2026-56666: Account Takeover via Improper Email Verification in ZITADEL Federated Identity Handler

An improper authentication vulnerability (CWE-287) in ZITADEL's external identity provider handler before version 4.15.3 allows remote attackers to perform complete account takeover. When auto-linking by email is enabled, ZITADEL verifies that the local target account has a verified email address but fails to verify if the external provider confirmed ownership of that same email. Attackers can exploit this by registering an unverified account with a victim's email address on a permissive external provider, leading to unauthorized account binding and persistent access.

Amit Schendel
Amit Schendel
2 views•7 min read