Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAuthenticate with low-privileged account
-
DeliveryPOST to /api/core/tasks/start with InstallPlugin task
-
ExploitBypass missing plugin-management authorization
-
ExecutionRoot task worker invokes pip on attacker-controlled package
-
PersistMalicious package setup runs as root
-
ImpactFull host compromise
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V8 - Authorization Authorization checks on every request
MITRE ATT&CK
1 technique across 1 tactic: Privilege Escalation The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Requires a valid authenticated account on the Ajenti panel of ANY privilege level - the vulnerability is precisely that no plugin-management permission is enforced on the /api/core/tasks/start task API (InstallPlugin, UnInstallPlugin, UpgradeAll). Exploitation works against default configurations (the missing authorization is the default state prior to 2.2.16) and needs no user interaction. The only limiting factors are: the attacker must hold or obtain a low-privileged account, and the target must run a version below 2.2.16; the task worker must be running as root (its normal operating mode) for the pip invocation to yield root code execution. |
| Impact | This is a genuine top-priority vulnerability, not a high-CVSS-but-low-risk case. The CVSS 3.1 vector (AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H = 9.9) is well-justified: a network-reachable, low-complexity, no-user-interaction flaw that lets a low-privileged authenticated user reach root code execution with a scope change (breaking out of the app context to the host OS). The source-code evidence corroborates the root cause - the fix commit (3a8cbee3) introduces a PermissionProvider and @authorize decorators on tasks that previously had none, confirming CWE-862 missing authorization on InstallPlugin/UnInstallPlugin/UpgradeAll. The single mitigating factor is PR:L: an attacker needs some valid (even minimal) account on the panel, so this is not fully unauthenticated. No EPSS score, no CISA KEV listing, and no public exploit are present in the provided data, so predicted/active exploitation is unquantified - the severity here rests on impact and ease of exploitation rather than confirmed in-the-wild activity. Given a server admin panel is inherently a high-value target and the pip-as-root path yields trivial, reliable root RCE, defenders should treat this as urgent regardless of the missing EPSS/KEV signals. |
| Exploit ScenarioDerived | An attacker with any low-privileged Ajenti account (or a compromised limited account) sends a crafted POST to /api/core/tasks/start enqueuing an InstallPlugin task with an attacker-chosen package name/version. The task worker, running as root, invokes pip with that unvalidated spec, installing a malicious or attacker-controlled package whose setup code executes as root, yielding full host compromise. No public exploit is identified in the provided data, but the attack is straightforward given the documented API and root-level pip invocation. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Sep 21, 2026
Authenticated users of the Ajenti server admin panel - at any privilege level - can achieve root-level code execution and full host compromise on installations below version 2.2.16 by invoking the task API endpoint /api/core/tasks/start, which enforces no plugin-management authorization before enqueuing InstallPlugin, UnInstallPlugin, or UpgradeAll tasks whose package specifications are built from unvalidated name and version fields and then executed by pip under root. The assessed vector (CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H, 9.9) confirms a network-reachable, low-privilege, no-interaction attack that escapes the panel's own security scope by gaining root on the underlying host, and exploitation works against default configurations since the missing permission check is the pre-2.2.16 default state. No public exploit code has been identified at time of analysis, and the flaw is not confirmed as actively exploited (no CISA KEV entry); nonetheless it is a genuine top-priority issue because a valid low-privileged account converts directly into root on the server.
RemediationAI
Upgrade Ajenti to version 2.2.16 or later - the vendor-released patch - which adds a PermissionProvider declaring plugins:install, plugins:uninstall, and plugins:upgrade (each defaulting to disabled) and applies @authorize decorators to the InstallPlugin, UnInstallPlugin, and UpgradeAll tasks so the task API can no longer be driven without explicit plugin-management rights; see https://github.com/ajenti/ajenti/security/advisories/GHSA-j8xf-5fw2-f99q and https://github.com/ajenti/ajenti/releases/tag/v2.2.16. Because the flaw is reachable by any authenticated account, first reduce the blast radius by auditing and removing dormant or unnecessary Ajenti accounts and resetting credentials for any user who could be low-privileged, then confirm that no non-administrative user has been granted the new plugin permissions after upgrading. If immediate upgrade is not possible, compensating controls include blocking or restricting network access to /api/core/tasks/start at a reverse proxy or firewall so that only trusted administrative source addresses can reach the task API (trade-off: it disables legitimate remote task submission and must be kept in sync with the fixed version), and removing or disabling the bundled plugins plugin so the dangerous task classes are not registered at all (trade-off: administrators lose the ability to install, uninstall, or upgrade plugins through the panel until the plugin is restored). A weaker but sometimes practical measure is to run the Ajenti task worker as an unprivileged service account rather than root, which downgrades the pip execution from root code execution to that account's privileges, but this breaks legitimate plugin installation paths that require root and should be treated as temporary containment rather than a fix.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
The root cause is CWE-862 (Missing Authorization): Ajenti's plugin subsystem (plugins/plugins/tasks.py) exposed InstallPlugin, UnInstallPlugin, and UpgradeAll task classes but never gated them behind a permission check, so the generic task dispatcher at /api/core/tasks/start would accept and enqueue them for any authenticated session regardless of role. InstallPlugin and UnInstallPlugin interpolate the caller-supplied name and version fields directly into a pip package specification, and the task worker executes pip with root privileges - its normal operating mode - meaning the panel's own privileged process performs attacker-influenced package resolution and installation of a remote package, yielding arbitrary code execution as root rather than merely a panel-level privilege escalation. The CVSS scope change (S:C) reflects that the compromise moves from the Ajenti web application into the host operating system, affecting all components on the machine. The upstream fix introduces a PermissionProvider in plugins/plugins/main.py declaring three new permissions (plugins:install, plugins:uninstall, plugins:upgrade, all defaulting to False) and decorates the task classes with @authorize('plugins:install'), @authorize('plugins:uninstall'), and @authorize('plugins:upgrade') in plugins/plugins/tasks.py, closing the missing-authorization gap at the task layer. Ajenti is a modular Linux & BSD server administration panel, so the affected attack surface is exactly its plugin-management API rather than any third-party library.
Know when Ajenti gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H
Network API reachable, low complexity, needs only a low-privileged account (PR:L); missing authz lets pip run as root, breaking out of app scope (S:C) to full host compromise (C/I/A:H).
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
2DescriptionCVE.org
Ajenti is a Linux & BSD modular server admin panel. Prior to version 2.2.16, any authenticated user can call /api/core/tasks/start to enqueue InstallPlugin, UnInstallPlugin, or UpgradeAll from plugins/plugins/tasks.py without plugin-management authorization. InstallPlugin and UnInstallPlugin construct a pip package specification from unvalidated name and version fields, and the task worker invokes pip while running as root. A low-privileged user can therefore select or manipulate a package installed with root privileges and can install, remove, or upgrade plugins without administrative permission, resulting in root code execution and full host compromise. This issue is fixed in version 2.2.16.
Articles & Coverage 1
Technical POC Analysis
The flaw is CWE-862, Missing Authorization, in Ajenti's task execution path.
Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.
Executive ViewAI
Any organization running Ajenti server admin panel below version 2.2.16 is exposed to a critical control failure that can turn a routine authenticated low-privilege account into full root control of the managed host. Because the panel often sits in a trusted management path, a compromise could cascade into broader infrastructure access, making this a top-priority exposure for security leadership until a vendor fix is available. No public exploit identified at time of analysis.
Restrict Ajenti management interface to trusted networks/VPN; enforce MFA and least privilege; block or monitor /api/core/tasks/start and plugin-management task creation; isolate Ajenti hosts; audit logs for InstallPlugin/UnInstallPlugin/UpgradeAll and root-level pip execution. No vendor-released patch identified at time of analysis.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Remote Code Execution represents the critical moment when an attacker successfully runs arbitrary code on a target system without physical access.
Ajenti version version 2 contains a Cross ite Request Forgery (CSRF) vulnerability in the command execution panel of the
Ajenti version 2 contains an Information Disclosure vulnerability in Line 176 of the code source that can result in user
Ajenti version version 2 contains a Input Validation vulnerability in ID string on Get-values POST request that can resu
Ajenti version version 2 contains a Insecure Permissions vulnerability in Plugins download that can result in The downlo
ajenticp (aka Ajenti Docker control panel) for Ajenti through v1.2.23.13 has XSS via a filename that is mishandled in Fi
Unauthenticated remote code execution in Ajenti server admin panel before 2.2.13. Unauthenticated users can gain full se
Authentication bypass in Ajenti admin panel versions prior to 0.112 allows unauthenticated remote attackers to completel
Ajenti version version 2 contains a Improper Error Handling vulnerability in Login JSON request that can result in The r
Multiple cross-site scripting (XSS) vulnerabilities in the respond_error function in routing.py in Eugene Pankov Ajenti
Cross-site scripting (XSS) vulnerability in plugins/main/content/js/ajenti.coffee in Eugene Pankov Ajenti 1.2.13 allows
Remote authentication bypass in Ajenti prior to version 0.112 allows unauthenticated network attackers to circumvent two
EUVD-2026-84010
NVD
CVE.org
EPSS
Vulnrichment
GitHub
Exploit-DB