CVE-2026-109618、CVE-2026-109619(PHP2Shell)漏洞FAQ

时间:2026年10月23日

1. 声明


本文基于安天 CERT 工程师构建的 FAQ 清单整理而成,结合多个智能体协同分析并进行人工修订。文中涉及的 CVE 编号、版本号、评分等技术细节,部分来源于公开资料与社区信息,尚未全部经权威数据库(如 cve.org、NVD)交叉验证,可能存在事实偏差或时效性误差。技术验证无法短期完成,建议读者交叉验证关键信息。如发现错误或质疑,欢迎反馈,我们验证后会对网站版 FAQ 继续修订。

2. 前言


PHP2Shell 是 PHP 内核中一组高危内存安全漏洞的社区指代,由 CVE-2026-109618、CVE-2026-109619 两个编号组成。该漏洞无需业务代码存在缺陷,攻击者可通过构造特殊 HTTP 上传请求,在满足条件的 PHP-FPM 环境下触发内存缺陷,实现内存信息泄露、进程崩溃,极端场景下可完成远程代码执行。

本文以问答形式整理该漏洞的相关疑问,供资产排查、应急处置、威胁研判参考。全文共六个章节,覆盖漏洞基础、资产识别、攻击原理、防护边界、自查应急、威胁态势六个维度,合计四十个问题。

一、漏洞基础概况


Q1:PHP2Shell 漏洞是什么,两个 CVE 编号分别对应什么缺陷?

A:PHP2Shell 指代 PHP 内核 multipart 表单解析模块存在的两个内存安全漏洞。CVE-2026-109618 为内存耗尽(OOM)漏洞,畸形请求可直接造成 PHP 进程崩溃;CVE-2026-109619 是跨请求内存释放后重用漏洞,攻击者可利用该缺陷实现内存泄露,在满足条件时完成远程代码执行。

代号 PHP2Shell 的由来,是因为攻击者可依托 PHP 运行时内存缺陷,在不落地网页后门文件的前提下获取代码执行能力。这与传统“上传恶意脚本到服务器”的攻击模式有本质区别。

两个漏洞的技术特征对比如下:

表 1-1 两个 CVE 编号的技术特征对比

对比维度 CVE-2026-109618 CVE-2026-109619
缺陷类型 内存耗尽(OOM) 释放后使用(UAF)
直接后果 PHP 进程崩溃、服务中断 内存信息泄露、潜在远程代码执行
利用稳定性 高,请求即可触发 依赖内存布局与请求时序
攻击效果 拒绝服务(DoS) 信息泄露 → 远程代码执行
修复优先级 中(影响可用性) 高(影响机密性、完整性)

说明:不同公开资料对两个 CVE 的具体缺陷类型描述存在差异。部分资料将两个编号均描述为释放后使用漏洞,也有资料按内存耗尽与释放后使用区分。本文按当前资料整理,实际映射关系需以 PHP 官方安全公告或 MITRE CVE 记录为准。

Q2:该漏洞的风险等级如何,属于远程漏洞还是本地漏洞?

A:综合判定为高危漏洞。属于远程漏洞,攻击者仅需网络可达目标站点,发送特制 HTTP 请求即可尝试触发,不需要预先获取业务账号、登录凭证。

远程漏洞与本地漏洞的核心区别在于攻击入口:

表 2-1 远程漏洞与本地漏洞的区分

漏洞类型 攻击前提 暴露面 本例归属
远程漏洞 网络可达目标服务 所有对外开放的 Web 端口 PHP2Shell
本地漏洞 已获得目标系统命令行权限 仅本地用户或已入侵者 不适用

由于 PHP 作为服务端脚本语言,其解析流程天然暴露在网络请求处理路径上,因此内核级缺陷通常直接构成远程攻击面。

Q3:漏洞披露的关键时间节点是怎样的?

A:安全研究者向 PHP 安全团队提交漏洞报告,厂商完成分析、开发补丁;补丁发布后漏洞信息公开,随后出现概念验证代码,互联网逐步出现批量探测与在野利用行为。

典型的安全漏洞披露时间线如下:

图 3-1 PHP2Shell 漏洞披露时间线

详细时间线可查阅 PHP 官方安全公告与 oss-sec 邮件列表。PHP 官方已于 2026 年 10 月 21 日 22:00(北京时间)推送安全补丁,具体时间与补丁信息以官方公告为准。

