php2shell(CVE-2026-109618 / 109619)无法用 php -v 判断:FPM、Docker 与发行版的版本号为何对不上
CLI 与 FPM 的版本差异、Docker 标签、发行版回移,以及虚拟主机上需要确认的事项

本页面由 AI 根据日语原文翻译而成。如有出入,以日语版本为准: 日本語
如果处理 Web 请求的 PHP(PHP-FPM、Apache 的 mod_php、php-cgi、FrankenPHP、LiteSpeed)版本低于 8.2.35 / 8.3.36 / 8.4.27 / 8.5.12,就会受到被称为 php2shell 的 CVE-2026-109618 和 CVE-2026-109619 影响。修复方法是升级到上述版本(如果是发行版软件包,则升级到已修复的软件包)并重启相关进程。需要确认的不是本机的 php -v,而是“实际提供 Web 服务的 PHP”和“已安装软件包的版本”。
本文集中说明四处只看版本号就会得出错误结论的地方。所有数字和状态信息均为 2026-10-22 时点,各项的来源列在文末。
截至 2026-10-22 已知的情况
| 项目 | 内容 |
|---|---|
| CVE | CVE-2026-109618(GHSA-w8hw-w9fx-j79w)/ CVE-2026-109619(GHSA-6wmf-4rv5-p3rp) |
| 严重程度 | 在 PHP 的公告中,两者均被评为 CVSS v4.0 9.2(Critical) |
| 修复版本 | 8.5.12 / 8.4.27 / 8.3.36 / 8.2.35(2026-10-21 发布) |
| 受影响版本 | 上述修复版本之前的版本(依据 GitHub 安全公告) |
| 影响范围 | 所有处理 Web 请求的 PHP。公告点名了 PHP-FPM、mod_php、php-cgi、FrankenPHP 和 LiteSpeed,并称 mod_php 风险最高。在 GitHub 安全公告中,已被证实可利用的是 mod_php,而 FPM 和 FrankenPHP 被列为“未证实”或“有条件”。未证实不等于安全,因此无论以哪种方式运行 PHP,都应升级到修复版本 |
| 8.1 及更早版本 | PHP 项目不再发布更新。已公布针对 7.4 / 8.0 / 8.1 的最小化源码回移补丁,部分发行版和 LTS 厂商可能会提供修复 |
| 8.2 | 支持于 2026-12-31 结束(依据 8.2.35 发布说明) |
PHP 的公告明确指出“唯一完整的修复方式是更新”。在能够更新之前的缓解措施见本文后半部分。
陷阱 1:php -v 与面向 Web 的 PHP 可能不是同一个
通过 SSH 执行的 php -v 显示的是 CLI 版 PHP 的版本。处理 Web 请求的是 PHP-FPM 进程,或加载到 Apache 中的 mod_php,它们是不同的二进制文件和不同的软件包。如果只为 CLI 安装了新版 PHP、并存安装了多个版本,或者 FPM 池指向了另一个版本,那么即使 php -v 显示的是修复版本,Web 端仍可能是旧版本。
有几种方法可以查看 Web 端的真实版本。
# Debian / Ubuntu 上的 FPM(按版本命名)
php-fpm8.3 -v
# RHEL 系的 FPM
php-fpm -v
# 确认 Apache 是否加载了 mod_php
apachectl -M | grep -i php
最可靠的方法,是让通过 Web 实际运行的 PHP 自己报告版本。放置一个不易被猜到名称的临时文件,确认后立即删除。
<?php echo PHP_VERSION, ' ', PHP_SAPI;
如果 PHP_SAPI 为 fpm-fcgi,说明 PHP 运行在 FPM 下;apache2handler 表示 mod_php;cgi-fcgi 表示 CGI。请避免一直暴露 phpinfo(),因为这本身就会泄露信息。
重启是另一个容易被忽略的步骤。即使软件包已被替换,已经在运行的 php-fpm 或 Apache 进程仍可能继续运行旧代码。有些环境在软件包更新时会自动重启,有些则不会。更新后请重启 FPM / Apache,并用上述方法再次确认 Web 端的版本。
陷阱 2:使用 Docker 时,不能凭标签名称判断
官方 php 镜像既有内容会被替换的“浮动标签”,如 8.3 和 8.3-fpm,也有固定版本的标签,如 8.3.30。
- 即使浮动标签在 Docker Hub 上已切换为修复版本,在重新 pull 之前,本地仍是旧镜像。正在运行的容器在重建之前也仍使用旧镜像。如果构建缓存中还留有旧的基础镜像,
Dockerfile中的FROM php:8.3-fpm仍会基于旧镜像构建。 - 固定标签在你自己提高版本号之前,会一直是旧的。
可以通过 Docker Hub API 确认修复版本的标签是否已发布。
curl -s "https://hub.docker.com/v2/repositories/library/php/tags?name=8.3.36&page_size=100"
以下是 2026-10-22 对四个发布系列的查询结果(时间为 UTC)。
| 修复版本 | 找到的标签数 | 基于 Debian 的标签(-fpm、-apache 等)出现的时间 | 基于 Alpine 的标签 |
|---|---|---|---|
| 8.5.12 | 54(含 RC1) | 2026-10-21 18:59–22:13 | 2026-10-21 22:12–10-22 01:05 |
| 8.4.27 | 54(含 RC1) | 2026-10-21 22:09–22:11 | 2026-10-21 22:09–10-22 03:58 |
| 8.3.36 | 27 | 2026-10-21 22:04–22:06 | 2026-10-21 22:04–10-22 03:56 |
| 8.2.35 | 27 | 2026-10-21 21:59–22:01 | 2026-10-21 22:00–10-22 00:58 |
核查中发现了三个只看数字容易误判的地方。
- “最近更新过”不等于“已修复”。固定标签
8.3.35在 2026-10-21 当天被重新构建过,但其中的PHP_VERSION仍是 8.3.35。请看镜像内部的版本,而不是更新时间。 - digest 不同,内容也可能相同。
8.3和8.3.36的标签 digest(多架构索引的值)不同,但 amd64 镜像是同一个,两者的PHP_VERSION都是 8.3.36。同样,8.3-fpm/8.3.36-fpm、8.4-apache/8.4.27-apache、latest/8.5.12、8.5-fpm和8.2-fpm的 amd64 镜像的PHP_VERSION也都是修复版本。 - 8.1 及更早版本没有已修复的官方镜像。
8.1-fpm的最后更新时间是 2025-12-31。
检查本地镜像和正在运行的容器的方法:
# 本地已 pull 镜像的 PHP 版本
docker image inspect php:8.3-fpm --format '{{range .Config.Env}}{{println .}}{{end}}' | grep PHP_VERSION
# 重新 pull 并重建容器
docker compose pull
docker compose up -d
# 如果自行构建镜像,先重新 pull 基础镜像再构建
docker compose build --pull
# 正在运行的容器内的版本
docker compose exec app php -r 'echo PHP_VERSION, PHP_EOL;'
请将最后一条命令中的 app 替换为你自己的服务名。每个官方镜像都是以单一的 PHP_VERSION 构建的,因此容器内 CLI 的版本与该容器的 FPM / Apache 版本一致(陷阱 1 针对的是直接安装在主机上的 PHP)。
FrankenPHP 内嵌了 PHP,因此 FrankenPHP 自身的版本与内嵌 PHP 的版本是两个不同的数字。2026-10-21 发布的 FrankenPHP 1.13.2 的发布说明指出,其 Docker 镜像使用 PHP 8.2.35 / 8.3.36 / 8.4.27 / 8.5.12 构建,静态二进制文件使用 PHP 8.5.12 构建。
陷阱 3:发行版软件包是“版本号不变,但已修复”
Ubuntu 和 RHEL 只把修复移植到旧版本(回移,backporting)。php -v 显示的数字仍是旧的,因此如果按“低于 8.3.36 就有漏洞”这样的数字规则判断,会把已修复的系统误判为有漏洞。反过来,也不能仅凭数字就放心。请依据软件包版本和各发行版的安全跟踪页面来判断。
截至 2026-10-22,各跟踪页面列出的已修复软件包(两个 CVE 相同):
| 发行版 | 软件包 | 已修复版本 | 来源 |
|---|---|---|---|
| Ubuntu 22.04 (jammy) | php8.1 | 8.1.2-1ubuntu2.28 | USN-8948-1 |
| Ubuntu 24.04 (noble) | php8.3 | 8.3.6-0ubuntu0.24.04.13 | USN-8948-1 |
| Ubuntu 26.04 (resolute) | php8.5 | 8.5.4-0ubuntu1.5 | USN-8948-1 |
| Ubuntu (stonking) | php8.5 | 8.5.9-0ubuntu2.1 | USN-8948-1 |
| Ubuntu 14.04 / 16.04 / 18.04 / 20.04 | php5 / php7.0 / php7.2 / php7.4 | 通过 Ubuntu Pro 提供(含 Legacy Support) | USN-8948-2 |
| Debian 12 (bookworm) | php8.2 | 8.2.35-1~deb12u1 | DLA-4848-1 |
| Debian 13 (trixie) | php8.4 | 8.4.27-1~deb13u1 | DSA-6574-1 |
| RHEL 10 | php / php8.4 | 8.3.36-1.el10_2 / 8.4.27-1.el10_2 | Red Hat |
| RHEL 9 | php(默认) | 8.0.30-8.el9_8.1 | Red Hat |
| RHEL 9 | php 模块 8.2 / 8.3 | 8.2.35-1.module+el9.8.0… / 8.3.36-1.module+el9.8.0… | Red Hat |
| RHEL 8 | php 模块 7.4 / 8.2 | 7.4.33-8.module+el8.10.0… / 8.2.35-1.module+el8.10.0… | Red Hat |
这张表直接说明了为什么仅凭数字不够。Ubuntu 24.04 已修复的 PHP 是以 8.3.6 开头的版本,远低于上游的 8.3.36。RHEL 9 的默认 PHP 保持在 8.0.30 的同时已被修复,尽管上游已不再为 8.0 发布修复。Debian 则已升级到与上游相同的版本号(8.2.35 / 8.4.27)。
也有一些软件包尚未修复(截至 2026-10-22)。
- RHEL 9 的 php 模块 8.4 被标记为“受影响,无修复”。
- Debian forky(testing)的 php8.4 为 8.4.26-1,标记为“vulnerable”。sid(unstable)中的 php8.4 为 8.4.27-1,已修复。
在自己的服务器上检查的示例命令:
# Debian / Ubuntu:已安装版本与可用版本
apt-cache policy php8.3-fpm libapache2-mod-php8.3
# Ubuntu:此 CVE 在这台服务器上是否已修复
pro fix CVE-2026-109618
pro fix CVE-2026-109619
# RHEL 系:是否存在修复此 CVE 的更新,以及已安装的版本
dnf updateinfo list --cve CVE-2026-109618
rpm -q php-fpm php-cli
请根据你的环境调整软件包名称(php8.3-fpm 等)。将显示的版本与上表或跟踪页面中的“已修复版本”比较,相同或更高即表示已包含修复。然后完成陷阱 1 中所述的重启和 Web 端检查。
如果 PHP 不是来自发行版自身的软件包,而是来自第三方软件源,就需要关注该软件源的更新。PHP 的公告指出,由志愿者运营的 rpms.remirepo.net 在披露当天不会有更新,并建议改用发行版软件包或自行构建。
陷阱 4:在虚拟主机和托管环境中,你无法自己升级 PHP
在虚拟主机和托管的 PHP 环境中,替换 PHP 运行时的是服务商。这里同样不能只看数字:如果服务商自行构建 PHP 或回移了修复,版本号可能保持旧值。
你自己可以做三件事。
- 确认 Web 端的版本。使用陷阱 1 中的临时文件输出
PHP_VERSION和PHP_SAPI,然后立即删除。如果控制面板中有 PHP 版本选择项,也请记下你选择的版本。 - 查看服务商的公告,没有的话就去询问。可以这样问:“CVE-2026-109618 和 CVE-2026-109619 的修复将在何时应用到我所用套餐的哪些 PHP 版本(或是否已应用)?”按 CVE 编号而不是版本号询问,得到的答复才会涵盖回移情况。
- 如果选择的是已不受支持的版本,请升级。PHP 项目不再为 8.1 及更早版本发布修复,8.2 的支持也将于 2026-12-31 结束。除非服务商已回移修复,否则切换版本是可靠的做法。
各虚拟主机服务商的应对情况(截至 2026-10-22)
在共享虚拟主机上,PHP 运行时通常由服务商更新,许多服务商的公告也称“用户无需任何操作”。用户需要做的有两件事:查看所用服务商的官方公告;如果在控制面板中选择了旧版 PHP,则判断是否要切换到公告推荐的版本(已有修复发布的版本)。
下表仅汇总各服务商官方页面(公告和维护信息)上所写的内容,并对公告措辞做了转述。公告会随进展不断更新,因此请务必在所引用的官方页面上确认实际状态。
| 服务商 / 服务 | 官方公告要点 | 公告日期/时间 | 来源 |
|---|---|---|---|
| エックスサーバー | “对于 PHP 8.2–8.5,已完成对所有受影响服务器的修复补丁应用。”对于旧版本,公告称“部分版本的修复补丁已准备就绪,将在验证完成后依次应用”,其他旧版本也在处理中 | 记载为 10/22 6:45 时点(该页面更新至 13:15) | メンテナンスの進捗状況 |
| シン・レンタルサーバー | 公告页面刊载了与 Xserver 相同的“维护进度”,但我未能找到专门针对 Shin Rental Server 的 PHP 状态的说明(请向支持团队确认) | - | お知らせ |
| ConoHa WING | “我们在保持您当前所用 PHP 版本不变的情况下应用安全补丁。”公告称用户一般无需更改版本,但 PHP 5.x 和 7.x 可能需要更改。文件管理器和网页邮箱作为预防措施被暂时停用;网站显示和邮件收发照常进行 | 10/22 | 【重要】PHPの脆弱性への弊社対応について |
| さくらのレンタルサーバ | “我们已对通过控制面板可选的所有 PHP 版本完成了针对该漏洞的处理。”公告称“客户无需采取紧急措施”,并建议今后迁移到受支持的最新版本。公告称网页邮箱已于 10/22 13:45 处理完毕,phpMyAdmin 仍在处理中 | 10/22(13:45 更新) | PHPの脆弱性(CVE-2026-109618、CVE-2026-109619)への対応状況について |
| ロリポップ! | 这是在修复版本发布之前的预防性维护公告(服务网站、用户页面等将依次停用;网站可能在不预先通知的情况下被停用或受到限制)。截至 10/22,我未能找到宣布 PHP 修复完成的公告(请向支持团队确认) | 10/21 | 【重要】PHPの脆弱性への予防措置に伴うメンテナンス実施のお知らせ |
| ヘテムル | “对于 PHP 8.x 和 PHP 7.4,我们已应用官方修复版本”;对于其他版本,“我们基于官方修复自行做了修复”。由于“所有版本中的部分功能(session.upload_progress)已被停用”,公告请用户确认自己的网站能否正常运行。由于旧版本可能不会再有修复,公告建议切换到较新的版本 | 10/21 19:44 发布;10/22 12:18 和 13:20 更新 | 【一部完了】【重要】PHPの脆弱性への予防措置に伴うメンテナンス実施のお知らせ |
| mixhost | “PHP 修复包已于 2026 年 10 月 22 日 10:18 左右应用完毕。”“在不更改 PHP 版本号的情况下应用”;“客户无需任何操作”。公告建议使用低于 PHP 8.2 版本的用户改用受支持的版本(8.2 或更高) | 10/22 | 【完了】PHPの重大な脆弱性への対応について |
| KAGOYA | 对于租用服务器服务,PHP 8.2–8.5 将在验证修复版本后依次更新(目标版本仍在确定中)。对于托管专用服务器、共享服务器和 WordPress 专用服务器,永久性修复仍在规划中;作为临时措施,公告建议考虑让网站下线或限制访问 | 10/21 18:20 发布;10/22 10:35 更新 | PHPの脆弱性に関する当社サービスへの影響について |
| Zenlogic(IDCフロンティア) | 在紧急维护期间(10/21 22:00–10/22 18:00;结束时间可能有变动)应用修复。PHP 5.3 将被更新到最新版本且无法还原;7.4 和 8.1 可能会被更新。公告称,如果更新后出现显示或行为问题,则需要在应用程序一侧修复 | 10/21 | 【ホスティング】緊急メンテナンス作業のお知らせ |
| ColorfulBox | “我们已在保持您当前所用 PHP 版本不变的情况下,在服务器端完成了向已修复版本的更新。”公告称“客户无需自行更改或切换 PHP 版本” | 10/22 | 【重要】PHPの脆弱性に対するセキュリティアップデート完了のお知らせ |
| お名前.com レンタルサーバー | “我们在保持您当前所用 PHP 版本不变的情况下应用安全补丁。”公告称一般无需更改版本,但 PHP 5.x 和 7.x 可能需要更改。文件管理器和网页邮箱作为预防措施被暂时停用 | 10/22 | 【重要】PHPの脆弱性への弊社対応について |
| CORESERVER(V2) | “我们已对所提供的全部 PHP 版本完成了针对该漏洞的处理”;“客户无需更改 PHP 版本等操作”。维护于 10/22 0:00–11:13 进行,公告称已完成 | 10/21 发布(10/22 完成) | PHP脆弱性の対応(CORESERVER V2)【完了】 |
| XREA | “我们已对 PHP 7.4 及更高版本(7.4 / 8.0 / 8.1 / 8.2 / 8.3 / 8.4 / 8.5)完成了针对该漏洞的处理。”使用这些版本的用户无需更改版本。公告未提及低于 7.4 的版本 | 10/21 发布(10/22 0:50 完成) | PHP脆弱性の対応(XREA)【完了】 |
| バリューサーバー | “我们已对 PHP 7.4 及更高版本完成了针对该漏洞的处理。”公告称使用这些版本的用户无需更改版本 | 10/21 发布(10/22 0:50 完成) | PHP脆弱性の対応(VALUESERVER)【完了】 |
| ABLENET | “针对 PHP 中确认的两个漏洞,我们已对租用服务器环境实施了首轮安全更新。”公告未说明涉及哪些版本,也未说明用户是否需要采取操作 | 10/22 13:04 | PHPの脆弱性に関するセキュリティアップデートの対応について |
| WebARENA(レンタルサーバー) | 截至 10/22,我未能找到官方公告(请向支持团队确认) | - | WebARENA お知らせ(2026年) |
对于未能找到或打开官方公告的情况,表中写的是“未能确认”或“未能找到”。这里没有信息,并不意味着该服务商没有采取应对措施。请直接查看所用服务商的公告并联系其支持团队确认。
暂时无法立即更新时的缓解措施
PHP 的公告列出了在更新之前可以减小攻击面的设置。不过,公告本身明确指出这些措施“并不能让你变得安全”。主要措施如下:
- 针对 CVE-2026-109619:在 php.ini、FPM 池或服务器配置中设置
session.upload_progress.enabled=0,并重启所有 worker(ini_set()和 FPM 的.user.ini对此无效)。在 PHP 8.5 上还需设置fatal_error_backtraces=0。 - 针对 CVE-2026-109618:以应用程序无法覆盖的方式设置
memory_limit=-1,并减小post_max_size(无上传功能时设为 8M,有上传功能时设为 32M)。不要用RLIMIT_AS/RLIMIT_DATA代替。
英国 NCSC 建议,对于无法立即更新或缓解的系统,应考虑让其下线,并在更新或应用缓解措施之前检查是否存在被入侵的迹象。
来源(2026-10-22 确认)
- php.net: Security advisory: Critical remote code execution vulnerabilities, update now (2026-10-21)
- php.net: Upcoming Critical PHP Security Release (2026-10-20)
- php.net: PHP 8.5.12 / 8.4.27 / 8.3.36 / 8.2.35 的发布公告
- GitHub: GHSA-w8hw-w9fx-j79w (CVE-2026-109618)
- GitHub: GHSA-6wmf-4rv5-p3rp (CVE-2026-109619)
- Docker Hub:官方 php 镜像
- FrankenPHP 1.13.2 发布说明
- Debian Security Tracker: CVE-2026-109618 / CVE-2026-109619
- Ubuntu:CVE-2026-109618 / CVE-2026-109619 / USN-8948-1 / USN-8948-2
- Red Hat:CVE-2026-109618 / CVE-2026-109619(已修复软件包版本来自 Red Hat 的 VEX 数据)
- NCSC:Critical security issue affecting PHP
常见问题
如果 php -v 显示的是已修复版本,是否就已防范 php2shell(CVE-2026-109618 / 109619)?
不一定。php -v 只显示 CLI 版 PHP 的版本。处理 Web 请求的 PHP-FPM 或 Apache 的 mod_php 可能是另一个二进制文件、另一个软件包。请用 php-fpm8.3 -v(RHEL 系为 php-fpm -v)查看 FPM 的版本;或者放置一个输出 PHP_VERSION 和 PHP_SAPI 的临时文件,通过 Web 访问确认,确认后立即删除。如果更新后没有重启 FPM 或 Apache,它们可能仍在运行旧代码。
如果使用 Docker 的 php:8.3-fpm,php2shell 是否已经修复?
截至 2026-10-22,Docker Hub 上的 php:8.3-fpm 已替换为 PHP 8.3.36。但本地镜像在重新 pull 之前仍是旧的,正在运行的容器在重建之前也仍使用旧镜像。请执行 docker compose pull 和 docker compose up -d(如果是自行构建镜像,则执行 docker compose build --pull),然后在容器内运行 php -r 'echo PHP_VERSION;',确认版本为 8.3.36 或更高。像 8.3.30 这样的固定标签,在你自己提高版本号之前一直是旧的。
Ubuntu 和 RHEL 上的 PHP 版本仍显示 8.3.6 或 8.0.30,会受 php2shell 影响吗?
仅凭版本号无法判断。Ubuntu 和 RHEL 会把修复回移到旧版本,因此软件包版本号虽旧,漏洞却已修复。截至 2026-10-22,Ubuntu 24.04 的 php8.3 8.3.6-0ubuntu0.24.04.13 和 RHEL 9 的 php 8.0.30-8.el9_8.1 已包含修复。请将已安装的软件包版本(用 apt-cache policy 或 rpm -q 查看)与各发行版安全跟踪页面中的已修复版本进行比对;在 Ubuntu 上也可以用 pro fix CVE-2026-109618,在 RHEL 系上可以用 dnf updateinfo list --cve CVE-2026-109618 来确认。