CRITICAL · CVSS 9.2 ×2 · 2026-10-21
PHP 内核两个严重漏洞。
今天就要升级。
CVE-2026-109618 与 CVE-2026-109619(php2shell):未授权远程代码执行,存在于 PHP 运行时本身。自 5.4.0(2012 年)起的每一个版本都受影响,应用代码再干净也无济于事。修复版已于 2026-10-21 14:00 UTC 发布,野外攻击已开始。
🚨 Cloudflare 已于当日 07:43 UTC 报告针对 PHP 站点的攻击 · 大规模利用预计已经开始
在线检测:你的站点暴露了吗?
输入你的域名。我们只发送一次普通 GET 和一次正常的小型 multipart 表单(等同于浏览器上传一个小文件),绝不发送任何攻击载荷。
仅检测你拥有或已获授权的站点。版本横幅被隐藏 ≠ 安全;最可靠的确认方式是在服务器上运行 php -v。
⌘ 在服务器上自查(最可靠)
# 当前 PHP 版本(决定性证据)
php -v
# FPM 实际运行版本(CLI 与 FPM 可能不同!)
sudo systemctl status php*-fpm
# 公开端点是否泄露版本(关闭只是隐藏,不等于安全)
一键脚本(在服务器上运行,输出版本 + 全部关键风险设置):
php -r '$f=["8.2"=>"8.2.35","8.3"=>"8.3.36","8.4"=>"8.4.27","8.5"=>"8.5.12"];$b=PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;$x=isset($f[$b])?version_compare(PHP_VERSION,$f[$b],"<"):true;echo json_encode(["version"=>PHP_VERSION,"sapi"=>php_sapi_name(),"branch"=>$b,"branch_fix"=>$f[$b]??"none (EOL)","exposed"=>$x,"upload_progress"=>ini_get("session.upload_progress.enabled"),"strict_mode"=>ini_get("session.use_strict_mode"),"memory_limit"=>ini_get("memory_limit")],JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES),"\n";'
exposed: true 即受影响。upload_progress 为 1 时建议直接置 0 并重启 FPM(部分缓解)。FPM 站点请在池内配置中核对,CLI 结果可能与 web 不同。
判定规则: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 运行时,不在任何应用里。WordPress、Magento、Laravel 的代码一行不改也会中招;甚至一个只输出 hello world 的 PHP 文件同样暴露。mod_php 风险最高:应用代码尚未运行即可被未授权利用。
另一个变体是 Heartbleed 式内存泄露:无需 RCE、无需应用调用 session_start(),攻击者即可通过 PHPSESSID Cookie 读取 worker 进程内存中的密码、令牌、API 密钥。
已验证可被未授权 RCE 的应用(示例,非完整清单):
攻击是怎么发生的
以下为官方公告层面的说明,不含可武器化的细节。
-
1
恶意 multipart 请求,在应用代码运行之前
PHP 在请求启动阶段解析 multipart 上传体——此时你的第一行代码还没有执行。精心构造的请求可以在不突破 post_max_size 的前提下耗尽 memory_limit。
-
2
致命错误中断原生清理
内存耗尽触发 longjmp 紧急退出,跳过尚未完成的初始化清理,留下半初始化的内部状态与悬垂指针。请求结束后堆内存被释放,但全局状态仍指向它。
-
3
下一个请求消费陈旧状态 → RCE
同一 worker 处理后续请求时,在正常初始化之前就访问到这些"看起来有效"的陈旧指针——跨请求释放后使用(UAF)→ 以 Web 用户身份执行任意代码,或把进程内存泄进 Cookie。
这一切发生在应用层之下:应用日志可能毫无痕迹。WAF 只能拦截已知攻击形状,无法替代升级。可观测信号:异常 multipart 请求 + 500/内存耗尽错误、异常超长或畸形的 PHPSESSID Cookie、worker 无故重启、PHP 进程拉起 sh/curl 等命令。
如何升级(唯一完整方案)
漏洞在运行时,无法通过修改应用代码修复。立即升级到对应分支的安全版本:
运行 PHP 8.1 及更老版本?上游不再发布修复。选择:升级到受支持分支;或使用发行版/LTS 厂商的 backport 包;或使用官方提供的 7.4 / 8.0 / 8.1 源码 backport 分支自行构建。注意:Remi 仓库(rpms.remirepo.net)当天没有更新。
一小时内无法升级?临时缓解(均为部分缓解)
① 关闭 session.upload_progress 并重启所有 worker
切断已验证的会话利用路径。必须在 php.ini / FPM pool / 服务器配置级别设置——.user.ini 和 ini_set() 无效(我们在本地靶场实测:开启即被利用,关闭后同一 exploit 失败)。
; php.ini 或 conf.d(FPM 需写入 pool: php_admin_flag[...])
session.upload_progress.enabled = 0
# 然后重启每一个 worker:systemctl reload php*-fpm② memory_limit = -1(管理级别强制)
移除可被攻击者按需触发的内存上限错误路径。用 php_admin_value 强制,确认没有 pool/目录/应用把有限值改回去。副作用:单请求可耗尽服务器内存,仅作短期措施。
; FPM pool
php_admin_value[memory_limit] = -1③ 收紧 post_max_size 并在边缘限制 multipart
post_max_size 调小(无上传需求 8M,需要上传 32M 并保持 upload_max_filesize 更小);在反代层限制解码后请求体大小、字段数、multipart part 数、头部数与嵌套深度——必须覆盖无 Content-Length 的请求。
④ 必要时直接在 Web 服务器拒绝 multipart
会破坏所有文件上传(媒体库、商品图),仅限极端情况下购买补丁时间:
# nginx, server 块
if ($http_content_type ~* "multipart/form-data") { return 403; }
# Apache, VirtualHost
RewriteEngine On
RewriteCond %{HTTP:Content-Type} multipart/form-data [NC]
RewriteRule ^ - [F]⑤ 其他可选加固
PHP 8.5:fatal_error_backtraces=0(阻断已确认的 backtrace 生产者)。FPM:pm.max_requests=1(牺牲性能打断跨请求链)。Cloudflare 用户:WAF 托管规则已对所有计划部署,作为权宜之计。
时间线
- 2004Stefan Esser 发现首个 PHP memory_limit 远程漏洞,选择不公开 exploit
- 2020PHP bug #78876:长 multipart 变量导致 OOM 与临时文件残留,未被重视
- 2024OSTIF / Quarkslab 审计重新发现同一 OOM 问题,可利用性未证明,未修复
- 2026-08Calif(与 OpenAI 协作)与 Wiz Research 分别完成未授权 RCE 并报告 PHP
- 10-20细节提前泄露;watchTowr 确认远程代码执行真实可行
- 10-21 07:43Cloudflare 报告针对 PHP 站点的攻击已出现,随即部署 WAF 规则
- 10-21 14:00PHP 发布 8.2.35 / 8.3.36 / 8.4.27 / 8.5.12,各方同步公开细节
常见问题
我的站没用 PHP,需要关心吗?
不运行 PHP(含内置 PHP 的设备/面板/CMS 托管)则不受影响。注意很多“静态站”背后有 PHP 控制面板或统计脚本。
把 X-Powered-By 关掉是不是就安全了?
不是。隐藏版本只是让攻击者和检测工具都看不到,漏洞本身原封不动。唯一出路是升级运行时。
WAF / Cloudflare 能挡住吗?
能挡已知形状,作为缓冲可以,但公告明确没有完整缓解。origin IP 暴露时 WAF 完全失效。升级才是终点。
检测站会对我的站做什么?
一次普通 GET,一次正常的小型 multipart 表单提交(等同浏览器上传小文件),仅此而已。不发送任何利用载荷、不施压内存。源码开源可审计。
共享主机 / 不管理服务器怎么办?
立刻联系主机商要求当天升级。PHP 8.1 及更老的没有官方修复——要求迁移到受支持分支。
怎么确认已被入侵?
排查:PHP worker 拉起 sh/bash/curl/wget/nc;webroot 新增 webshell;异常 cron/账号;异常超长 PHPSESSID Cookie 与 500/内存错误尖峰;完整指引见官方公告与 GHSA。