PraisonAI has Cross-Workspace IDOR and Privilege Escalation via Platform API
Date: 2026-05
Affected: pip/praisonai-platform
Attack vector: auth-bypass
Category: vulnerability-disclosure
Severity: High
CVE: CVE-2026-48169
CWE: CWE-639
CWE-862
CVSS: 8.8 (CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H)

### Summary The PraisonAI Platform API has two authorization failures that together break workspace isolation. The service layer for issues and projects performs global primary-key lookups without checking workspace ownership, so any authenticated user can read, modify, and delete resources in any workspace just by swapping UUIDs in their API requests. On top of that, every member management endpoint (add, update role, remove) only requires `min_role="member"`, which lets any workspace member promote themselves to owner and kick out the original owner. A low-privilege member of one workspace can steal data from every other workspace and take over any workspace they belong to. Both issues come from the same gap: the route layer pulls `workspace_id` from the URL and verifies membership, but the service layer ignores the workspace scope for resource lookups and ignores the caller's role level for member operations. The `require_workspace_member()` dependency does its job correctly. The problem is that the service layer doesn't use the information it provides. ### Details #### Part 1: Cross-Workspace IDOR (Issues and Projects) **Vulnerable Files:** - `praisonai_platform/services/issue_service.py` - `praisonai_platform/services/project_service.py` - `praisonai_platform/api/routes/issues.py` - `praisonai_platform/api/routes/projects.py` There is a consistent split between the route layer and the service layer. Routes pull `workspace_id` from the URL and verify membership: ``


Mitigations:

Architectural layers (MAESTRO):