一个 Checkmk 扩展,用于在 Linux 主机上针对每个 PHP 安装显示其是否受 PHP2Shell 影响——即预认证远程代码执行漏洞 CVE-2026-109618 和 CVE-2026-109619,这两个漏洞于 2026-10-21 在 PHP 8.2.35、8.3.36、8.4.27 和 8.5.12 中披露并修复。
它附带一个小型 POSIX shell 代理插件,该插件仅收集事实(PHP 二进制文件、Apache mod_php、NGINX Unit 和 FrankenPHP 的 PHP 库、版本、软件包变更日志、php.ini 设置、仍在运行已被替换二进制文件的进程)。至于这意味着“已修复”还是“存在漏洞”,由 Checkmk 服务器上的检查插件决定,因此新信息——另一个已修复版本、一个新的 CVE——只需更新 .mkp,而无需在每台主机上部署新脚本。
为什么不直接比较版本号: 各发行版会在不更改上游版本号的情况下向后移植修复。Ubuntu 24.04 提供 PHP 8.3.6,AlmaLinux 9 提供 8.0.30——两者均已修复,但按版本号看都“存在漏洞”。因此该扩展还会读取拥有每个二进制文件的软件包的变更日志。
cmk_addons.plugins 插件 API)。/proc/<pid>/maps)。需要带有 GNU 或 busybox 工具的纯 POSIX sh;软件包变更日志通过 dpkg、rpm 或 apk 读取。已在 Debian 系(Debian、Ubuntu)、Red Hat 系(RHEL、AlmaLinux、Rocky Linux、Oracle Linux、CentOS Stream、Fedora、Amazon Linux 2023、CentOS 7)以及 Alpine 上测试,详见下文。| Checkmk 镜像 | 日期 | 结果 |
|---|---|---|
checkmk/check-mk-ultimate:2.5.0p17 | 2026-10-27 | 通过(构建、cmk-validate-plugins、冒烟测试、安装 + 发现 + 检查 + 代理烘焙) |
checkmk/check-mk-ultimate:3.0.0-2026.10.27(每日构建) | 2026-10-27 | 通过(构建、cmk-validate-plugins、冒烟测试、安装 + 发现 + 检查 + 代理烘焙) |
该代理插件于 2026-10-27 针对各发行版自带的 PHP 软件包运行(scripts/test_agent_plugin.sh)。在目标会启动 Web SAPI 的情况下(FPM、发行版仍提供的 Apache mod_php、NGINX Unit、FrankenPHP),随后在磁盘上替换了 FPM 二进制文件和 libphp,重启检测报告了正在运行的进程。
Debian 系和 Alpine
| 发行版 | PHP 软件包 | 插件结果 |
|---|---|---|
| Ubuntu 24.04 | 8.3.6-0ubuntu0.24.04.13(CLI、FPM、CGI、mod_php) | 通过向后移植修复(变更日志中提及两个 CVE) |
| Debian 12 | 8.2.35-1~deb12u1(CLI、FPM、mod_php) | 通过版本号修复 |
| Debian 12 + nginx | 8.2.35-1~deb12u1(CLI、nginx 后的 FPM) | 通过版本号修复 |
| Debian 13 | 8.4.27-1~deb13u1(CLI、FPM) | 通过版本号修复 |
| Alpine 3.22 | php83 8.3.36-r0(CLI、FPM、CGI) | 通过版本号修复 |
Red Hat 系
| 发行版 | PHP 软件包 | 插件检测结果 |
|---|---|---|
| AlmaLinux 8.10 | 7.2.24-1.module_el8.10.0(CLI、FPM、CGI、mod_php libphp7.so) | 已通过向后移植修复(变更日志中列出了两个 CVE) |
AlmaLinux 8.10,模块 php:8.2 | 8.2.35-1.module_el8.10.0(CLI、FPM、CGI) | 已通过版本修复 |
| RHEL 9.8(UBI)、AlmaLinux 9.8、Rocky Linux 9.8、Oracle Linux 9.8 | 8.0.30-8.el9_8.1(CLI、FPM、CGI) | 已通过向后移植修复(变更日志中列出了两个 CVE) |
AlmaLinux 9.8,模块 php:8.3 | 8.3.36-1.module_el9.8.0(CLI、FPM、CGI) | 已通过版本修复 |
| AlmaLinux 9.8 + Remi SCL | php74 7.4.33-31.el9.remi、php81 8.1.34-6.el9.remi(/opt/remi) | 已通过向后移植修复(变更日志中列出了两个 CVE) |
| AlmaLinux 10.2、CentOS Stream 10 | 8.3.36-1.el10(CLI、FPM、CGI) | 已通过版本修复 |
| Fedora 44 | 8.5.12-1.fc44(CLI、FPM、CGI) | 已通过版本修复 |
| Amazon Linux 2023 | php8.5 8.5.12-1.amzn2023.0.1(CLI、FPM、CGI) | 已通过版本修复 |
| CentOS 7(已停止维护,vault) | 5.4.16-48.el7(CLI、FPM、CGI) | 存在漏洞 - 在付费扩展支持之外,EL7 没有向后移植 |
官方容器镜像与 FrankenPHP
| 镜像 | PHP | 插件检测结果 |
|---|---|---|
php:8.2.20-fpm | 8.2.20,从源码构建 | 存在漏洞 |
unit:php8.3(NGINX Unit) | 8.3.26(CLI、CGI、内嵌 libphp) | 存在漏洞 |
dunglas/frankenphp:latest | 8.5.12(CLI、CGI、内嵌 libphp) | 已通过版本修复 |
| FrankenPHP 静态二进制文件(GitHub release) | 8.5.12 | 已通过版本修复 |
它尚未在容器之外的生产主机上运行过 - 特别是在 SELinux 处于强制模式(RHEL 系列)的情况下;该 agent 通常在那里以非受限模式运行。
Setup > Maintenance > Extension packages > Upload package,或在站点内的命令行中执行:
mkp add php2shell-<version>.mkp
mkp enable php2shell <version>
将 agent 插件部署到要检查的主机:
在主机上运行服务发现。每个 PHP 二进制文件和 Apache PHP 模块都会获得
各自的服务,另外每台主机还会有一个 PHP2Shell restart 服务。
可选:在 Setup > Services > Service monitoring rules > PHP2Shell (CVE-2026-109618 / CVE-2026-109619) 和 PHP2Shell restart 中调整状态。
将 package/agents/plugins/php2shell 复制到 agent 插件目录下的一个缓存间隔子目录中,
并使其可执行:
install -m 755 php2shell /usr/lib/check_mk_agent/plugins/3600/php2shell
3600 目录会让 agent 每小时在后台运行一次,并在间隔期间提供缓存结果。不要直接把它放进 plugins/:它会运行每个 PHP 二进制文件并读取每个进程的内存映射,这对每次 agent 查询来说负担过重。
| 服务 | 每个 | 状态(默认,可配置) |
|---|---|---|
PHP2Shell <path> | PHP 二进制文件或库,例如 PHP2Shell /usr/sbin/php-fpm8.3 | OK 已修复 - CRIT 存在漏洞的 web SAPI - WARN 存在漏洞的 web SAPI 且已应用所有临时缓解措施 - WARN 存在漏洞的 CLI - UNKNOWN 无法确定版本 |
PHP2Shell restart | 装有 PHP 的主机 | OK - CRIT 进程仍在运行已被替换的 PHP 二进制文件或 libphp |
flowchart TD
A[PHP binary or module] --> B{Version known?}
B -- no --> U[UNKNOWN]
B -- yes --> C{"Version >= fix of its branch?<br/>8.2.35 / 8.3.36 / 8.4.27 / 8.5.12<br/>or branch newer than 8.5"}
C -- yes --> OK[OK: fixed]
C -- no --> D{"Package changelog names<br/>both CVEs?"}
D -- yes --> OKB[OK: fixed by distribution backport]
D -- no --> E{SAPI}
E -- CLI --> W1[WARN: vulnerable, CLI only]
E -- "FPM / CGI / LiteSpeed / Apache module /<br/>embedded libphp / FrankenPHP" --> F{"All interim mitigations<br/>in this SAPI's php.ini?"}
F -- yes --> W2[WARN: vulnerable, mitigated]
F -- no --> CR[CRIT: vulnerable]
OK --> G{"session.upload_progress.enabled<br/>= On?"}
OKB --> G
G -- yes --> H["Hint: CVE-2026-115560 not fixed yet<br/>(state configurable, default OK)"]
memory_limit=-1,针对 CVE-2026-109619 的 session.upload_progress.enabled=0(以及在 PHP 8.5 上的 fatal_error_backtraces=0)。它们只能将 CRIT 降为 WARN,绝不会降为 OK——PHP 称更新是唯一完整的修复,而 memory_limit=-1 本身会带来内存耗尽的风险。php -S 会将其用作 Web 服务器,并且在无法找到 mod_php 的主机上,它可能是 PHP 版本唯一可见的痕迹。session.upload_progress.enabled=On,会在其详情中得到提示;如果你希望它触发告警,请在规则中提高状态级别。flowchart LR
subgraph host [Monitored Linux host]
P["agent plug-in php2shell<br/>(plugins/3600/, as root)"]
P -- "php -v / php -i" --> BIN[PHP binaries]
P -- "X-Powered-By string" --> SO[libphp*.so]
P -- "dpkg / rpm / apk" --> CL[package changelog]
P -- "/proc/*/maps" --> PR[running processes]
end
P -- "php2shell agent section" --> CP
subgraph site [Checkmk site]
CP["check plug-ins<br/>php2shell, php2shell_restart"]
R[rules: service states] --> CP
BK["bakery rule<br/>PHP2Shell agent plug-in"]
end
BK -. bakes into agent .-> P
CP --> S1["PHP2Shell (one per path)"]
CP --> S2[PHP2Shell restart]
该 agent 插件: