2026-10-23PHP2ShellPHP漏洞老系统运维安全应急Docker软件定制

PHP 曝出 9.2 分高危漏洞,官方停更的老 PHP 怎么修?风远科技的分场景应急处置实践

PHP2Shell 影响约七成网站,PHP 7.x 等停更版本没有正式修复版。本文介绍风远科技针对容器、宿主机、无补丁版本等不同 PHP 环境的处置方法,以及约 35 小时内完成 7 台生产服务器修复的响应过程。

10 月 21 日,PHP 官方发布安全公告,修复两个可导致未认证远程代码执行的漏洞(CVE-2026-109618、CVE-2026-109619,业内称 PHP2Shell,CVSS 9.2)。攻击者不需要账号,发一个请求就可能接管 Web 服务器。[1]

官方修复版本是 8.5.12、8.4.27、8.3.36、8.2.35。但大量线上系统跑的并不是这几个版本:PHP 7.4 在 2022 年底已停止维护,更早的 7.0、7.2 仍运行在不少多年前上线的业务系统里。

公告发布后,风远科技技术团队第一时间启动应急,约 35 小时内完成了 7 台生产服务器的修复。这篇文章介绍我们针对不同 PHP 环境的处置方法,以及这次响应是怎么做的。

一、为什么必须第一时间响应

三件事叠在一起,让这次漏洞的处置窗口比以往短得多:

  • **覆盖面大。**PHP 是约 69.7% 已知服务端语言网站的后端语言。[2] PHP-FPM、Apache mod_php、php-cgi 等对外提供 Web 服务的运行方式都在风险范围内,官方认为 mod_php 风险最高:恶意请求可以在任何业务代码执行之前触发攻击。[1]
  • **提前泄露,攻击先于补丁。**漏洞原定 10 月 22 日披露,10 月 20 日编号提前在网上泄露,PHP 团队把补丁提前一天发布;补丁发布之前,安全厂商已观测到针对性的攻击尝试。[3]
  • **AI 让"发现"变快了。**据公开报道,这次的漏洞之一由安全公司借助 AI 模型发现,另有安全团队独立发现并上报。[4] 漏洞挖掘的成本在下降,老系统里"多年没人发现"的问题,被发现的速度会越来越快。

"补丁出来后排个期"的节奏,已经跟不上了。

二、老 PHP 环境难在哪

老系统修漏洞,难点很少在补丁本身,而在环境:

  1. **版本停更,没有正式修复版。**官方明确 8.1 及更早版本不再获得更新。考虑到漏洞严重性,安全团队为 7.4、8.0、8.1 提供了"最小化源码回移植"分支,但不是正式发布版本,要自己从源码编译。[1] 7.3 及更早版本连这个分支都没有。
  2. **业务代码不能随便动。**老系统依赖的框架版本往往较旧,直接升到 PHP 8 会大面积报错。升级语言版本等于一次重构,不是应急动作。
  3. **扩展和环境跨度大。**swoole、mongodb、redis、grpc 等扩展版本跨了好几代;部分底层操作系统已停止支持,软件源下架;更老的服务器内核过旧,连 Docker 都装不了,PHP 直接以模块形式跑在宿主机的 Apache 里。

所以没有一套方案能通吃,必须按场景处置。

三、我们怎么按场景处置

我们把线上环境按"PHP 版本 × 运行方式"分成几类,每类用改动最小、可回滚的方式修复。

老 PHP 系统分档处置

场景一:Docker 容器里的 PHP 7.4——只重编内核,扩展不动

我们运维的大部分线上环境基于自建的 PHP 7.4 Docker 镜像。核对官方 7.4 回移植补丁后确认:补丁只新增函数,不改数据结构,扩展接口版本不变。因此可以只重编 PHP 内核,所有扩展原样保留,业务代码一行不改。

补丁版镜像在 x86 和 ARM 两种架构上分别构建,用 Nginx + PHP-FPM 和 Apache 两套环境做 HTTP 测试:普通请求、文件上传、Session、内存超限,以及 50 个并发混合请求,全部通过后才推送。旧镜像先备份为独立标签,出问题一条命令即可回滚。

镜像里还默认关闭了 session.upload_progress,这是官方确认的利用入口之一。10 月 23 日 PHP 官方又发布通告,建议在下个版本前关闭这一配置,以防另一个 RCE 路径[1],提前关掉的配置正好覆盖了这个新风险。

场景二:版本更老、扩展更旧的容器——以原镜像为底座升级

部分服务器的镜像是几年前的老版本,例如 PHP 7.4.5 搭配 swoole 和多年前的扩展。直接换成标准镜像,扩展会跨好几代,业务风险大。我们改为以这台机器自己的镜像为底座,把内核升到 7.4.33 并打上补丁,扩展原样保留。PHP 7.3 的容器环境则直接换成补丁版 7.4.33 镜像。

场景三:PHP 8.x——升到官方修复版

