Skip to main content
CVE Vulnerability Database
Vulnerability Database/CVE-2026-44846

CVE-2026-44846: JumpServer Privilege Escalation Vulnerability

CVE-2026-44846 is a privilege escalation vulnerability in JumpServer that allows users with invite permissions to manipulate organization roles and gain unauthorized privileges. This article covers technical details, affected versions, security impact, and mitigation strategies.

Published:

CVE-2026-44846 Overview

CVE-2026-44846 is an authorization flaw in JumpServer, an open source bastion host and operations security audit system. Versions prior to 4.10.17 allow a user holding the users.invite_user permission to submit an existing organization member to the POST /api/v1/users/users/invite/ endpoint. The invitation logic in apps/users/api/user.py then invokes user.org_roles.set(org_roles), replacing the target member's existing organization roles. This behavior enables an authorized inviter to escalate their own privileges or downgrade administrators. The issue is fixed in version 4.10.17 and is tracked under CWE-863: Incorrect Authorization.

Critical Impact

An attacker with invitation privileges can overwrite organization role assignments on existing members, escalating privileges or downgrading administrators inside the JumpServer bastion host.

Affected Products

  • JumpServer versions prior to 4.10.17
  • JumpServer open source bastion host and operations security audit system
  • Deployments exposing the POST /api/v1/users/users/invite/ API endpoint

Discovery Timeline

  • 2026-08-17 - CVE-2026-44846 published to NVD
  • 2026-08-18 - Last updated in NVD database
  • Patch released - JumpServer maintainers publish v4.10.17 and GHSA-j836-99w5-523r

Technical Details for CVE-2026-44846

Vulnerability Analysis

The vulnerability resides in the invitation handler in apps/users/api/user.py. When a caller with the users.invite_user permission submits a user identifier, the handler iterates the supplied users and unconditionally calls user.org_roles.set(org_roles). The .set() method on the many-to-many role relation replaces the entire role collection rather than adding to it. Existing organization members are therefore mutated by the invite path, even though the endpoint is intended only for new members. A low-privilege user with delegated invitation rights can target an administrator and replace their roles with a lower-privilege set, or supply themselves with elevated roles.

Root Cause

The root cause is missing membership validation combined with an overly broad role assignment call. The endpoint does not verify whether the invited principal is already a member of the current organization before mutating roles. The use of org_roles.set() also removes existing role assignments in a single call. Together, these two design choices convert an invite-only feature into a role-replacement primitive, which fits the CWE-863 pattern of incorrect authorization.

Attack Vector

Exploitation requires an authenticated user account that already holds the users.invite_user permission, so the attack is network-reachable but gated by prior privilege. The attacker sends a crafted POST request to /api/v1/users/users/invite/ naming an existing member, along with the desired organization roles. The server replaces the target's roles, granting the attacker a path to vertical privilege escalation or to sabotage administrators.

python
# Patch from apps/users/api/user.py (JumpServer commit 1803be1)
        if has_self and not request.user.is_superuser:
            error = {"error": _("Can not invite self")}
            return Response(error, status=400)

        for user in users:
-            user.org_roles.set(org_roles)
+            if current_org in user.joined_orgs:
+                error = {
+                    "error": _("This user {} is already a member of the organization. "
+                                "No need to invite again").format(user.username)
+                }
+                return Response(error, status=400)
+            # Append roles; do not clear existing ones
+            user.org_roles.add(*org_roles)
        return Response(serializer.data, status=201)

Source: JumpServer commit 1803be11. The patch rejects invites for users already in the organization and switches from set() to add() so existing roles are preserved.

Detection Methods for CVE-2026-44846

Indicators of Compromise

  • Unexpected POST requests to /api/v1/users/users/invite/ targeting usernames already present in the organization.
  • Audit log entries showing organization role changes for administrators without an associated administrative action.
  • Repeated invitation attempts by the same low-privilege account referencing multiple existing members.

Detection Strategies

  • Correlate JumpServer audit logs for invitation API calls with subsequent org_roles mutation events on the same target user.
  • Alert when a non-superuser account issues invitations that resolve to already-joined organization members.
  • Baseline the set of accounts holding users.invite_user and flag privilege changes originating from that population.

Monitoring Recommendations

  • Forward JumpServer application and audit logs to a centralized SIEM for retention and query.
  • Track administrator role membership over time and alert on any downgrade or unexpected additions.
  • Monitor authentication and session activity for accounts whose roles change shortly after an invitation API call.

How to Mitigate CVE-2026-44846

Immediate Actions Required

  • Upgrade JumpServer to version 4.10.17 or later, published in release v4.10.17.
  • Review the list of accounts holding the users.invite_user permission and remove it from any account that does not require it.
  • Audit recent organization role changes and restore any administrator roles that were altered by unauthorized invitations.

Patch Information

The fix is delivered in JumpServer 4.10.17 via pull request #16662 and commit 1803be11. The patch adds a membership check that rejects invitations for existing organization members and replaces user.org_roles.set(org_roles) with user.org_roles.add(*org_roles) so existing roles are preserved. Full details are in GHSA-j836-99w5-523r.

Workarounds

  • Restrict the users.invite_user permission to trusted administrators until the upgrade is applied.
  • Place the JumpServer administrative API behind network access controls that limit which principals can reach /api/v1/users/users/invite/.
  • Enable strict audit logging and manually review invitations that reference existing organization members.
bash
# Verify running JumpServer version and required upgrade target
curl -sS https://<jumpserver-host>/api/v1/prometheus/metrics | grep jumpserver_version
# Expected after remediation: version >= 4.10.17

Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.

Default Legacy - Prefooter | Experience the World’s Most Advanced Cybersecurity Platform

Experience the Most Advanced Cybersecurity Platform

See how the world’s most intelligent, autonomous cybersecurity platform can protect your organization today and into the future.