星源 Web Studio
全部文章

PHP2Shell 是什么?PHP 网站漏洞排查与修复指南

发布于

PHP2Shell 是什么?PHP 网站漏洞排查与修复指南

如果你的企业官网、WordPress 网站或电商系统运行在 PHP 上,近期需要优先处理一项运行环境安全更新:PHP2Shell。网站能正常打开、后台密码足够复杂,都不能证明服务器已经安全。

本文面向网站负责人和运维人员,按“确认环境 → 安装补丁 → 重启进程 → 验证业务”的顺序介绍处理方法。信息核对截至 2026 年 10 月 22 日;后续修复状态以 PHP 项目和系统供应商公告为准。

其他语言:English · 日本語

一、PHP2Shell 是什么?

PHP2Shell 是两项 PHP 核心漏洞的通称:CVE-2026-109618 和 CVE-2026-109619,两者的 CVSS v4.0 评分均为 9.2(严重)。在受影响环境中,攻击者可能无需登录,通过 HTTP 请求以 Web 工作进程的权限执行代码。这不等同于自动获得 root 权限,但已经可能影响网站文件和应用可访问的数据。PHP 官方安全公告

两项漏洞都与 PHP 请求生命周期中的异常状态有关:

  • CVE-2026-109618:内存耗尽时的状态损坏。 内部请求数据尚未完成初始化,内存分配失败就中断了正常流程;随后的清理阶段可能使用无效数据。官方技术说明
  • CVE-2026-109619:遗留的全局状态。 请求使用的内存释放后,部分内部状态仍被保留;同一工作进程处理后续请求时,可能访问已经失效的状态。官方技术说明

这类问题发生在 PHP 运行时,单独更新主题、插件或业务代码,不能替代 PHP 补丁。

二、哪些网站需要排查?

PHP 官方要求所有处理 Web 请求的 PHP 安装检查更新,包括 PHP-FPM、Apache mod_php、php-cgi、FrankenPHP 和 LiteSpeed。不同运行方式的攻击条件与已验证程度不同,不能据此把 PHP-FPM 判断为安全。官方特别指出,mod_php 已有在应用代码执行前触发攻击的验证结果。PHP 官方公告

因此,使用 WordPress、Laravel、Drupal 或其他 PHP 系统的网站,都应核对底层环境。即使主站采用其他语言,也要检查同一基础设施上的旧站、后台、测试站和独立 PHP 工具。

没有发现异常不代表没有漏洞;存在漏洞也不等于已经被入侵。 是否遭到攻击,需要结合日志与主机证据判断。

三、应该升级到哪个版本?

PHP 于 2026 年 10 月 21 日发布以下修复版本。使用上游版本时,应更新到所在分支的下列版本或包含修复的更新版本:PHP 发布公告

PHP 分支 首个修复版本
PHP 8.2 8.2.35
PHP 8.3 8.3.36
PHP 8.4 8.4.27
PHP 8.5 8.5.12

发行版软件包不能只看上游版本号。 Ubuntu 等供应商可能将补丁回移到较旧版本,判断依据应是系统版本、完整软件包版本和供应商安全公告。例如 Ubuntu 24.04 的修复包为 8.3.6-0ubuntu0.24.04.13,虽然不是上游的 8.3.36,也已经包含修复。Ubuntu 官方修复说明

PHP 8.1 及更旧分支已不再获得 PHP 项目的常规更新。部分发行版或长期支持服务提供回移补丁;PHP 项目也为 7.4、8.0、8.1 提供了最小源码补丁。这并不意味着这些分支恢复支持。应优先迁移到受支持分支,暂时无法迁移时向供应商确认补丁状态。PHP 官方公告

四、如何完成排查与修复?

1. 确认网站实际使用的 PHP

命令行可以先查看:

php -v
php --ini

这些命令反映的是 CLI 环境。一台服务器可能同时安装多个 PHP 版本,网站通过 FPM、Apache 模块或容器运行的版本可能不同。

继续核对站点配置指向的 FPM 池、主机面板中的站点版本、容器镜像与供应商的软件包记录。托管用户可以请服务商书面确认两个 CVE 均已修复,并已重启对应工作进程。不要把完整 phpinfo() 页面长期暴露在公网。

2. 备份并安装安全更新

