← Back to CVE Explorer

CVE-2026-47407

Full vulnerability record from the local CVENow database.

Description

PraisonAI Platform is the platform layer for the PraisonAI multi-agent teams system. Prior to version 0.1.4, the Platform server exposes resources under `/api/v1/workspaces/{workspace_id}/...` and protects them with a `require_workspace_member(workspace_id)` FastAPI dependency. The dependency only checks that the caller is a member of the workspace_id in the URL prefix. The route handlers then look up the inner resource (`agent_id`, `issue_id`, `project_id`, `label_id`, `comment_id`, `dependency_id`) by primary key alone. The resource's own `workspace_id` is never compared to the URL's `workspace_id`. A user can therefore put their own workspace in the URL prefix and any other workspace's resource ID in the path. The auth check passes, since they really are a member of the prefix workspace. The service then returns the cross-tenant resource for read, update, or delete. There is a second bug in the member-management routes (`add_member`, `update_member_role`, `remove_member`, `update_workspace`, `delete_workspace`). Each one inherits the default `min_role="member"` from `require_workspace_member`. Any basic member can therefore promote themselves to admin or owner, demote or remove other members, and delete the workspace. The role hierarchy exists in the schema but is not enforced. Registration is open at `/api/v1/auth/register` with no email verification. The default server bind is `0.0.0.0:8000` (`python -m praisonai_platform`). One curl from any unauthenticated network position is enough to bootstrap into the system. PraisonAI Platform version 0.1.4 patches the issue.

