CVE-2026-104892
HighCVSS 8.7Summary
In Plane prior to 1.4.0, the aPITokenLogMiddleware logs API keys in plaintext. This allows someone with low privileges to steal user API keys and further escalate their privileges.
Risk Assessment
A low-privileged user can steal other users' API keys, leading to privilege escalation and unauthorized access to resources. This violates credential confidentiality.
Recommendation
Update Plane to version 1.4.0. Until then, disable or modify plaintext API key logging and revoke potentially exposed keys.
Other vulnerabilities in Plane
See all- CVE-2026-105641Critical
Plane prior to 1.4.0, the deployments/aio/community/ and deployments/cli/community/ manifests provide fixed, publicly known SECRET_KEY and LIVE_SERVER_SECRET_KEY defaults that remain active when operators do not override them. Knowledge of SECRET_KEY enables attackers to forge Django-signed values and compromise accounts or sessions. Knowledge of LIVE_SERVER_SECRET_KEY bypasses live-service authentication on unchanged community deployments.
- CVE-2026-105640Critical
Plane prior to 1.4.0 trusts email addresses returned by Gitea OAuth and by self-managed GitLab OAuth deployments where email confirmation is disabled, without verifying that the provider authenticated ownership of the address. An attacker can set an OAuth identity's unverified provider email to a victim's address, which Plane matches directly to the victim's existing local account. The attacker can then log in to the victim's Plane account without knowing the victim's password. GitHub, GitLab.com, and Google are not affected because those providers return verified email addresses.
- CVE-2026-105639Critical
Plane prior to 1.4.0, the signup flow creates a logged-in User row for any submitted email without an out-of-band ownership check, while User.email is unique=True. The authenticated user can call GET /api/users/me/workspaces/invitations/, which returns each WorkspaceMemberInvite whose email matches request.user.email. WorkSpaceMemberInviteSerializer uses fields = "all", exposing the token that protects the invitation join endpoint. An unauthenticated attacker who knows a target's email can register an account using that address, enumerate pending invitations, and accept an invitation as the target, joining a workspace at the invited role.
- CVE-2026-105638Critical
Plane prior to 1.4.0, the magic-code email login uses a six-digit numeric OTP with approximately 20 bits of entropy. The verifier has no per-code failed-attempt counter, and an incorrect code does not increment a counter, invalidate the Redis entry, or lock the email address. The verifier extends django.views.View rather than DRF's APIView, so the configured AnonRateThrottle limit does not apply. The middleware stack also contains no Django-level rate limiter such as django-ratelimit, django-axes, or an IP-throttling middleware.
- CVE-2026-105637Critical
Prior to version 1.4.0 of Plane, the ProjectBulkAssetEndpoint.post endpoint did not constrain asset queries to the project from the URL. A workspace Guest could provide asset UUIDs from another project in the same workspace and reassign them to an attacker-controlled entity, allowing file hijacking.
- CVE-2026-105636Critical
Prior to version 1.4.0 of Plane, the webhook delivery task did not set allow_redirects=False and did not validate redirect targets. A user with workspace creation rights could register a webhook pointing to an attacker-controlled public endpoint that returns a 302 redirect to an internal address, allowing access to internal resources including cloud metadata.
- CVE-2026-105635High
Plane is an open-source project management tool. Prior to 1.4.0, ProjectJoinEndpoint at GET /api/workspaces/{slug}/projects/{project_id}/join/{pk}/ uses permission_classes = [AllowAny] and returns the full ProjectMemberInvite record, including its email, token, and role, to unauthenticated callers. The corresponding POST endpoint checks only whether the submitted email matches project_invite.email and does not validate the invitation token. An attacker who knows the invitation UUID can discover the invited email, register an account with that email, and accept the invitation without receiving the original invite. This issue is fixed in 1.4.0.
- CVE-2026-105634High
Plane is an open-source project management tool. Prior to 1.3.0, the ProjectMemberViewSet.partial_update method allows any project member, including a user with the lowest GUEST role, to modify another project member's role. The authorization check prevents assigning a role higher than the requester's role but does not prevent assigning a lower or equal role, allowing a Guest to demote Administrators and Members and deny them project control. This vulnerability is fixed in 1.3.0.
- CVE-2026-105633High
In Plane prior to 1.4.0, the V2 issue-attachment PATCH endpoint accepts issue_id in the URL but omits it from the database query. A project member can use an issue_id they control in the URL while targeting another user's attachment by its pk UUID. When the attachment is pending and not yet confirmed as uploaded, the PATCH handler sets created_by = request.user and transfers attachment ownership to the attacker.
- CVE-2026-105632High
In Plane prior to 1.4.0, the GraphQL joinProject mutation lets any workspace member add themselves to any project in that workspace, including network=0 (secret/private) projects they were never invited to, and grants them a full Member role (read + write). The resolver checks only workspace-level membership/role and never checks the target project's visibility (network). This collapses project-level tenant isolation within a workspace.
Original NVD description (English source)
Plane is an open-source project management tool. Prior to 1.4.0, aPITokenLogMiddleware logs API keys in plaintext. This allows someone with low privileges to steal user API keys and further escalate their privileges. This issue is fixed in 1.4.0.
Vulnerability data from NVD (NIST) · CISA KEV · EPSS