Q4:为什么网站业务代码没有漏洞,依然会受到 PHP2Shell 影响?

A:漏洞根源在 PHP 运行时内核,并非网站业务代码。即使业务代码不存在 SQL 注入、跨站脚本攻击、文件上传等 Web 漏洞,只要服务器使用受影响版本 PHP,且满足触发条件,攻击者就可以利用 PHP 底层内存管理缺陷发起攻击。

图 4-1 Web 应用安全边界与 PHP2Shell 漏洞位置示意

业务代码的漏洞需要攻击者与业务逻辑交互(如提交表单、调用接口),而内核漏洞在请求进入 PHP 处理流程时即被触发,早于任何业务脚本执行。

Q5:PHP2Shell 和传统网站上传漏洞有什么本质差别?

A:传统上传漏洞是业务校验逻辑缺陷,允许恶意文件写入磁盘后执行;PHP2Shell 是 PHP 内核解析 multipart 表单时的内存破坏问题,不需要向磁盘写入恶意网页后门文件,属于运行时内存层面的无文件攻击。

两者对比如下:

表 5-1 传统上传漏洞与 PHP2Shell 的本质差别

对比维度 传统上传漏洞 PHP2Shell
漏洞位置 业务代码(如上传后缀校验不严) PHP 内核 multipart 解析模块
攻击载体 恶意文件(.php、.phtml 等) 特制 HTTP 请求体
落地文件 需要写入 Web 目录 不需要,内存中直接执行
检测难度 相对容易(文件监控、防火墙、杀毒软件) 困难(无文件、内存层面)
修复方式 修复业务代码 升级 PHP 版本
影响范围 单个业务系统 所有使用受影响 PHP 的服务

Q6:漏洞触发发生在请求处理的哪个阶段?

A:漏洞触发发生在 PHP 内核解析 HTTP 请求体阶段,早于网站 PHP 业务脚本执行。脚本代码还未运行,内存缺陷就已经被触发。

图 6-1 PHP-FPM 请求处理流程与漏洞触发位置

由图 6-1 可见,漏洞触发点位于业务脚本执行之前,这解释了为什么业务代码无缺陷也会被攻击。

二、受影响资产与环境识别


Q7:哪些 PHP 版本存在漏洞,哪些版本已经修复?

A:PHP 8.1、8.2、8.3、8.4 部分子版本受影响,各分支需要升级至 PHP 官方发布的安全版本。PHP 8.1 及更早版本已经停止维护(EOL),官方不会提供安全补丁。

据资料整理的各分支修复版本阈值如下(具体版本号待官方公告验证):

表 7-1 各 PHP 分支受影响与修复版本对照

PHP 分支 受影响版本 修复版本 维护状态
PHP 8.1.x 全部子版本 无(已 EOL) 已停止维护
PHP 8.2.x < 8.2.35 >= 8.2.35 活跃支持
PHP 8.3.x < 8.3.36 >= 8.3.36 活跃支持
PHP 8.4.x < 8.4.27 >= 8.4.27 活跃支持
PHP 8.5.x < 8.5.12 >= 8.5.12 活跃支持

注意:上表版本号来源于技术资料,未经 PHP 官方更新日志逐条核对。实际升级前,请通过版本查询命令确认当前版本,并访问 PHP 官方下载页或安全公告确认精确的修复版本号。

Q8:不同 SAPI 模式下,风险程度是否一样?

A:不一样。Apache + mod_php 是当前风险评估中的最高风险配置,因为已演示的利用链可在请求启动阶段、任何应用代码执行前,通过单个未认证请求触发。PHP-FPM 同样受到影响,但其利用条件与 mod_php 不同:针对 CVE-2026-109618,上游公告未报告完整的 PHP-FPM 利用链;针对 CVE-2026-109619,FPM 路径需要依赖应用层内的特定操作。CGI/FastCGI 模式存在一定风险,CLI 模式风险相对较低。

表 8-1 不同 SAPI 模式的风险对比

SAPI 模式 进程模型 跨请求状态残留 风险等级 说明
mod_php 嵌入 Apache 进程,随请求或进程回收 高 高 取决于 Apache 的多处理模块(MPM)模式与进程回收策略
PHP-FPM 独立工作进程池,进程常驻 中高 中高 攻击者可利用长连接命中同一工作进程,实现跨请求内存复用
CGI / FastCGI 每请求或进程池模式 低至中 中 IIS+FastCGI 等场景仍可能被利用
CLI 单次执行,进程退出 无 低 难以构造跨请求利用链