PHP 8 镜像升级到官方修复版 8.3.36,扩展版本锁定,双架构验证后推送。

场景四:跑不了 Docker 的老服务器——宿主机编译同一版本,并存切换

有的服务器操作系统停留在多年前的版本,内核过旧装不了 Docker,Apache 直接加载 7.0 或 7.2 的 mod_php。这两个版本官方都没有补丁。

我们的做法是:在宿主机上用源码编译和容器镜像同一个版本的 PHP(7.4.33 + 官方补丁),装到独立目录,与旧版并存;只把 Apache 加载的 PHP 模块切过去,平滑重启。回滚就是把模块切回旧版,秒级完成。切换前事先核对了业务代码的框架版本,确认兼容 PHP 7.4。

这样,容器环境和宿主机环境的 PHP 收敛到同一个版本,以后维护只需要盯一个版本。

场景五:没有补丁的版本——不硬移植,升到有补丁的版本

对 7.3 及更早版本,也可以考虑把 7.4 的补丁硬移植过去。我们评估过 7.2:补丁涉及 17 个文件,其中 9 个有冲突,自行移植的风险高于收益。更稳妥的做法是升到已有补丁的 7.4,前提是先确认业务代码兼容;长期无人访问的老站点,确认后直接下线。

场景六:命令行常驻进程——先缩小改动面

漏洞出在 Web 请求的解析环节,队列、swoole 等不接收 HTTP 请求的命令行进程不在本次攻击路径上。应急阶段先不动它们,把改动集中在真正暴露的环节,后续再单独排期升级。

四、我们怎么第一时间响应

时间线

  • 10 月 21 日晚:PHP 官方发布安全公告和补丁。
  • 10 月 22 日下午:团队启动评估,确认 7.4 回移植补丁不改扩展接口,确定"只重编内核"的方案。
  • 10 月 22 日晚:补丁版 PHP 7.4 镜像完成双架构构建、测试并推送,容器化的生产服务器逐台完成升级。
  • 10 月 23 日中午:PHP 8 镜像升级到 8.3.36 并推送。
  • 10 月 23 日晚至 24 日凌晨:在业务低峰时段,完成跑不了 Docker 的老服务器的宿主机升级。

从启动评估到全部完成约 35 小时,覆盖 7 台生产服务器,逐一比对了近 300 个站点域名升级前后的状态。

每台服务器都按同一套流程操作

确认版本与扩展 → 保留回滚镜像或旧模块 → 重建容器或切换模块 → 逐站对比升级前后的 HTTP 状态码 → 检查队列与常驻进程

逐台升级与验收流程

几条原则贯穿始终:

  • **改动最小化。**能只换内核就不动扩展,能不改业务代码就不改。目标是"漏洞堵上、业务照常",而不是借机来一次大升级。
  • **每一步可回滚、可验证。**旧镜像、旧模块、旧配置都留了备份;验收看逐站状态码和补丁特征,不看"命令跑成功了"。打补丁后的 7.4 仍显示 7.4.33,所以我们用补丁特征来确认是否已修复。
  • **行为变化提前告知。**验证中我们观测到,打补丁后 PHP 内存超限时工作进程会直接退出,Nginx 返回 502,原来是返回 200 加错误页面。这类变化在上线前就同步给业务负责人。
  • **生产操作选在低峰。**宿主机切换采用平滑重启,需要完整重启的放在凌晨低峰进行。

这次处置由工程师主导,AI 编程智能体承担了构建、批量比对和排障中的大量机械工作,涉及生产的每一步操作前都由负责人确认。AI 让应急响应更快,但"先确认、再动手、留退路"的流程不能省。

五、给手里有老 PHP 系统的企业

  1. 先盘点资产:哪些服务器、哪些容器、哪个 PHP 版本、哪种运行方式(mod_php 优先处理)、承载哪些站点。
  2. 按场景对号入座:有修复版的立即升;有回移植分支的重编;跑不了容器的在宿主机编译并存切换;没有补丁的升到有补丁的版本,或下线。
  3. 验收看补丁特征和业务状态,不看版本号;同时告知业务方可能的行为变化。
  4. 借这次做一次老系统体检:停更的语言版本、停更的操作系统,迟早还会遇到下一次。

风远科技自 2014 年起为企业做软件定制与运维,历经 1000+ 项目。如果你的老系统需要做漏洞排查、补丁重编或升级规划,欢迎联系风远科技,告诉我们现有环境,我们给出初步处置建议。

资讯来源与数据说明

处置过程来自风远科技 2026 年 10 月 22 日至 24 日的实际应急记录;内存超限行为变化为我们在验证阶段的观测结果。本文为处置思路分享,不构成对任何系统安全性的保证。

想聊聊你企业的 AI 落地路径?

杭州风远科技有限公司已为 500+ 中小企业和 50+ 大型央国企提供 AI 落地服务,欢迎深入交流。