Problem (gates hosted / multi-tenant — NOT a single-user beta blocker)
get_v2_workspace resolves workspace_path from a client-supplied query parameter and only checks workspace_exists(path) — there is no allowlist of permitted roots. Because the ReAct agent exposes run_command (arbitrary shell=True execution) and file create/edit tools scoped only to the chosen workspace, an authenticated user can point operations at any directory on the host and effectively gains arbitrary code execution / host filesystem read-write.
Acceptable-by-design for a single-operator local tool (the operator already owns the box). It becomes authenticated RCE across tenant boundaries the moment the server is exposed to more than one user or run in DeploymentMode.HOSTED.
Evidence
codeframe/ui/dependencies.py:38-97 — get_v2_workspace resolves arbitrary workspace_path, checks only .codeframe marker
codeframe/core/tools.py:760-810 — _execute_run_command (shell=True)
Fix
- Introduce a configurable allowlist of permitted workspace roots (e.g.
WORKSPACE_ROOT); reject any resolved workspace_path not contained within an allowed root.
- In HOSTED mode, bind every workspace to the authenticated user. Do not treat the
.codeframe marker as authorization.
Acceptance criteria
Source: release-readiness audit 2026-06-13 (security agent, finding M1). Gate any hosted offering on this.
Problem (gates hosted / multi-tenant — NOT a single-user beta blocker)
get_v2_workspaceresolvesworkspace_pathfrom a client-supplied query parameter and only checksworkspace_exists(path)— there is no allowlist of permitted roots. Because the ReAct agent exposesrun_command(arbitraryshell=Trueexecution) and file create/edit tools scoped only to the chosen workspace, an authenticated user can point operations at any directory on the host and effectively gains arbitrary code execution / host filesystem read-write.Acceptable-by-design for a single-operator local tool (the operator already owns the box). It becomes authenticated RCE across tenant boundaries the moment the server is exposed to more than one user or run in
DeploymentMode.HOSTED.Evidence
codeframe/ui/dependencies.py:38-97—get_v2_workspaceresolves arbitraryworkspace_path, checks only.codeframemarkercodeframe/core/tools.py:760-810—_execute_run_command(shell=True)Fix
WORKSPACE_ROOT); reject any resolvedworkspace_pathnot contained within an allowed root..codeframemarker as authorization.Acceptance criteria
Source: release-readiness audit 2026-06-13 (security agent, finding M1). Gate any hosted offering on this.