SolvirPHP 迁移 EN

PHP2Shell (CVE-2026-109618 / 109619):哪些网站受影响,怎么自查和修复

要点

是什么
PHP 内核里的两个内存漏洞,不用登录就能以网站进程的权限在服务器上执行代码。
严重程度
CVSS 4.0 评分 9.2,严重。
利用难度
CVSS 标注攻击复杂度高:成功率取决于 PHP 构建、扩展和内存布局,进程多、流量大只会增加攻击所需的尝试次数,不能消除漏洞。
披露时间
2026 年 10 月 21 日,PHP 官方安全公告。
受影响版本
PHP 8.2、8.3、8.4、8.5 中低于修复版本的所有版本。
修复版本
8.2.35、8.3.36、8.4.27、8.5.12。
更老的版本
8.1 及更早的版本已停止维护,这次没有补丁,公告也没说明它们是否受影响,应按受影响处理。
利用情况
截至 2026 年 10 月 22 日,CVE 记录里 CISA 的评估为尚未发现利用。

这两个漏洞是什么

CVE-2026-109618 (官方标题「RCE via OOM corruption」):PHP 遇到内存不足时会中途退出当前请求。在某些位置退出时,请求用到的内存还没初始化好,PHP 收尾时读到这块内存,攻击者可以借此执行代码。官方演示的触发方式是一个特制的文件上传请求 (multipart/form-data):PHP 在解析上传内容时就耗尽内存,这时网站自己的代码还没开始运行。

CVE-2026-109619 (官方标题「RCE via stale global state」):一个 PHP 进程会先后处理很多个请求。上一个请求留下的部分全局状态没有被清掉,仍然指向已经释放的内存;同一个进程处理下一个请求时,在初始化之前读到它,可以被利用来执行代码,也可能泄露内存数据。

两个漏洞都在 PHP 本身,不是 WordPress 或 Laravel 的问题,换 CMS 或框架也修不了。能不能被利用,取决于 PHP 版本和运行方式,部分情况下还要有网站代码配合,见下面的表。

哪些网站受影响

先看 PHP 版本:

版本线升级到
8.2.x≥ 8.2.35
8.3.x≥ 8.3.36
8.4.x≥ 8.4.27
8.5.x≥ 8.5.12
8.1 及更老没有补丁

再看 PHP 的运行方式,危险程度差别很大:

运行方式情况
Apache + mod_phpCVE-2026-109618 已在默认内存和输入限制下验证可以远程执行代码,攻击发生在网站代码运行之前,不需要网站本身有漏洞。CVE-2026-109619 也已在 mod_php 上验证,其中经由上传进度的路径同样不依赖网站代码。几种运行方式里风险最高。
PHP-FPM (Nginx 等)CVE-2026-109619 已在 FPM 上验证可以执行代码,需要网站里有能配合的代码路径;CVE-2026-109618 在 FPM 上目前只有源码分析,没有完整的攻击演示。
FrankenPHP官方源码分析认为和 mod_php 类似,CVE-2026-109618 很可能不依赖网站代码就能被攻击,尚未验证。CVE-2026-109619 在默认配置下没找到同样的触发点,官方说明这不代表不受影响。
LiteSpeed (LSAPI)官方认为和 FPM 类似,可能受影响,尚未验证。

怎么确认自己的网站受不受影响

  1. 在网站根目录临时放一个文件,内容只有 <?php phpinfo();,用浏览器打开它,看顶部的「PHP Version」和「Server API」。看完马上删掉这个文件,它会暴露服务器信息。
  2. 「Server API」是 Apache 2.0 Handler 说明用的是 mod_php;FPM/FastCGI 是 PHP-FPM;LiteSpeed 开头的是 LSAPI。其他值以你所用运行方式的文档为准。
  3. 命令行里 php -v 显示的是命令行那份 PHP,可能和网站用的不是同一个,以 phpinfo 为准。
  4. 用 Ubuntu、Debian、CentOS 这类系统自带的 PHP 软件包时,修复后版本号往往不会变成 8.3.36 这样的数字,因为发行版会把补丁打进原来的版本号里。这时要看发行版的安全公告有没有列出这两个 CVE,以及你装的包是否不低于公告里的修复版本。
  5. 用 Docker 官方 php 镜像的,标签写 8.3 不代表是最新的补丁版本,要在容器里跑 php -v 确认实际版本,或者重新拉取镜像。

怎么修

升级到修复版本是唯一完整的修复办法。

  • 自己编译或用 Windows 官方压缩包的:升级到对应版本线的修复版本 (8.2.35、8.3.36、8.4.27、8.5.12) 或更高。
  • 用发行版软件包的:按发行版的安全公告更新 PHP 相关的包。用第三方软件源 (比如 sury、Remi) 的:按该源的更新说明升级。
  • 用 Docker 的:换成修复版本的镜像标签,重新构建并重启容器。
  • 用虚拟主机或服务器面板的:在面板里切到修复版本;面板还没提供的,联系主机商。
  • 升级后重启所有 PHP 进程 (php-fpm、Apache、LiteSpeed、FrankenPHP 等),再用 phpinfo 确认版本,然后删除 phpinfo 文件。
  • 还在用 8.1 及更老版本的:没有补丁可打,只能升级到 8.2 及以上的修复版本,或者把网站迁到别的技术栈。

暂时没法升级怎么办

下面这些来自官方公告,只能降低风险,不能代替升级。改完配置都要重启所有 PHP 进程才生效。