Severity
CRITICAL
CVSS score
9.4 (v4.0)
Vulnerability status
Deferred
Source identifier
Published
2026-07-21 17:17:09.363000
Last modified
2026-10-24 19:10:00.127000
View original CVE JSON
{
  "id": "CVE-2026-47407",
  "sourceIdentifier": "[email protected]",
  "published": "2026-07-21T17:17:09.363",
  "lastModified": "2026-10-24T19:10:00.127",
  "vulnStatus": "Deferred",
  "cveTags": [],
  "descriptions": [
    {
      "lang": "en",
      "value": "PraisonAI Platform is the platform layer for the PraisonAI multi-agent teams system. Prior to version 0.1.4, the Platform server exposes resources under `/api/v1/workspaces/{workspace_id}/...` and protects them with a `require_workspace_member(workspace_id)` FastAPI dependency. The dependency only checks that the caller is a member of the workspace_id in the URL prefix. The route handlers then look up the inner resource (`agent_id`, `issue_id`, `project_id`, `label_id`, `comment_id`, `dependency_id`) by primary key alone. The resource's own `workspace_id` is never compared to the URL's `workspace_id`. A user can therefore put their own workspace in the URL prefix and any other workspace's resource ID in the path. The auth check passes, since they really are a member of the prefix workspace. The service then returns the cross-tenant resource for read, update, or delete. There is a second bug in the member-management routes (`add_member`, `update_member_role`, `remove_member`, `update_workspace`, `delete_workspace`). Each one inherits the default `min_role=\"member\"` from `require_workspace_member`. Any basic member can therefore promote themselves to admin or owner, demote or remove other members, and delete the workspace. The role hierarchy exists in the schema but is not enforced. Registration is open at `/api/v1/auth/register` with no email verification. The default server bind is `0.0.0.0:8000` (`python -m praisonai_platform`). One curl from any unauthenticated network position is enough to bootstrap into the system. PraisonAI Platform version 0.1.4 patches the issue."
    },
    {
      "lang": "es",
      "value": "PraisonAI Platform es la capa de plataforma para el sistema de equipos multiagente de PraisonAI. Antes de la versión 0.1.4, el servidor de la Plataforma expone recursos bajo “/api/v1/workspaces/{workspace_id}/...” y los protege con una dependencia de FastAPI “require_workspace_member(workspace_id)”. La dependencia solo verifica que el llamador es miembro del workspace_id en el prefijo de la URL. Los manejadores de ruta luego buscan el recurso interno (“agent_id”, “issue_id”, “project_id”, “label_id”, “comment_id”, “dependency_id”) solo por clave primaria. El “workspace_id” propio del recurso nunca se compara con el “workspace_id” de la URL. Un usuario puede, por lo tanto, poner su propio espacio de trabajo en el prefijo de la URL y el ID de recurso de cualquier otro espacio de trabajo en la ruta. La verificación de autenticación pasa, ya que realmente son miembros del espacio de trabajo del prefijo. El servicio luego devuelve el recurso entre inquilinos para lectura, actualización o eliminación. Hay un segundo error en las rutas de gestión de miembros (“add_member”, “update_member_role”, “remove_member”, “update_workspace”, “delete_workspace”). Cada una hereda el valor predeterminado “min_role=“member”” de “require_workspace_member”. Cualquier miembro básico puede, por lo tanto, promoverse a administrador o propietario, degradar o eliminar a otros miembros, y eliminar el espacio de trabajo. La jerarquía de roles existe en el esquema pero no se aplica. El registro está abierto en “/api/v1/auth/register” sin verificación de correo electrónico. El enlace de servidor predeterminado es “0.0.0.0:8000” (“python -m praisonai_platform”). Un solo curl desde cualquier posición de red no autenticada es suficiente para arrancar en el sistema. PraisonAI Platform versión 0.1.4 corrige el problema."
    }
  ],
  "affected": [
    {
      "source": "[email protected]",
      "affectedData": [
        {
          "vendor": "MervinPraison",
          "product": "praisonai-platform",
          "versions": [
            {
              "version": "< 0.1.4",
              "status": "affected"
            }
          ]
        }
      ]
    }
  ],
  "metrics": {
    "cvssMetricV40": [
      {
        "source": "[email protected]",
        "type": "Secondary",
        "cvssData": {
          "version": "4.0",
          "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X",
          "baseScore": 9.4,
          "baseSeverity": "CRITICAL",
          "attackVector": "NETWORK",
          "attackComplexity": "LOW",
          "attackRequirements": "NONE",
          "privilegesRequired": "LOW",
          "userInteraction": "NONE",
          "vulnConfidentialityImpact": "HIGH",
          "vulnIntegrityImpact": "HIGH",
          "vulnAvailabilityImpact": "HIGH",
          "subConfidentialityImpact": "HIGH",
          "subIntegrityImpact": "HIGH",
          "subAvailabilityImpact": "HIGH",
          "exploitMaturity": "NOT_DEFINED",
          "confidentialityRequirement": "NOT_DEFINED",
          "integrityRequirement": "NOT_DEFINED",
          "availabilityRequirement": "NOT_DEFINED",
          "modifiedAttackVector": "NOT_DEFINED",
          "modifiedAttackComplexity": "NOT_DEFINED",
          "modifiedAttackRequirements": "NOT_DEFINED",
          "modifiedPrivilegesRequired": "NOT_DEFINED",
          "modifiedUserInteraction": "NOT_DEFINED",
          "modifiedVulnConfidentialityImpact": "NOT_DEFINED",
          "modifiedVulnIntegrityImpact": "NOT_DEFINED",
          "modifiedVulnAvailabilityImpact": "NOT_DEFINED",
          "modifiedSubConfidentialityImpact": "NOT_DEFINED",
          "modifiedSubIntegrityImpact": "NOT_DEFINED",
          "modifiedSubAvailabilityImpact": "NOT_DEFINED",
          "Safety": "NOT_DEFINED",
          "Automatable": "NOT_DEFINED",
          "Recovery": "NOT_DEFINED",
          "valueDensity": "NOT_DEFINED",
          "vulnerabilityResponseEffort": "NOT_DEFINED",
          "providerUrgency": "NOT_DEFINED"
        }
      }
    ],
    "ssvcV203": [
      {
        "source": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
        "ssvcData": {
          "timestamp": "2026-07-22T14:15:03.095254Z",
          "id": "CVE-2026-47407",
          "options": [
            {
              "exploitation": "poc"
            },
            {
              "automatable": "no"
            },
            {
              "technicalImpact": "total"
            }
          ],
          "role": "CISA Coordinator",
          "version": "2.0.3"
        }
      }
    ]
  },
  "weaknesses": [
    {
      "source": "[email protected]",
      "type": "Secondary",
      "description": [
        {
          "lang": "en",
          "value": "CWE-269"
        },
        {
          "lang": "en",
          "value": "CWE-639"
        },
        {
          "lang": "en",
          "value": "CWE-863"
        }
      ]
    }
  ],
  "references": [
    {
      "url": "https://github.com/MervinPraison/PraisonAI/commit/24385d64876577620f749957bd4814f162f4ca47",
      "source": "[email protected]"
    },
    {
      "url": "https://github.com/MervinPraison/PraisonAI/pull/1686",
      "source": "[email protected]"
    },
    {
      "url": "https://github.com/MervinPraison/PraisonAI/security/advisories/GHSA-h8q5-cp56-rr65",
      "source": "[email protected]"
    },
    {
      "url": "https://github.com/MervinPraison/PraisonAI/security/advisories/GHSA-h8q5-cp56-rr65",
      "source": "134c704f-9b21-4f2e-91b3-4a467353bcc0"
    }
  ]
}