CVE-2026-105633
HighCVSS 7.1Exploitation Probability (EPSS)
Low risk21th percentile - higher than 21% of all known CVEs
Summary
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.
Risk Assessment
A low-privileged attacker can take ownership of other users' attachments within a project, leading to confidentiality and integrity breaches. This may result in unauthorized access to files and further attacks within the application.
Recommendation
Update Plane to version 1.4.0 or later, which fixes this vulnerability. Until then, restrict the ability to upload and modify attachments for low-privileged users.
Other vulnerabilities in Plane
See all- CVE-2026-102982High
A vulnerability in Plane before version 1.4.0 involves failure to sanitize unsafe URL schemes in comments (comment_html). A project member can store a crafted link in a comment, and attacker-controlled script executes in the browser of another user who clicks the link. The issue is fixed in version 1.4.0.
- CVE-2026-104892High
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.
- 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-102986High
Plane, an open-source project management tool, in 1.3.1 and earlier has an EntityAssetEndpoint at /api/public/assets/v2/anchor/{anchor}/ that requires authentication for write operations but does not verify workspace or project membership. An authenticated user who knows a published project's public DeployBoard.anchor can create FileAsset records in that project and soft-delete existing assets by identifier, allowing cross-workspace file injection, storage abuse, and data loss.
- CVE-2026-102985Medium
In Plane 1.3.1 and earlier, ProjectMemberViewSet.partial_update places its authorization checks inside the role update branch, so a guest or member can omit role and change another ProjectMember record's is_active field, including deactivating a project administrator. Additionally, ProjectMemberPreferenceEndpoint.patch trusts the member_id path value and lets a project member overwrite another member's preferences. The vulnerability is fixed in 1.4.0.
Original NVD description (English source)
Plane is an open-source project management tool. 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. Because the server matches only pk, workspace, and project_id, it modifies the attachment regardless of the issue_id in the URL. When the attachment is pending and has not been confirmed as uploaded, the PATCH handler sets created_by = request.user and transfers attachment ownership to the attacker. This issue is fixed in 1.4.0.
Vulnerability data from NVD (NIST) · CISA KEV · EPSS