PHP-FPM 之所以成为主要目标,是因为其工作进程在处理大量请求后仍保持存活,为跨请求内存状态复用提供了条件。

Q9:Nginx+PHP-FPM、Apache+mod_php、IIS+FastCGI,哪些架构会受影响?

A:Nginx+PHP-FPM 是风险最高的组合;Apache+mod_php、IIS+FastCGI 只要 PHP 版本落在受影响区间,同样存在被利用风险。

图 9-1 常见 Web 架构风险排序

架构本身不决定是否受影响,底层 PHP 版本才是核心因素。但只要版本命中,架构差异会影响利用的稳定性与成功率。

Q10:宝塔、LNMP 一键包、云服务商预装 PHP 环境是否会受漏洞影响?

A:是否受影响只看底层 PHP 版本,和集成环境无关。只要内置 PHP 版本为受影响版本,无论宝塔、LNMP 还是云厂商预装环境,均存在风险。

集成环境只是安装与配置的封装,不改变 PHP 内核代码。排查时可直接执行版本查询命令:

# 查询 PHP 版本

php -v

# 查询 PHP-FPM 版本

php-fpm -v

# 查询上传进度配置

php -i | grep upload_progress

Q11:虚拟主机、独立服务器、容器、Serverless 环境,哪类资产风险最高?

A:共享虚拟主机风险最高,多租户场景下单台服务器承载大量站点,极易被批量扫描;其次是独立服务器与 PHP-FPM 容器;无服务器计算(Serverless)PHP 函数环境风险相对更低。

表 11-1 不同资产类型的风险对比

资产类型 多租户隔离 批量暴露面 风险等级 主要原因
共享虚拟主机 弱(同机多站) 极大 最高 单次扫描可命中大量站点,黑产收益高
独立服务器 强 中 高 通常直接暴露公网,维护水平参差不齐
PHP-FPM 容器 中 中 中至高 容器常伴随持续集成与持续部署(CI/CD)快速迭代,版本滞后常见
Serverless PHP 强 低 较低 函数生命周期短,跨请求状态残留窗口小

Q12:升级网站 CMS 程序(WordPress、Drupal 等)能不能修复 PHP2Shell?

A:不能。内容管理系统(CMS)属于上层业务应用,漏洞是 PHP 底层运行时缺陷,仅升级业务代码无法修复,必须升级 PHP 本身。

可以做一个类比:如果地基(PHP 内核)出现裂缝,无论地面建筑(CMS)装修得多好,都无法阻止地基塌陷。修复路径必须是:

错误做法:升级 WordPress、Drupal 或自定义业务代码。

正确做法:升级 PHP 版本至官方安全版本,或关闭上传进度统计功能作为临时缓解。

三、攻击原理与利用条件


Q13:成功利用 PHP2Shell,需要满足哪些必要条件?

A:核心条件包括四项:一是使用受影响版本 PHP;二是使用 PHP-FPM 等高风险服务器 API;三是服务可接收 multipart/form-data 类型 POST 请求;四是上传进度统计机制可用。缺少任意一项,攻击链很难完成。

表 13-1 成功利用的必要条件

序号 必要条件 说明 可否临时关闭
1 受影响版本 PHP 版本落在官方公布的受影响区间 不可,需升级
2 高风险 SAPI PHP-FPM 最佳,mod_php 次之 部分可调整
3 可接收 multipart/form-data 目标接口接受文件上传或表单提交 可通过网关限制
4 session.upload_progress 可用 默认开启,可配置关闭,CVE-2026-109619的确认利用路径之一 可,作为临时缓解

Q14:为什么攻击请求必须是 multipart/form-data 的 POST 上传请求?

A:漏洞触发点位于 PHP 内核 multipart 表单解析模块,只有该类型请求才会进入对应解析逻辑,触发内存分配与释放的缺陷。

multipart/form-data 是 HTTP 协议中用于提交表单数据(尤其是文件上传)的编码格式。PHP 在解析这种格式的请求体时,会调用专门的多部分解析器,将请求体拆分为多个部分并处理文件数据。PHP2Shell 的缺陷正存在于这一解析流程的内存管理环节,因此其他 Content-Type(如 application/x-www-form-urlencoded、application/json)不会进入该代码路径,无法触发漏洞。

Q15:攻击者可以实现哪些攻击效果?

A:一共三类效果:

