You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
After #17 collapsed workspace-resolution errors into a single generic 403 "Access denied to workspace." (no ID echo), several tool-layer paths still distinguish "workspace does not exist" from "exists but access denied" by echoing the workspace id in a not-found message. The clearest case is src/tools/connector-tools.ts, where install/management actions do:
constws=awaitctx.runtime.getWorkspaceStore().get(wsId);if(!ws)returnerrResult(`Workspace "${wsId}" not found.`);// ... then:if(!isWorkspaceAdmin(ws,identity))returnerrResult(/* admin required */);
An authenticated caller supplying an arbitrary wsId (tool arg) can distinguish:
nonexistent workspace → Workspace "<id>" not found.
existent but not-admin → admin-required error
That's the same enumeration shape #17 closed, one layer up. Multiple sites in connector-tools.ts follow this pattern (~lines 837, 1315, 1435, 1493, 1821, 1906, 1973).
Returns tool-result text, not an HTTP status code.
workspace-mgmt-tools.ts CRUD paths that echo the id are gated behind an org-admin check first, so those are not a cross-tenant leak — this issue is specifically the connector-tools (and similar) paths that echo the id before/around the per-workspace admin check.
Suggested fix
For paths reachable with an attacker-suppliable wsId, return a single generic "access denied" result for both not-found and not-authorized, without echoing the id — mirroring the #17 resolution. Leave paths that operate only on an already-resolved/authorized workspace as-is.
Priority
P3 — information disclosure, minor (same class as #17).
Summary
After #17 collapsed workspace-resolution errors into a single generic
403 "Access denied to workspace."(no ID echo), several tool-layer paths still distinguish "workspace does not exist" from "exists but access denied" by echoing the workspace id in a not-found message. The clearest case issrc/tools/connector-tools.ts, where install/management actions do:An authenticated caller supplying an arbitrary
wsId(tool arg) can distinguish:Workspace "<id>" not found.That's the same enumeration shape #17 closed, one layer up. Multiple sites in
connector-tools.tsfollow this pattern (~lines 837, 1315, 1435, 1493, 1821, 1906, 1973).Scope / severity
Lower severity than #17:
workspace-mgmt-tools.tsCRUD paths that echo the id are gated behind an org-admin check first, so those are not a cross-tenant leak — this issue is specifically the connector-tools (and similar) paths that echo the id before/around the per-workspace admin check.Suggested fix
For paths reachable with an attacker-suppliable
wsId, return a single generic "access denied" result for both not-found and not-authorized, without echoing the id — mirroring the #17 resolution. Leave paths that operate only on an already-resolved/authorized workspace as-is.Priority
P3 — information disclosure, minor (same class as #17).