关于PHP两项9.2分严重漏洞可能有效的缓解措施

各大技术群和推特上都在疯传去 php.ini 里把 session.upload_progress.enabled 改成 0(或者 Off)就是可以防住这次的漏洞。也就是所谓的“一行配置免打补丁”。

这个我在群里和一些大佬交流了一下,结论是:这招挡不住所有攻击,最多只能帮你挡一半

因为这次爆出来的是两个漏洞

  • 第一条攻击路径走的是 session.upload_progress(泄露出来的那份 PHP2Shell 脚本貌似走的就是这个攻击点)
  • 但第二条攻击路径在 PHP 底层的 multipart 请求解析器。把 upload_progress 关了,甚至把 file_uploads = Off 关了(彻底禁止文件上传),但是 PHP 在收到请求时,按照设计必然需要先解析 multipart 请求体,导致触发第二条攻击路径。

PHP 的核心开发者 Gina Peter Banyard 也说了

“The only thing I can say is that the only mitigation is patching/upgrading PHP. I sadly know too much.”
我唯一能说的是,唯一的缓解办法就是打补丁/升级 PHP。很遗憾我知道得太多了。

目前可能有点用的临时措施

影响是这几个小时里没法在博客后台传图片和更新插件了

session.upload_progress.enabled = 0 先改上

虽然防不住第二个攻击路径,但起码能先拦住一些脚本是不,起码脚本小子能防住

  • 面板党:去面板的「PHP 管理」->「配置文件」,搜索 session.upload_progress.enabled,把后面的 On 或 1 dou改成 0,保存并重载配置。
  • 手动党:在对应的 php.ini 里加上 session.upload_progress.enabled = 0,保存并重载配置。

4.2 在 Nginx 直接阻断 multipart 请求

既然都说两条攻击路径都必须通过发送 multipart/form-data 格式的请求体来触发,那最直接的缓解办法就是:在请求到答 PHP-FPM 之前,让 Nginx 直接干死所有带 multipart 头的请求!
在站点的 Nginx 主配置文件的 server {} 块里塞入这三行:

if ($http_content_type ~* "multipart") {
    return 403;
}

宝塔面板可以在这里配置:

  • 直接打开你的/www/server/nginx/conf/pathinfo.conf文件

  • 把前边三行代码写在文件的第一行,大概是这样的感觉

if ($http_content_type ~* "multipart") {
    return 403;
}
set $real_script_name $fastcgi_script_name;
if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
		set $real_script_name $1;
		set $path_info $2;
 }
fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
fastcgi_param SCRIPT_NAME $real_script_name;
fastcgi_param PATH_INFO $path_info;
  • 重载Nginx配置,然后在本地测试一下curl -i -F "test=1" https://网站域名/index.php 如果返回是HTTP/1.1 403 Forbidden 就是缓解措施生效了
1 个赞

PHP修复更新已经发布,估计很快就能解决了,这年头修不完的CVE

都在等 docker 镜像更新:sob:

我自己的服务先在waf加了阻断 multipart 请求。
公司的明天再说了:grin:

MMP哦,我的博客中转页是被黑产当成啥了,中转页一堆针对外站mod_php的访问请求 :sweat_smile:

官方发布了四个分支的安全更新:

  • PHP 8.4:更新至 8.4.27

  • PHP 8.3:更新至 8.3.36

  • PHP 8.2:更新至 8.2.35

  • PHP 8.5:更新至 8.5.12

  • 官方安全团队向社区同步开源了针对 PHP 7.4、8.0、8.1 的源码补丁

根据php2shell网站的说明

  1. CVE-2026-109618(OOM 内存耗尽破坏导致 RCE): 当 PHP 接收大体积请求(尤其在解析 multipart/form-data 请求体)时,如果触发了内存耗尽错误(OOM),PHP 底层会紧急中断当前请求的初始化流程。但致命的是,请求中断后的内存清理代码(Cleanup)存在缺陷,把一堆还没初始化完毕的半拉子垃圾数据当成了合法数据去释放和引用,导致内存结构严重损坏。

  2. CVE-2026-109619(残留全局状态污染导致 RCE / 数据泄露): 当一个请求在执行过程中因致命错误中断后,它原本占用的部分内部全局状态并没有被彻底清零,残留在了同一个 PHP Worker 进程内。下一个访客的请求分配到同一个 Worker 时,在完成自身初始化前就踩中了上一个请求残留的内存指针(典型的 UAF 释放后重用)。白天群里传的 session.upload_progress 正是触发该残留状态的主要路径之一。

  3. Apache + mod_php 模式风险最高,攻击者可以通过单个恶意请求,在没有任何业务代码干预的情况下直接实现稳定 RCE。

  4. 实际现在更常见的Nginx + PHP-FPM模式下,虽然漏洞同样存在,但要在 FPM 模式下精准引导“拿到系统 Shell”,需要非常精巧的反复探测并设计参数才能实现,脚本小子只能实现把PHP打崩溃

  • 好消息:缓解措施被 cloudflare 证明有效,目前观测到的全部攻击流量都集中在 multipart 请求。只要你前端 web 服务器不是Apache + mod_php模式,基本就没事,被打了基本只会让 PHP 进程崩溃。

  • Ubuntu / Debian 已经做好了 PHP 补丁,直接sudo apt update && sudo apt upgrade就行,甚至连 Ubuntu 20 都可以通过 Ubuntu Pro(ESM)获得 PHP 官方都没提供的 PHP 7.4 的补丁