先确认文件、数据库和配置备份可恢复,记录当前环境,并安排短维护窗口。优先在同一受支持分支内安装安全更新;跨大版本升级还需要验证插件和扩展兼容性。

以下仅为 Ubuntu/Debian 系 PHP 8.3 + FPM 的示例,包名需按实际安装调整,其他发行版应使用各自的官方更新方式:

sudo apt update
apt-cache policy php8.3-fpm php8.3-cli php8.3-common
sudo apt install --only-upgrade php8.3-fpm php8.3-cli php8.3-common

升级前核对候选包是否包含两个 CVE 的补丁,并更新本机其他已安装、仍在使用的 PHP 分支和相关软件包。命令执行成功只说明软件包操作完成,不能直接证明安全修复生效。

如果使用 Docker,需要更新到包含补丁的基础镜像,重新构建应用镜像并替换运行中的容器。只重启旧镜像,或只升级宿主机上的 PHP,无法更新容器内的运行时。

3. 重启承载 PHP 的进程

磁盘上的二进制更新后,旧工作进程可能仍在运行。FPM 环境按实际服务名重启,例如:

sudo systemctl restart php8.3-fpm
sudo systemctl status php8.3-fpm --no-pager

Apache mod_php 应重启 Apache;其他运行方式重启相应服务。多节点环境要覆盖所有实例,包括暂时没有流量的备用实例。Ubuntu 官方也明确提醒,应用更新后通常需要重启才能使用新组件。Ubuntu 官方操作说明

4. 核对运行版本和关键业务

修复后的验收建议保留以下记录:

检查项 通过标准
软件包或镜像 供应商明确包含两个 CVE 的修复
Web 运行时 实际服务请求的进程已使用修复版本
实例覆盖 所有站点、容器与节点均已更新并重启
网站功能 首页、登录、询盘、上传及订单等实际功能正常
日志与监控 没有持续新增的异常退出、内存错误或 5xx 峰值

不要在生产站通过公开利用程序验证漏洞。版本、补丁来源、进程状态和业务回归,才是日常修复验收应优先收集的证据。

五、暂时不能升级,如何降低风险?

官方明确说明,只有包含补丁的更新才是完整解决方案。 若短期内无法升级,可以先限制公网访问、在反向代理或网络层设置来源白名单,必要时提供静态维护页。PHP 官方缓解说明

针对已确认的会话相关路径,官方建议在请求解析前生效的 PHP 配置中关闭上传进度并重启全部工作进程:

session.upload_progress.enabled = 0

这只能阻断部分路径,不能修复另一项内存问题,也不能覆盖全部变体。不要依赖应用中的 ini_set() 来完成这项防护。全局状态漏洞说明

内存耗尽路径的临时措施涉及内存限制与前端请求限制,需要运维人员结合容量评估。不要直接照搬 memory_limit=-1:取消 PHP 自身内存限制会改变可用性风险,而且底层分配失败仍可能触发漏洞。WAF 和请求限制可作为额外防线,也不能替代升级。内存漏洞缓解说明

六、怀疑已经被利用,补丁之外还要做什么?

以下是事件排查建议,并不表示出现单一现象就能认定 PHP2Shell 入侵:

  • 保留访问日志、PHP 错误日志和主机审计记录,检查异常子进程、陌生外联及文件改动。
  • 将异常主机从业务流量中隔离,保留证据后调查新增脚本、计划任务和账号。
  • 如果确认主机失陷,从可信镜像或已验证的干净备份恢复,并在干净环境中轮换可能泄露的数据库、部署与第三方服务凭据。
  • 补丁上线后继续观察错误率和安全告警,避免只删除一个可疑文件就结束处理。

七、给网站负责人的处理清单

如果网站由外包团队或主机商维护,可以直接要求对方交付四项信息:网站实际 PHP 版本、补丁依据、进程重启记录、关键功能验证结果。只回复“已开防火墙”或“已升级插件”,不足以说明这次问题已解决。

需要协助梳理网站运行环境、安排升级和上线验证,可以联系星源 Web Studio,说明使用的主机、建站系统与当前 PHP 版本,便于确认维护范围。

官方参考资料

准备好开始你的外贸独立站了吗?

免费咨询,一个工作日内回复,提供针对你行业的建站建议与报价