☠️
EXFILTRATING
DATA...
01010111 10110010 00101001 11000110 01101100 10011011 00010001 11100101 01000010 10101111
[ <-- BACK_TO_SEARCH ]
Ajenti logo [ WEBSITE ] [ VENDOR STATS ]
CVSS: 9.9 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H 🐛 CWE-862
👁️
Common Weakness Enumeration - Identifies the specific category of software weakness or flaw.

CVE-2026-79920

CVE-2026-79920 Code Execution in Ajenti
📅 PUBLISHED: 2026-09-21 00:00 UTC 🔄 UPDATED: 2026-10-02 19:21 UTC
[ PATCH UNDER REVIEW ↓ ] Remains UNDER REVIEW until an independent source confirms the fix
[ DEFENSE PATCH ↓ ]
💣 PoC: None
👁️
Proof of Concept - Indicates if functional exploit code is publicly available, drastically increasing the risk of immediate attacks.
🎯 EPSS: 0.36%
👁️
0.36% probability
8.9× above the median CVE
Tier: ELEVATED
30-day exploitation window · FIRST.org · updated daily
🥷 MITRE: T1190
👁️
MITRE ATT&CK Tactic - Describes the strategy hackers use to execute this attack.
Country: Global License: Open Source
VULNERABLE: version not auto-detected — verify your deployed version locally
CVSS VECTOR BREAKDOWN 9.9
AV: N Attack Vector Network
AC: L Attack Complexity Low
PR: L Privileges Required Low
UI: N User Interaction None
S: C Scope Changed
C: H Confidentiality High
I: H Integrity High
A: H Availability High
9.9
THREAT LEVEL
■ tracking this CVE ✓ independent patch confirmation ⧗ same-origin mirror (GHSA) ⚠ active exploitation verification policy →

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).

⚡ AUTOMATE YOUR CVE INTELLIGENCE

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.

›Patch confidence — UNVERIFIED to CONFIRMED, cross-referenced NVD + RHSA + Debian
›Exploit & PoC — poc_status, poc_url, has_exploit. Not in NVD.
›Shodan dorks — ready-made queries to find exposed vulnerable systems
›Detection rules — YARA · Wazuh · Elastic (all plans) · Sigma (Pro)
›pending_fields — know exactly which of 7 fields NVD hasn't processed yet
›Free backfill — data incomplete when you paid? Re-check within 30 days = 0 credits
PAYG €0.08/lookup Standard €19/mo (was €29) · 5k credits Pro €65/mo (was €99) · 20k credits FOUNDING PRICE · LOCKED FOR LIFE · ENDS 31 DEC 2026
[ FROM €19/MO ]
Free sandbox key available
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:

  1. 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.

  2. Unvalidated input into a privileged package operation: because name and version are 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).

  1. 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/start containing InstallPlugin, UnInstallPlugin, or UpgradeAll, per the detection guidance above.
  2. 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".
  3. 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 name and version inputs 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

No public proof-of-concept, exploit code, Nuclei template, or threat-actor campaign tied to CVE-2026-79920 is present in the available data.

◈ SOURCE Analysis & enrichment: valtersit.com/cve/CVE-2026-79920/ · CVE data: NVD/MITRE (public domain) · © 2026 ValtersIT Hub
>_ SYSTEM_CORE: INTEL_ACTIVE
90% TEAM-CURATED // 10% AUTOMATED INGESTION.
ALL PATCH REFERENCES AND VERSION DATA SOURCED FROM NVD + OSV OFFICIAL REGISTRIES.