Skip to content

[P0.7] Bind workspaces to an owner and scope credentials per-user (multi-user IDOR + shared machine-wide secrets) #718

Description

@frankbria

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).

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions