Skip to main content

CVE-2022-46169Cacti Command Injection Vulnerability

Patch nowCritical9.8Exploited, CISA due date 2023-03-09EPSS 100%, higher than 100% of scored CVEs

CVE-2022-46169 is a OS command injection in Cacti, rated critical (9.8 on CVSS 3.1).

Why this priority: Exploited in the wild: listed in CISA's KEV catalog.

Published · Updated · NVD status: Analyzed

What it is

Input reaches an operating-system command line, letting an attacker run their own commands on the host. A permission check exists but gets the answer wrong for some callers.

How it is reached

An attacker can exploit it over the network, without an account, and nobody has to click anything.

What an attacker gains

A successful attack can read the data it protects, change data or behaviour and take it offline. In practice, this kind of flaw lets an attacker run commands or code with the privileges of the affected service.

Is it being exploited?

CISA added it to the Known Exploited Vulnerabilities catalog on 2023-02-16: it is being exploited in the wild. EPSS estimates a 100% chance of exploitation activity in the next 30 days, higher than 100% of scored CVEs.

What to do

  1. Treat it as urgent: it is on CISA's KEV list. CISA's deadline for US federal agencies: 2023-03-09.
  2. Upgrade Cacti to 1.2.23 or later. The patch notes are linked below.
  3. Until it is patched, keep it off the internet or behind a VPN, allowlist or authenticating proxy.
  4. Check exposed instances for signs of compromise, not only for the version.

Description from NVD

Cacti is an open source platform which provides a robust and extensible operational monitoring and fault management framework for users. In affected versions a command injection vulnerability allows an unauthenticated user to execute arbitrary code on a server running Cacti, if a specific data source was selected for any monitored device. The vulnerability resides in the `remote_agent.php` file. This file can be accessed without authentication. This function retrieves the IP address of the client via `get_client_addr` and resolves this IP address to the corresponding hostname via `gethostbyaddr`. After this, it is verified that an entry within the `poller` table exists, where the hostname corresponds to the resolved hostname. If such an entry was found, the function returns `true` and the client is authorized. This authorization can be bypassed due to the implementation of the `get_client_addr` function. The function is defined in the file `lib/functions.php` and checks serval `$_SERVER` variables to determine the IP address of the client. The variables beginning with `HTTP_` can be arbitrarily set by an attacker. Since there is a default entry in the `poller` table with the hostname of the server running Cacti, an attacker can bypass the authentication e.g. by providing the header `Forwarded-For: <TARGETIP>`. This way the function `get_client_addr` returns the IP address of the server running Cacti. The following call to `gethostbyaddr` will resolve this IP address to the hostname of the server, which will pass the `poller` hostname check because of the default entry. After the authorization of the `remote_agent.php` file is bypassed, an attacker can trigger different actions. One of these actions is called `polldata`. The called function `poll_for_data` retrieves a few request parameters and loads the corresponding `poller_item` entries from the database. If the `action` of a `poller_item` equals `POLLER_ACTION_SCRIPT_PHP`, the function `proc_open` is used to execute a PHP script. The attacker-controlled parameter `$poller_id` is retrieved via the function `get_nfilter_request_var`, which allows arbitrary strings. This variable is later inserted into the string passed to `proc_open`, which leads to a command injection vulnerability. By e.g. providing the `poller_id=;id` the `id` command is executed. In order to reach the vulnerable call, the attacker must provide a `host_id` and `local_data_id`, where the `action` of the corresponding `poller_item` is set to `POLLER_ACTION_SCRIPT_PHP`. Both of these ids (`host_id` and `local_data_id`) can easily be bruteforced. The only requirement is that a `poller_item` with an `POLLER_ACTION_SCRIPT_PHP` action exists. This is very likely on a productive instance because this action is added by some predefined templates like `Device - Uptime` or `Device - Polling Time`.

This command injection vulnerability allows an unauthenticated user to execute arbitrary commands if a `poller_item` with the `action` type `POLLER_ACTION_SCRIPT_PHP` (`2`) is configured. The authorization bypass should be prevented by not allowing an attacker to make `get_client_addr` (file `lib/functions.php`) return an arbitrary IP address. This could be done by not honoring the `HTTP_...` `$_SERVER` variables. If these should be kept for compatibility reasons it should at least be prevented to fake the IP address of the server running Cacti. This vulnerability has been addressed in both the 1.2.x and 1.3.x release branches with `1.2.23` being the first release containing the patch.

What this means for your architecture.

A CVE names a product. Whether it matters depends on where that product sits in your systems: what reaches it, which trust boundary it guards and what it can reach once compromised. Veriom maps your components, their relationships and your trust boundaries from your code, cloud and delivery evidence, so you can see where a component like this sits. The radar itself does not look at your systems.

Components it touches

  • Application servers and the hosts they run on. The flaw sits between untrusted input and code or command execution.
  • Template engines. The flaw sits between untrusted input and code or command execution.
  • Permission checks in APIs and admin surfaces. The flaw sits between one role or tenant and another.
  • Multi-tenant services. The flaw sits between one role or tenant and another.

Trust boundaries in play

  • Internet-facing entry points. No account is needed. Any instance reachable from outside your perimeter, through a load balancer, gateway, VPN or exposed admin port, is in scope.
  • Between untrusted input and code or command execution. An attacker who crosses it can run commands or code with the privileges of the affected service.
  • Between one role or tenant and another. An attacker who crosses it can reach data or actions their role should not allow.

Questions to answer about your own systems

  • Where does Cacti run in your systems, and at which version?
  • Which of those instances can be reached from the internet or partner networks?
  • What can it reach once compromised: which data stores, secrets and services?

Sources

  • CVE records and CVSS scores from the NVD CVE API. This product uses the NVD API but is not endorsed or certified by the NVD.
  • Exploitation status from CISA’s Known Exploited Vulnerabilities catalog.
  • Exploit likelihood from FIRST’s Exploit Prediction Scoring System (EPSS), refreshed daily.
  • Explanations are written by Veriom from fixed templates over each record’s data, not by a person reviewing each CVE. Descriptions are quoted from the records as published.