一是发送畸形大请求触发内存耗尽,PHP 进程崩溃,业务中断;

二是内存信息泄露,读取进程内遗留的会话、凭证等敏感数据;

三是在满足内存布局条件下,实现无文件远程代码执行。

表 15-1 三类攻击效果对比

攻击效果 对应缺陷 影响维度 业务后果
进程崩溃 内存耗尽(OOM) 可用性 服务中断、网站无法访问
内存信息泄露 释放后使用(UAF) 机密性 数据库账号、接口密钥、会话数据外泄
远程代码执行 释放后使用(UAF) 机密性、完整性 服务器被控制、植入后门、横向移动

Q16:内存泄露能够获取哪些敏感信息?

A:可读取 PHP-FPM 进程内存中残留的内容,包括请求参数、会话数据、数据库账号密码、接口密钥等业务凭证。

由于 PHP-FPM 工作进程会复用,前一个请求处理完毕后,内存中可能残留敏感数据。攻击者通过释放后使用缺陷读取这些残留内存,即可获取本应已释放的机密信息。这种攻击不需要写入任何文件,也不产生命令执行日志,因此隐蔽性极强。

Q17:漏洞 RCE 成功后,是否可以直接完成容器逃逸?

A:漏洞本身不自带容器逃逸能力。远程代码执行成功后,攻击者仅获得容器内命令执行权限,如需逃逸还需要利用容器环境其他漏洞,属于后续衍生风险。

需要区分两个阶段:第一阶段是利用 PHP2Shell 获得 PHP 进程权限(通常是 www-data 或 php-fpm 用户);第二阶段才是尝试提升权限或逃逸容器。后者依赖于容器配置(如特权模式、挂载敏感目录、内核漏洞等),与 PHP2Shell 本身无关。

Q18:攻击者如何保证两次请求命中同一个 PHP-FPM 工作进程?

A:依靠 HTTP 长连接,让多条请求持续调度到同一个工作进程,从而实现跨请求内存状态复用。

PHP-FPM 默认启用长连接保持机制。当客户端与 PHP-FPM 之间建立持久连接后,同一连接上的多个请求会被调度到同一个工作进程处理。攻击者通过保持连接并快速发送构造请求,可以显著提高命中同一进程的概率,为跨请求内存复用创造条件。

Q19:该漏洞的远程代码执行是否可以绕过 disable_functions 限制?

A:在完成内存破坏、成功劫持执行流的场景下,可以绕过 PHP 层 disable_functions 限制,直接执行系统命令。

disable_functions 是 PHP 应用层的函数禁用配置,作用于 PHP 代码层面的函数调用(如 system、exec、passthru 等)。而 PHP2Shell 属于内核层内存破坏,攻击者通过控制指令指针或返回地址,可以直接跳转到系统调用或 gadgets,完全绕过 PHP 语言层的限制。同理,open_basedir、Suhosin 等应用层防护也无法阻挡内核层利用。

Q20:公开概念验证代码的利用门槛怎么样,扫描器是否已经支持检测?

A:互联网已经出现概念验证代码,使用 Python 即可构造恶意请求;Nuclei 等扫描器已经增加检测规则,但部分环境下利用存在稳定性差异。生产环境严禁直接使用概念验证代码测试,有造成服务崩溃风险。

表 20-1 公开工具与检测支持情况

工具/资源 状态 说明
概念验证代码 已公开 Python 脚本可构造畸形 multipart 请求
Nuclei 扫描模板 已支持 可检测部分环境,但存在误报与漏报
在野利用 已出现 黑产针对 PHP-FPM 共享虚拟主机批量扫描

特别提醒:在生产环境运行概念验证代码可能直接触发内存耗尽导致服务崩溃,务必在隔离的测试环境中验证。

四、防护能力边界与缓解措施


Q21:WAF、CDN 能否完全拦截本次漏洞攻击?

A:WAF 可基于请求特征拦截部分载荷,但载荷变形后存在绕过可能。WAF 只能识别流量特征,无法感知内存堆操作,不能从根源阻止漏洞利用。

WAF 与 CDN 的防护边界在于网络层与请求特征层,而 PHP2Shell 是内存层缺陷。攻击者可以通过分块传输、编码变形、拆分请求等方式绕过基于签名的检测。因此,WAF 只能作为临时缓解手段,不能替代版本升级。

Q22:关闭 session.upload_progress 能不能彻底防御漏洞?

