CVE-2026-79920
Executive Summary
CVE-2026-79920 is a missing authorization vulnerability (CWE-862) in Ajenti, a modular Linux and BSD server administration panel. Any authenticated, low-privileged user can invoke the task API endpoint /api/core/tasks/start to enqueue plugin-management tasks that should require administrative authorization, and the task worker executes these operations with root privileges. Successful exploitation allows a low-privileged user to install, remove, or upgrade plugins — and, by manipulating package name/version fields, to select an attacker-controlled pip package that is then installed as root, resulting in root code execution and full host compromise (CVSS 9.9).
This record — and 170,000+ others — are available via the ValtersIT API. One endpoint replaces five: NVD + GitHub CVE + CISA KEV + EPSS + Nuclei + Exploit-DB, unified.
No signup required
Technical Analysis
Ajenti exposes a task-dispatch API through the endpoint /api/core/tasks/start. The task classes involved are InstallPlugin, UnInstallPlugin, and UpgradeAll, defined in the module plugins/plugins/tasks.py. The core defect is that the endpoint does not enforce plugin-management authorization: it verifies that a caller is authenticated, but does not verify that the caller holds the administrative permission required for plugin lifecycle management. Because the API only checks authentication and not the specific authorization requirement, any authenticated user — regardless of privilege level — can enqueue these tasks.
InstallPlugin and UnInstallPlugin construct a pip package specification from the name and version fields without validating those fields. The task worker then invokes pip while running as root. This creates two compounding weaknesses:
Missing authorization (CWE-862): the plugin-management capability is reachable by users who should not have it, because the authorization check is absent rather than merely misconfigured.
Unvalidated input into a privileged package operation: because
nameandversionare attacker-influenced and not sanitized before being assembled into a pip package specification, the attacker controls which package and which version is resolved and installed by the root-privileged worker.
The combination transforms a horizontal privilege issue (a standard user gaining plugin-management rights) into a vertical privilege escalation (root code execution). The UpgradeAll task further allows an attacker to trigger upgrades without administrative permission, giving a path to change the installed plugin set or downgrade/upgrade components at will.
The CVSS vector reflects this: AV:N (network reachable), AC:L (no special conditions), PR:L (only low privileges required), UI:N (no user interaction), S:C (the vulnerable component and the impacted component — the host — are in different security scopes), and C:H/I:H/A:H (full loss of confidentiality, integrity, and availability). The scope change is central: the API process is compromised at one privilege level, but the consequence lands in the root context of the underlying operating system.
The vulnerability class is missing authorization leading to arbitrary privileged package installation. No public proof-of-concept, Nuclei template, or exploit code is available in this dataset, and EPSS has not yet scored the CVE. The attack chain below is therefore described at the vulnerability-class level and limited to the specific names, endpoints, and fields named in the NVD description.
Exploitation Scenarios
1) Reconnaissance / target identification. An attacker with valid low-privileged credentials on an Ajenti instance (version prior to 2.2.16) identifies the admin panel and its API surface. Because the panel is network-reachable (AV:N), the attacker needs only network access to the panel and any authenticated account.
2) Triggering the flaw class. The attacker issues a request to the task-dispatch endpoint /api/core/tasks/start, specifying a plugin-management task. The three task types named in the description are InstallPlugin, UnInstallPlugin, and UpgradeAll from plugins/plugins/tasks.py. Because the endpoint performs authentication but not a plugin-management authorization check, the low-privileged user's request is accepted and the task is enqueued — no administrative permission is required.
3) Payload / execution at the vulnerability-class level. For InstallPlugin, the attacker controls the name and version fields. These fields are used to construct a pip package specification without validation, and the task worker invokes pip as root. By selecting or manipulating a package specifier via those unvalidated fields, the attacker influences which package the root worker installs. For UnInstallPlugin, the attacker can remove a package at root level. UpgradeAll allows triggering upgrades without administrative permission. The result is attacker-influenced package installation/removal/upgrade executed with root privileges.
4) Post-exploitation impact. Root-level package manipulation leads to root code execution and full host compromise. From there, an attacker can gain persistent root access on the managed server, pivot into the environment the host manages, and impact the integrity and availability of services. UnInstallPlugin additionally provides a destructive removal path that can degrade or break the panel and managed services.
No public PoC is available; the chain is inferred from the vulnerability class (missing authorization over a privileged task API processing unvalidated package fields).
Impact Assessment
The affected component is the Ajenti server admin panel, a management-plane application that typically runs with high privilege on Linux and BSD hosts. Impact is critical:
- Confidentiality (C:H): root access exposes all data and secrets on the host.
- Integrity (I:H): the attacker can install, remove, or alter plugins and packages at root level.
- Availability (A:H): plugin removal (
UnInstallPlugin) or arbitrary package changes can break the panel and managed services. - Scope (S:C): the compromised security authority (the panel) is distinct from the impacted authority (the host operating system), which amplifies the impact beyond the vulnerable component.
The blast radius is any Ajenti instance prior to 2.2.16 that has more than one class of authenticated user, because the missing authorization converts a normal account into a root-level capability. Given the CVSS score of 9.9 and the PR:L precondition, this is treated as a high-severity, remotely exploitable privilege escalation. No CISA KEV listing and no exploit-in-the-wild evidence are present in the provided data.
Detection Guidance
Sigma Rule
title: Ajenti Unauthorized Plugin Task Enqueue (CVE-2026-79920)
id: 7e4b9c11-3a52-4b0e-9d1a-ajenti79920
status: experimental
description: Detects calls to the Ajenti task API endpoint used to enqueue plugin-management tasks without authorization.
logsource:
product: webserver
service: ajenti
detection:
selection_endpoint:
cs-uri-stem|contains: '/api/core/tasks/start'
selection_task:
- cs-uri-query|contains|all:
- 'InstallPlugin'
- cs-uri-query|contains|all:
- 'UnInstallPlugin'
- cs-uri-query|contains|all:
- 'UpgradeAll'
condition: selection_endpoint and selection_task
falsepositives:
- Legitimate administrative plugin management activity
level: high
tags:
- attack.t1190
- cve.2026-79920
YARA Rule
rule CVE_2026_79920_Ajenti_Plugin_Task_Abuse
{
meta:
description = "Detects references to Ajenti task endpoint and privileged plugin task classes associated with CVE-2026-79920"
author = "Threat Intelligence"
reference = "CVE-2026-79920"
date = "2026-01-01"
severity = "high"
strings:
$ep = "/api/core/tasks/start" ascii wide nocase
$t1 = "InstallPlugin" ascii wide
$t2 = "UnInstallPlugin" ascii wide
$t3 = "UpgradeAll" ascii wide
$mod = "plugins/plugins/tasks.py" ascii wide
condition:
$ep and any of ($t*) or ($mod and any of ($t*))
}
Suricata IDS Rule
alert http any any -> any any (msg:"CVE-2026-79920 Ajenti Unauthorized Plugin Task Enqueue"; flow:established,to_server; http.uri; content:"/api/core/tasks/start"; http.uri; content:"InstallPlugin"; nocase; sid:7992001; rev:1;)
alert http any any -> any any (msg:"CVE-2026-79920 Ajenti Unauthorized Plugin Task Enqueue (UnInstallPlugin)"; flow:established,to_server; http.uri; content:"/api/core/tasks/start"; http.uri; content:"UnInstallPlugin"; nocase; sid:7992002; rev:1;)
alert http any any -> any any (msg:"CVE-2026-79920 Ajenti Unauthorized Plugin Task Enqueue (UpgradeAll)"; flow:established,to_server; http.uri; content:"/api/core/tasks/start"; http.uri; content:"UpgradeAll"; nocase; sid:7992003; rev:1;)
Elastic Detection
sequence by user.name
[ network where url.path == "/api/core/tasks/start" and
(url.query contains "InstallPlugin" or url.query contains "UnInstallPlugin" or url.query contains "UpgradeAll") ]
Splunk SPL Query
index=web OR index=proxy
| eval uri = coalesce(uri, url, request_url)
| where like(uri, "%/api/core/tasks/start%")
| where like(uri, "%InstallPlugin%") OR like(uri, "%UnInstallPlugin%") OR like(uri, "%UpgradeAll%")
| stats count min(_time) as first_seen max(_time) as last_seen by src_ip, user, uri
| where count > 0
| sort - count
Wazuh OSSEC Rule
<group name="ajenti,cve-2026-79920,">
<rule id="799201" level="12">
<decoded_as>web-accesslog</decoded_as>
<url>/api/core/tasks/start</url>
<regex>InstallPlugin|UnInstallPlugin|UpgradeAll</regex>
<description>CVE-2026-79920: Unauthorized Ajenti plugin task enqueue attempt via /api/core/tasks/start</description>
<mitre>
<id>T1190</id>
</mitre>
</rule>
</group>
Mitigation & Patch Guidance
Patch confidence: 0/4 (UNPATCHED — no patch evidence from any tracked source).
Immediate mitigations
- Restrict network access to the Ajenti panel so that only trusted administrative networks/hosts can reach the API, reducing the population of authenticated users who can call
/api/core/tasks/start. - Enforce least privilege on Ajenti accounts: audit all authenticated users and remove non-administrative accounts that do not strictly need panel access.
- Add an authorization control in front of the task-dispatch endpoint (reverse proxy/WAF rule) that denies non-admin identities from invoking plugin-management tasks.
- Monitor and alert on calls to
/api/core/tasks/startcontainingInstallPlugin,UnInstallPlugin, orUpgradeAll, per the detection guidance above.
- Restrict network access to the Ajenti panel so that only trusted administrative networks/hosts can reach the API, reducing the population of authenticated users who can call
Patch / upgrade steps
- Upgrade Ajenti to version 2.2.16 or later, where the authorization check for plugin-management tasks is enforced. Because no patch evidence was available from tracked sources, validate the fix directly against the vendor release notes and confirm the running version after upgrade.
- Verify the effective version of the deployed panel, since affected versions are "prior to 2.2.16".
Long-term hardening
- Apply server-side authorization checks (not just authentication) to all task-dispatch endpoints, especially those that execute privileged operations.
- Validate and sanitize package
nameandversioninputs before they are used to construct package specifications, and avoid running package operations from the web application as root where a lower-privilege execution context is feasible. - Maintain a plugin allowlist so that only approved plugins and versions can be installed by the task worker.
- Continuously monitor for unexpected package installation/removal events on hosts running Ajenti.
References
- NVD — CVE-2026-79920: https://nvd.nist.gov/vuln/detail/CVE-2026-79920
- CWE-862 (Missing Authorization): https://cwe.mitre.org/data/definitions/862.html
- Ajenti project and release information: https://ajenti.org/
- FIRST EPSS (not yet scored for this CVE): https://www.first.org/epss/
- CISA Known Exploited Vulnerabilities catalog (not listed): https://www.cisa.gov/known-exploited-vulnerabilities-catalog
No public proof-of-concept, exploit code, Nuclei template, or threat-actor campaign tied to CVE-2026-79920 is present in the available data.