Severity: high | Category: security | Phase: P0.7
Problem
With no WORKSPACE_ROOT (the self-hosted default) enforce_workspace_allowlist skips its containment check, so any authenticated user can pass ?workspace_path=/any/.codeframe and read/write another user's git/tasks/PRD/proof. Credential + GitHub-PAT endpoints are machine-wide and gated only on require_auth, so every user shares, can view last-4 of, and can overwrite/delete one set of LLM keys and one GitHub PAT.
Evidence
codeframe/ui/dependencies.py:74, codeframe/ui/routers/workspace_v2.py:170 (owner_user_id=None), codeframe/ui/routers/settings_v2.py:196
Acceptance criteria
- Deployments intended for >1 user require
WORKSPACE_ROOT (fail closed if unset in hosted mode).
- Workspaces persist
owner_user_id from auth["user_id"]; access is owner-filtered when auth is on.
- Credential storage is per-user scoped, OR the single-trust-domain limitation is enforced/documented and the multi-user path is blocked.
Dependencies
blocked by #717 ([P0.6])
Filed from the SaaS launch-readiness audit. Atomic: one developer, one session. Work order: strictly P0.1 → P3.12 (no forward dependencies).
Severity: high | Category: security | Phase: P0.7
Problem
With no
WORKSPACE_ROOT(the self-hosted default)enforce_workspace_allowlistskips its containment check, so any authenticated user can pass?workspace_path=/any/.codeframeand read/write another user's git/tasks/PRD/proof. Credential + GitHub-PAT endpoints are machine-wide and gated only onrequire_auth, so every user shares, can view last-4 of, and can overwrite/delete one set of LLM keys and one GitHub PAT.Evidence
codeframe/ui/dependencies.py:74,codeframe/ui/routers/workspace_v2.py:170(owner_user_id=None),codeframe/ui/routers/settings_v2.py:196Acceptance criteria
WORKSPACE_ROOT(fail closed if unset in hosted mode).owner_user_idfromauth["user_id"]; access is owner-filtered when auth is on.Dependencies
blocked by #717 ([P0.6])
Filed from the SaaS launch-readiness audit. Atomic: one developer, one session. Work order: strictly P0.1 → P3.12 (no forward dependencies).