A:关闭该配置可以大幅提升利用门槛,但不能根治漏洞,存在潜在绕过路径,仅作为临时缓解手段,不能替代版本升级。

关闭上传进度统计功能后,当前已知的利用路径被阻断,因为漏洞触发点位于该功能的处理逻辑中。但攻击者可能找到其他进入 multipart 解析模块的路径,或通过其他配置组合重新触发缺陷。因此,关闭该配置属于“缓解”而非“修复”。

Q23:修复 PHP2Shell 的根本方案是什么?升级后需要做什么操作?

A:根本方案是升级 PHP 到官方安全版本。升级完成后必须重启 PHP-FPM 或 Web 服务,新版本程序才会加载生效。

升级操作建议按以下步骤执行:

第一步,升级前完成服务器快照、数据备份与回滚方案;

第二步,通过包管理器或源码编译升级至修复版本;

第三步,重启 PHP-FPM、Nginx、Apache 服务;

第四步,验证业务稳定性,确认 PHP 版本与配置生效;

第五步,开展漏洞复测,确认风险消除。

Q24:业务暂时无法升级 PHP,有哪些临时缓解手段?哪些手段无效?

A:官方针对两个 CVE 分别给出了不同的临时缓解方向,需区分对待,不能一概而论。针对 CVE-2026-109618(OOM 损坏型) ,PHP 官方安全公告的首要临时缓解措施是 设置 memory_limit = -1,并建议通过 php_admin_value 等在应用无法覆盖的层级强制实施,同时确认没有池、目录或应用设置重新引入有限的内存上限。其原理是移除攻击者可控的“PHP 内存上限失败”触发条件;但需注意,底层分配失败仍可能到达同一脆弱路径,因此这只是降低暴露面,不是完整修复。针对 CVE-2026-109619(跨请求过期全局状态) ,确认的缓解包括 关闭 session.upload_progress.enabled 以及 关闭 fatal_error_backtraces(PHP 8.5 上确认的 producer 路径),两者均需重启工作进程才能生效。

表 24-1 临时缓解措施有效性对比

缓解措施 有效性 说明
调整 memory_limit 高 移除可控的内存上限触发条件;底层分配失败仍可能到达脆弱路径,不能替代升级
关闭 session.upload_progress 高 阻断当前已知利用路径,需重启生效
WAF 增加畸形 multipart 检测 中 基于请求特征拦截,存在绕过可能
限制 POST 请求最大尺寸 中 增加攻击成本,但畸形小请求仍可能触发
收紧访问源 中 仅允许可信 IP 访问上传接口
调高 PHP-FPM 进程自动重启次数 低至中 减少跨请求内存残留窗口

Q25:调整 PHP-FPM 进程回收策略能起到什么作用?

A:配置 pm.max_requests,让工作进程在处理指定数量请求后自动重启,能够减少跨请求内存残留,降低利用成功率,但不能消除漏洞本身。

该措施的原理是:通过强制进程回收,缩短单个工作进程处理请求的生命周期,从而降低攻击者构造跨请求内存复用的窗口。但由于漏洞触发本身不需要跨请求(内存耗尽型),该措施对拒绝服务类攻击无效,仅对释放后使用类攻击有一定缓解作用。

Q26:open_basedir、Suhosin 这类 PHP 安全扩展能否挡住漏洞利用?

A:不能。open_basedir、Suhosin 属于 PHP 应用层防护,一旦攻击者完成内存破坏劫持执行流,就可以绕过这类 PHP 层限制。

open_basedir 限制 PHP 脚本可访问的目录树,Suhosin 提供额外的函数与执行保护。但两者都在 PHP 语言层生效,而 PHP2Shell 是内核层内存破坏。攻击者通过控制内存执行流后,可以直接调用系统功能,不受这些应用层配置约束。

Q27:EOL 停止维护的老旧 PHP 版本,没有官方补丁该怎么处置?

A:优先迁移至受官方支持的 PHP 版本。无法迁移的场景,评估商业长期支持补丁;同时叠加网络隔离、最小权限、WAF 审计等多层防护,持续监控异常访问。

对于已停止维护的 PHP 8.1 及更早版本,处置路径如下:

第一,制定迁移计划,尽快升级至受支持分支(8.2、8.3、8.4、8.5);

第二,迁移前,将老旧版本资产从公网隔离,仅允许内网或可信源访问;

