CVE-2022-46169
未认证命令注入
- 已发布
- 2022年12月5日
- 已更新
- 2025年10月21日
- 分配 CNA
- GitHub_M
- 观察到的证据
- 2023年2月16日
初级CVSS
nvd · CVSS 3.1
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H高 · 未来 30 天
- 百分位
- 100.0%
- 型号日期
- 2026年9月21日
EPSS 是统计估计,而不是确定性或影响衡量标准。将其与 CVSS、KEV 状态、暴露程度和您的环境相结合。
CISA 已知被利用
此 CVE 出现在 CISA 已知利用的漏洞目录中。
总结
Cacti 是一个开源平台,为用户提供强大且可扩展的运维监控和故障管理框架。在受影响版本中,一个命令注入漏洞允许未认证用户在运行 Cacti 的服务器上执行任意代码,前提是任何受监控设备已选择特定数据源。该漏洞位于 `remote_agent.php` 文件中。此文件无需认证即可访问。该函数通过 `get_client_addr` 获取客户端 IP 地址,并通过 `gethostbyaddr` 将该 IP 地址解析为对应主机名。之后,它会验证 `poller` 表中是否存在一条记录,其主机名与解析出的主机名对应。如果找到此类记录,函数返回 `true`,客户端即被授权。由于 `get_client_addr` 函数的实现方式,该授权可以被绕过。该函数定义在 `lib/functions.php` 文件中,它检查多个 `$_SERVER` 变量以确定客户端 IP 地址。以 `HTTP_` 开头的变量可被攻击者任意设置。由于 `poller` 表中存在一条默认记录,其主机名为运行 Cacti 的服务器的主机名,攻击者可以绕过认证,例如通过提供请求头 `Forwarded-For: <TARGETIP>`。这样,`get_client_addr` 函数会返回运行 Cacti 的服务器的 IP 地址。随后调用 `gethostbyaddr` 会将该 IP 地址解析为服务器的主机名,从而通过 `poller` 主机名检查,因为默认记录与之匹配。在绕过 `remote_agent.php` 文件的授权后,攻击者可以触发不同的操作。其中一个操作名为 `polldata`。被调用的 `poll_for_data` 函数获取一些请求参数,并从数据库加载相应的 `poller_item` 条目。如果某个 `poller_item` 的 `action` 等于 `POLLER_ACTION_SCRIPT_PHP`,则使用函数 `proc_open` 执行一个 PHP 脚本。攻击者控制的参数 `$poller_id` 通过 `get_nfilter_request_var` 函数获取,该函数允许任意字符串。此变量随后被插入到传递给 `proc_open` 的字符串中,从而导致命令注入漏洞。例如,通过提供 `poller_id=;id` 即可执行 `id` 命令。为了触发易受攻击的调用,攻击者必须提供 `host_id` 和 `local_data_id`,且对应 `poller_item` 的 `action` 设置为 `POLLER_ACTION_SCRIPT_PHP`。这两个 id(`host_id` 和 `local_data_id`)都很容易被暴力破解。唯一的要求是存在一个 `action` 为 `POLLER_ACTION_SCRIPT_PHP` 的 `poller_item`。这在生产实例中很可能存在,因为一些预定义模板(如 `Device - Uptime` 或 `Device - Polling Time`)会添加此操作。此命令注入漏洞允许未认证用户执行任意命令,只要配置了 `action` 类型为 `POLLER_ACTION_SCRIPT_PHP`(`2`)的 `poller_item`。应防止授权绕过,即不允许攻击者使 `get_client_addr`(文件 `lib/functions.php`)返回任意 IP 地址。这可以通过不信任 `HTTP_...` `$_SERVER` 变量来实现。如果出于兼容性原因需要保留这些变量,至少应防止伪造运行 Cacti 的服务器的 IP 地址。该漏洞已在 1.2.x 和 1.3.x 两个发布分支中得到修复,其中 `1.2.23` 是首个包含补丁的版本。
来源
37CVE-2022-46169 Cacti remote_agent.php 未认证命令注入。
负责任的使用
仅在您拥有或有权测试的系统上使用漏洞信息。 Kitploit 链接到公共研究元数据,并且不存储漏洞代码或恶意负载。