CVE-2026-109619 没有能覆盖所有路径的通用配置缓解:下面针对它的两条,各自只去掉官方已确认的一条利用路径,网站程序或扩展里可能还有别的路径,而且不一定留下日志。只有升级才可靠。

  • (CVE-2026-109618) 在 php.ini 或 PHP-FPM 池配置里设 memory_limit=-1,并用管理员级设置锁定 (PHP-FPM 池里写 php_admin_value[memory_limit] = -1),再确认没有池、目录或程序里的设置 (比如程序里的 ini_set、.htaccess) 把它改回有限值。这样去掉了漏洞依赖的固定内存上限,但不是完整缓解:底层内存分配失败时,漏洞路径仍可能被走到。代价是单个请求可以占满内存。容器或 cgroup 的内存限制可以兜底,但不保证防住,而且超限时可能把主进程和所有子进程一起杀掉。不要用 RLIMIT_AS 或 RLIMIT_DATA (比如 ulimit -v) 限制内存,那样内存一到上限分配就会失败,正好走进出问题的代码路径。
  • (CVE-2026-109619) 设 session.upload_progress.enabled=0。这能挡住官方演示的上传进度利用路径,不覆盖其他路径。很少有网站用这个功能;如果你的网站有上传进度条,关掉后进度条会失效。升级后也可以一直关着。
  • (CVE-2026-109619) PHP 8.5 设 fatal_error_backtraces=0,去掉官方已确认的 mod_php 利用路径里产生残留状态的那一步,不覆盖其他路径。
  • (CVE-2026-109618) 网站里没有任何 multipart/form-data 表单 (包括文件上传) 的,在 Nginx、CDN 或 WAF 上直接拦掉这类请求。需要上传的,把 post_max_size 设小,调低 max_input_nesting_level,限制表单字段数和上传文件数,并在 Nginx 或 CDN 上另外限制请求体大小、multipart 的 part 数和每个 part 的 header 数,因为没有声明长度的请求可以绕过 post_max_size。这些升级后也值得保留。
  • (CVE-2026-109619) 把按请求覆盖的 PHP 配置 (Nginx 的 PHP_VALUE、Apache 的 php_value 和 .htaccess) 挪进 php.ini 或 PHP-FPM 池配置,并修掉所有会产生警告或弃用提示的配置项 (废弃项、无效值)。这些配置在请求初始化之前生效,它们产生的警告是这个漏洞的触发点之一。
  • (CVE-2026-109619) 尽量消除攻击者能触发的致命错误 (上传、导入、错误页、插件等路径),也别让请求能稳定走到 Maximum execution time exceeded。只调整超时时间只是去掉这一种中断,不解决其他情况。
  • (CVE-2026-109619) 性能允许的话,PHP-FPM 设 pm.max_requests=1,每个进程只处理一个请求。

怎么排查日志,以及有没有被攻击过

官方建议在 php.ini 或 FPM 配置这类启动配置里打开完整日志 (log_errors=On、error_reporting=E_ALL,并配好 error_log),最好在隔离的环境里做一轮审计。目的主要是找出会触发漏洞的错误和警告并修掉,日志里出现这些不等于已经被攻击。公告列出的重点是:

  • 网站脚本运行之前就反复出现的警告和弃用提示。
  • Allowed memory size of … bytes exhausted 这类内存耗尽错误,尤其是集中出现在上传请求上的。大文件或插件也会触发这类错误,单凭这一条不能判断被攻击。
  • Maximum execution time exceeded 和其他致命错误。

下面两条不在官方公告里,是常规的入侵排查:

  • PHP-FPM 或 Apache 日志里子进程异常退出,比如 signal 11 段错误。
  • 网站目录里不认识的 PHP 文件、被改过的文件、陌生的定时任务和进程。这些是代码被执行之后的常见痕迹。

修掉日志里看到的错误能降低风险,但调整 error_reporting、用 @ 或关闭 display_errors 不能防护这两个漏洞,别靠藏起警告。日志里没有异常也不代表一定安全:以前的日志可能没记这些级别,攻击也可能在 PHP 写日志之前就完成了。

常见问题

用的是 WordPress,要单独打补丁吗?

要升级的是 PHP,不是 WordPress。漏洞在 PHP 本身,WordPress 和插件的更新修不了它。

网站在 Cloudflare 这类 CDN 后面,安全吗?

不一定。CDN 默认会把上传请求转发到你的服务器。除非你在 CDN 或 WAF 上拦掉了上传请求,否则攻击请求会照常到达 PHP。

用的是 PHP 7.4,受影响吗?

官方公告只列了仍在维护的 8.2 到 8.5。7.4、8.0、8.1 已停止维护,不会有补丁;它们是否受影响官方没有说明,按受影响处理更稳妥。

用虚拟主机的,要做什么?

先在主机控制面板里看 PHP 版本,能切到修复版本就切;不能的话联系主机商,问什么时候升级。

升级 PHP 会不会把网站弄坏?

同一版本线内的小版本升级 (比如 8.3.30 升到 8.3.36) 一般不改变功能,风险低。从 7.x 或 8.1 升到更新的版本线可能要改代码,先在测试环境试一遍。

参考资料

需要帮忙?

我们可以帮你确认网站是否受影响、升级 PHP,或者把停在旧版本上的网站迁到别的技术栈。留下邮箱,2 个工作日内回复。

只用来回复评估结果,不发营销邮件。