第三,如业务无法迁移,评估第三方商业长期支持(LTS)补丁的可行性;

第四,叠加网络层防护(WAF、网关限制)与主机层加固(最小权限、日志审计)。

Q28:虚拟主机用户没有权限升级底层 PHP,该如何处置?

A:第一时间联系主机服务商,要求升级底层 PHP 环境;临时限制上传接口,配置 WAF 防护,持续审计访问日志。

虚拟主机用户通常无法直接修改 PHP 版本或 php.ini 全局配置,可采取的措施包括:

一是联系服务商确认升级计划与时间表;

二是通过 .htaccess 或用户级配置尝试关闭上传进度统计功能(如服务商允许);

三是临时禁用或收紧业务的文件上传功能,减少攻击面;

四是持续监控网站访问日志与错误日志,发现异常及时处置。

五、自查检测、入侵排查与应急响应


Q29:如何快速自查服务器 PHP 版本,判断是否存在风险?

A:执行版本查询命令查看版本;批量资产可使用自动化脚本采集 PHP 版本、服务器 API 类型、php.ini 配置,对照官方受影响版本范围判定风险。

# 查询 PHP 版本

php -v

# 查询 PHP-FPM 版本

php-fpm -v

# 查询上传进度配置

php -i | grep upload_progress

# 查询当前加载的 php.ini 路径

php --ini

对于批量资产,建议通过网络空间测绘或内部资产清单,识别开放 80/443 端口且响应头包含 PHP 版本信息的资产,再逐一核查版本与配置。

Q30:漏洞被利用后,日志中会出现哪些异常特征?

A:常见异常包括:大量 multipart/form-data 类型 POST 请求、畸形 boundary 字段、500 错误、内存耗尽报错、PHP-FPM 进程异常重启。

表 30-1 漏洞利用后的日志异常特征

异常特征 对应攻击阶段 日志位置
大量 multipart/form-data POST 请求 探测与利用 Web 访问日志
畸形 boundary 字段 构造恶意请求 Web 访问日志
HTTP 500 错误 进程崩溃 Web 访问日志、PHP 错误日志
内存耗尽(OOM)报错 触发 OOM 缺陷 PHP 错误日志、系统日志
PHP-FPM 进程异常重启 工作进程崩溃 PHP-FPM 慢日志、系统日志

Q31:只做内存泄露、不执行命令的攻击,日志会有什么特征?

A:这类攻击不会产生命令执行日志,仅会出现特殊构造的 multipart POST 请求,痕迹隐蔽,很容易被忽略。

由于攻击者仅读取内存数据,不调用系统命令、不写入文件,因此系统日志、文件监控、命令审计均无记录。唯一的痕迹是访问日志中特殊构造的 multipart 请求。这要求运营人员不能仅依赖命令执行日志,还需关注请求体特征与频率异常。

Q32:如何从访问日志筛选可疑的攻击请求?

A:筛选 Content-Type 为 multipart/form-data 的 POST 请求,重点关注 boundary 异常、请求体超长的请求。

可参考的日志筛选思路如下:

# 筛选 multipart/form-data 请求

grep "multipart/form-data" /var/log/nginx/access.log

# 筛选 boundary 异常(如超长、含特殊字符)

grep -E "boundary=[^;]{0,10}$" /var/log/nginx/access.log

# 筛选大请求体(如超过 1MB)

awk '($10 > 1000000){print}' /var/log/nginx/access.log

实际环境中,建议结合请求频率、来源 IP 集中度、User-Agent 异常等维度综合研判。

Q33:FIM 文件完整性监控为什么很难发现该漏洞攻击?

A:漏洞支持无文件远程代码执行,攻击过程不写入恶意文件,文件完整性监控(FIM)只监控文件变更,无法识别内存层面的攻击行为。

FIM 通过比对文件哈希检测文件新增、修改、删除,而 PHP2Shell 的攻击载荷完全存在于 HTTP 请求与内存中,不产生文件系统变更。因此,依赖 FIM 的检测策略对这类无文件攻击基本无效,必须结合网络流量分析、进程行为监控、内存取证等手段。

Q34:如何判断 PHP-FPM 进程内存耗尽是业务正常现象还是漏洞攻击导致?

A:结合 Web 访问日志判断:漏洞攻击引发的内存耗尽会伴随畸形 multipart POST 请求;业务内存耗尽一般来自正常业务大文件上传、业务自身内存泄漏。

表 34-1 业务内存耗尽与漏洞攻击的区分

判断维度 业务正常现象 漏洞攻击
请求特征 正常文件上传,boundary 规范 畸形 multipart,boundary 异常
请求频率 与业务量匹配 突发高频,来源集中
时间分布 工作时间或业务高峰期 无明显规律,可能持续扫描
进程行为 内存缓慢增长后回收 突发崩溃,伴随大量 500 错误

Q35:怀疑服务器已经被入侵,应急处置步骤是什么?

A:应急处置步骤如下:

图 35-1 疑似失陷后的应急处置流程

第一步,隔离受害主机,阻断横向移动;

第二步,优先完成内存取证,再制作磁盘镜像,避免重启导致证据丢失;

第三步,审计 Web、PHP-FPM、系统日志,还原攻击时间线;

第四步,排查恶意进程、异常账号、定时任务、启动项等持久化机制;

第五步,清除后门与恶意文件,修改相关凭据;

第六步,修复漏洞(升级 PHP 或关闭上传进度统计),恢复业务;

第七步,完成事件溯源复盘,完善防护机制。

特别强调:在未完成内存取证前,禁止直接重启服务器,否则易丢失内存中的攻击痕迹。

六、威胁态势与长期安全思考


Q36:当前互联网是否已经出现在野批量扫描和利用?

A:漏洞披露后,互联网已经出现批量探测行为,黑产逐步开展在野利用,重点瞄准 PHP-FPM 共享虚拟主机资产。

共享虚拟主机由于单台服务器承载大量站点,且用户权限有限、升级滞后,成为黑产批量扫描的高性价比目标。建议共享虚拟主机用户与服务商保持沟通,及时完成底层 PHP 升级。

Q37:漏洞利用成功后,攻击者常见后续动作是什么?

A:攻击者获取执行权限后,通常植入持久化后门、部署挖矿程序、窃取数据库凭证,尝试在内网横向移动,窃取业务敏感数据。

表 37-1 攻击者常见后续动作

后续动作 目的 检测难度
植入持久化后门 维持访问权限 中(可通过文件、进程、定时任务监控发现)
部署挖矿程序 消耗算力获利 低(CPU 异常、异常外联易发现)
窃取数据库凭证 获取业务数据 中(需结合流量与日志分析)
内网横向移动 扩大控制范围 高(依赖内网流量监控与身份审计)

Q38:企业处置该漏洞,推荐的工作优先级是什么?

A:推荐按以下优先级推进:

图 38-1 企业处置 PHP2Shell 漏洞的工作优先级

第一,资产测绘,识别受影响 PHP 资产;

第二,部署临时防护,降低被利用风险;

第三,升级 PHP 版本,完成根本修复;

第四,日志审计排查入侵痕迹,确认是否已失陷;

第五,完善长期组件漏洞管理机制,防止同类问题复发。

Q39:这类底层内存漏洞为什么很难被传统代码审计发现?

A:漏洞位于 C 语言编写的 PHP 内核,依赖多请求时序与内存复用场景。传统静态代码扫描、业务代码审计,很难覆盖跨请求内存状态残留这类动态边界场景。

传统代码审计主要针对业务代码的逻辑缺陷(如注入、越权、校验不严),而内核漏洞属于内存安全问题,需要模糊测试、动态分析、污点跟踪等专门技术。此外,跨请求时序依赖运行时状态,静态分析难以覆盖,必须结合动态执行与压力测试才能暴露。

Q40:从 PHP2Shell 事件来看,企业针对基础组件应当建立怎样的长效防护机制?

A:建议建立软件资产台账,持续跟踪底层组件漏洞;定期开展版本巡检;完善漏洞应急响应流程;对基础组件增加内存安全相关的动态测试。

长效防护机制的核心要素如下:

表 40-1 基础组件长效防护机制

机制 关键动作 预期效果
软件资产台账 登记所有基础组件(PHP、Nginx、OpenSSL 等)及版本 漏洞爆发时快速定位受影响资产
版本巡检 定期核查组件版本与官方安全公告 及时发现滞后版本
应急响应流程 预设高危漏洞的处置剧本与责任人 缩短从披露到修复的时间窗口
内存安全测试 对基础组件增加模糊测试与动态分析 在上游发现潜在内存缺陷

PHP2Shell 再次说明:Web 安全不仅是业务代码的安全,底层运行时的安全同样关键。企业需将基础组件纳入统一的漏洞管理范畴。