<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>漏洞 on 海上共明月</title><link>https://withlia.cn/tags/%E6%BC%8F%E6%B4%9E/</link><description>Recent content in 漏洞 on 海上共明月</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Thu, 22 Oct 2026 15:51:00 +0800</lastBuildDate><atom:link href="https://withlia.cn/tags/%E6%BC%8F%E6%B4%9E/index.xml" rel="self" type="application/rss+xml"/><item><title>收到阿里云 PHP2Shell 告警后，我紧张了十分钟</title><link>https://withlia.cn/p/php2shell-aliyun-alert/</link><pubDate>Thu, 22 Oct 2026 15:51:00 +0800</pubDate><guid>https://withlia.cn/p/php2shell-aliyun-alert/</guid><description>&lt;img src="https://withlia.cn/p/php2shell-aliyun-alert/1.png" alt="Featured image of post 收到阿里云 PHP2Shell 告警后，我紧张了十分钟" /&gt;&lt;p&gt;下午两点十二分，手机震了一下。&lt;/p&gt;
&lt;p&gt;我正干着别的事，随手瞟了一眼，看到开头四个字是「【阿里云】」，后面跟着「安全风险通告」。当时心里就是咯噔一下——这条短信不是营销，阿里云的安全通知从来不发废话。&lt;/p&gt;
&lt;p&gt;&lt;img alt="阿里云发来的告警短信" class="gallery-image" data-flex-basis="307px" data-flex-grow="128" height="808" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://withlia.cn/p/php2shell-aliyun-alert/0.jpg" srcset="https://withlia.cn/p/php2shell-aliyun-alert/0_hu_32586a19271ad345.jpg 800w, https://withlia.cn/p/php2shell-aliyun-alert/0.jpg 1035w" width="1035"&gt;&lt;/p&gt;
&lt;p&gt;短信内容很短：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;【阿里云】尊敬的 aliyun*33711：
【安全风险通告】PHP 曝出&amp;quot;php2shell&amp;quot;远程代码执行漏洞（CVE-2026-109618、CVE-2026-109619）。如您的业务使用 PHP，请尽快自查并升级至安全版本，避免服务器遭受攻击。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;PHP。远程代码执行。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;那一瞬间我脑子里过的画面是：博客被人挂上一句话木马、首页被改成黑底红字的乱码、服务器在替我挖矿、账单开始飙……&lt;/p&gt;
&lt;p&gt;虽然我盯着&amp;quot;如您的业务使用 PHP&amp;quot;这几个字看了两遍，但说实话，第一反应还是——&lt;strong&gt;我这站，到底是不是 PHP 的？&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="先别慌我的站到底是什么"&gt;先别慌，我的站到底是什么
&lt;/h2&gt;&lt;p&gt;写博客这件事有个坏处：搭完之后就很少再想底层细节了。我确实记得自己是拿 Hugo 弄的，但&amp;quot;Hugo 是什么&amp;quot;和&amp;quot;我的服务器上装了什么&amp;quot;是两件事，中间隔着 Nginx、宝塔、几个自己加的小服务。人一紧张，这些细节就全糊在一起了。&lt;/p&gt;
&lt;p&gt;所以我干脆不靠记忆，直接上服务器查。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1）网站目录里有没有 PHP 文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;find /www/wwwroot/我的站点 -iname &lt;span class="s2"&gt;&amp;#34;*.php&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; wc -l
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 输出 0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2）Nginx 配置里有没有把 .php 请求转给 PHP-FPM&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grep -rn &lt;span class="s2"&gt;&amp;#34;fastcgi_pass\|location.*\.php&amp;#34;&lt;/span&gt; /www/server/panel/vhost/nginx/ &lt;span class="p"&gt;|&lt;/span&gt; grep -v &lt;span class="s2"&gt;&amp;#34;^\s*#&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 输出为空&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 3）这台机器上有没有装 PHP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;php -v 2&amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;没有 PHP&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;三条命令下去，答案很干净：&lt;strong&gt;零个 PHP 文件，零条 fastcgi 配置，机器上没装 PHP。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;心跳恢复正常。&lt;/p&gt;
&lt;p&gt;再回头审视一遍自己的架构，其实一目了然：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;浏览器
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ HTTPS
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Nginx ──► 站点目录 ├─ index.html ← Hugo 编译产物，直接当文件发出去
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ css/js/img ← 同上
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─ 没有 .php，也没有 fastcgi_pass
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─► Go 服务（看板后端）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─► Node 服务（点赞接口）
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;整条链路上，PHP 出现的位置是零。Nginx 压根不认识 &lt;code&gt;.php&lt;/code&gt; 这个后缀，请求打过来它要么返回 404，要么当成静态文件去磁盘上找一个不存在的文件。&lt;strong&gt;PHP 解释器没有机会被唤起，漏洞也就没有入口。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;十分钟紧张，换来三行输出。值了。&lt;/p&gt;
&lt;p&gt;不过在关掉这条短信之前，我倒是想把这事彻底搞明白——毕竟这个洞的评分是 9.2，而且我身边用 WordPress 建站的朋友一抓一大把。于是我把官方的技术公告翻了一遍。&lt;/p&gt;
&lt;h2 id="这个洞到底是怎么回事"&gt;这个洞，到底是怎么回事
&lt;/h2&gt;&lt;p&gt;两个 CVE 编号不同，但病根是同一个：&lt;strong&gt;PHP 在处理&amp;quot;出错&amp;quot;的时候，脑子不清醒。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="第一个洞内存耗尽时的半成品"&gt;第一个洞：内存耗尽时的&amp;quot;半成品&amp;quot;
&lt;/h3&gt;&lt;p&gt;PHP 有个配置叫 &lt;code&gt;memory_limit&lt;/code&gt;，意思是&amp;quot;单个请求最多能吃掉多少内存，超了直接掐死&amp;quot;。这是道保险丝，防止一个烂请求把整台服务器拖死。&lt;/p&gt;
&lt;p&gt;问题就出在&amp;quot;掐死&amp;quot;的那一瞬间。&lt;/p&gt;
&lt;p&gt;打个比方：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;你在拼一张桌子，四条腿只装了一条。
老板突然喊&amp;quot;时间到，收工！&amp;quot;——这就是 &lt;code&gt;memory_limit&lt;/code&gt; 触发。
正常流程应该把半成品零件收回去放好。
但清理代码犯了个错：&lt;strong&gt;它把这张歪桌子当成了成品，还照着图纸去拆&lt;/strong&gt;。
而图纸指的位置，可能正好是上一批零件堆里、被攻击者塞过东西的地方。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;技术一点的说法：&lt;code&gt;memory_limit&lt;/code&gt; 超限时，PHP 用 &lt;code&gt;longjmp()&lt;/code&gt; 直接跳出去中断请求。这一跳可能发生在内部请求数据&lt;strong&gt;只初始化了一半&lt;/strong&gt;的时刻——典型场景是正在解析 multipart 表单上传。接着清理流程把未初始化的无效数据当成有效数据去释放内存，而那块内存里可能还留着攻击者能控制的内容。内存被破坏，然后被利用成执行任意代码。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这条最要命的地方在于&lt;/strong&gt;：在 Apache + &lt;code&gt;mod_php&lt;/code&gt; 的部署方式下，&lt;strong&gt;一个请求就能触发，而且是在你的业务代码执行之前&lt;/strong&gt;。也就是说，哪怕你的 &lt;code&gt;index.php&lt;/code&gt; 里只写了一行 &lt;code&gt;echo &amp;quot;hello&amp;quot;&lt;/code&gt;，也可能被打穿。你代码写得再规范都不管用，因为这个洞在解释器里。&lt;/p&gt;
&lt;h3 id="第二个洞上个客人的东西没打扫干净"&gt;第二个洞：上个客人的东西没打扫干净
&lt;/h3&gt;&lt;p&gt;PHP-FPM 是进程池模式。一个 worker 处理完请求不会销毁，而是接着处理下一个——省去反复启动的开销。这是性能上的好事，但对&amp;quot;清理干净&amp;quot;的要求极高。&lt;/p&gt;
&lt;p&gt;再打个比方：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;客人退房了，保洁以为收拾完了，其实他一只拖鞋还留在床底下（内存已释放，但指针还指着那儿）。
新客人进来一屁股坐下，脚正好踩上那只拖鞋——&lt;strong&gt;踩空了&lt;/strong&gt;，摔了。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;这在程序世界里叫&amp;quot;释放后使用&amp;quot;（Use-After-Free），内存类漏洞里最经典的一种。属于某个请求的内部状态，在内存被释放后指针还残留着；如果中途发生一次致命错误，清理路径可能被跳过。等同一个 worker 接下一个请求时，某些逻辑只要在正常初始化之前抢先跑，读到的就是&amp;quot;上一位客人的残留&amp;quot;。&lt;/p&gt;
&lt;p&gt;利用通常是两个请求配合：第一个制造残留，第二个去踩。前提是落到同一个 worker 上——多打几次总能碰上。&lt;/p&gt;
&lt;p&gt;官方确认的一条现成路径是 &lt;strong&gt;&lt;code&gt;session.upload_progress&lt;/code&gt;&lt;/strong&gt;，也就是那个让 PHP 在上传大文件时显示&amp;quot;已上传 37%&amp;ldquo;的功能。这玩意儿绝大多数人根本不用，但它&lt;strong&gt;默认开着&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="一句话对比"&gt;一句话对比
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;&lt;/th&gt;
 &lt;th&gt;CVE-2026-109618&lt;/th&gt;
 &lt;th&gt;CVE-2026-109619&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;病根&lt;/td&gt;
 &lt;td&gt;内存耗尽时的清理逻辑&lt;/td&gt;
 &lt;td&gt;请求之间的状态没重置干净&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;比喻&lt;/td&gt;
 &lt;td&gt;半成品当成品拆，拆错位置&lt;/td&gt;
 &lt;td&gt;上个客人的残留被下个客人踩到&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;漏洞类型&lt;/td&gt;
 &lt;td&gt;内存破坏（OOM corruption）&lt;/td&gt;
 &lt;td&gt;释放后使用（Use-After-Free）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;门槛&lt;/td&gt;
 &lt;td&gt;单请求即可（mod_php 下）&lt;/td&gt;
 &lt;td&gt;通常要两个请求命中同一 worker&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;已知入口&lt;/td&gt;
 &lt;td&gt;multipart 表单解析&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;session.upload_progress&lt;/code&gt;、致命错误回溯&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="影响范围比想象中广"&gt;影响范围：比想象中广
&lt;/h2&gt;&lt;p&gt;修复版本是这几个：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;分支&lt;/th&gt;
 &lt;th&gt;安全版本&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;PHP 8.5&lt;/td&gt;
 &lt;td&gt;≥ 8.5.12&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;PHP 8.4&lt;/td&gt;
 &lt;td&gt;≥ 8.4.27&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;PHP 8.3&lt;/td&gt;
 &lt;td&gt;≥ 8.3.36&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;PHP 8.2&lt;/td&gt;
 &lt;td&gt;≥ 8.2.35&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;PHP 8.1 及更早&lt;/td&gt;
 &lt;td&gt;已 EOL，无官方更新（官方给了 7.4 / 8.0 / 8.1 的源码回溯补丁）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;运行方式上，官方原话是&amp;rdquo;&lt;strong&gt;所有处理 Web 请求的 PHP 安装&lt;/strong&gt;&amp;quot;，点名了 PHP-FPM、Apache + &lt;code&gt;mod_php&lt;/code&gt;（风险最高）、php-cgi、FrankenPHP、LiteSpeed。&lt;/p&gt;
&lt;p&gt;但真正让我意外的是连带范围。很多产品是把 PHP 打包在里面的：WordPress、Drupal、Joomla 这些建站程序，Laravel 这类框架，宝塔面板的网站功能，各种 NAS 套件、路由器管理页，还有一堆基于 &lt;code&gt;php:8.x-fpm&lt;/code&gt; 的容器镜像。&lt;/p&gt;
&lt;p&gt;荷兰 NCSC 甚至专门建了个仓库登记&amp;quot;哪些软件内嵌了受影响的 PHP&amp;quot;。也就是说——&lt;strong&gt;就算你的主站不用 PHP，服务器上、内网里、某个设备的后台，也可能藏着一个 PHP。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;顺便记一下时间线，感受一下这次的节奏：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;时间&lt;/th&gt;
 &lt;th&gt;事件&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;10-20&lt;/td&gt;
 &lt;td&gt;PHP 官方罕见地提前打招呼：明天发紧急补丁&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;10-21 13:30 UTC&lt;/td&gt;
 &lt;td&gt;补丁发布&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;10-21 当天&lt;/td&gt;
 &lt;td&gt;欧盟 CERT-EU、英国 NCSC、新加坡 CSA、瑞士 BACS 同日发高危通告&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;10-22&lt;/td&gt;
 &lt;td&gt;技术细节和 PoC 已在网上流传&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;官方会&amp;quot;提前预告&amp;quot;，说明严重到必须让运维提前排队；多个国家级机构在同一天发告警，这种规格一般只给&amp;quot;人人都用的东西出了要命的洞&amp;quot;。而 PoC 一旦公开，就意味着拿现成脚本的扫描会按小时来——这种事从不按天算。&lt;/p&gt;
&lt;h2 id="为什么这次让人有点火"&gt;为什么这次让人有点火
&lt;/h2&gt;&lt;p&gt;翻公告的时候还看到一篇 PHP 基金会自己写的复盘，读起来挺不是滋味。&lt;/p&gt;
&lt;p&gt;大意是：2024 年 PHP 做了多年来第一次外部安全审计，审计收尾时就摸到了 OOM 这个问题的边。同年已经有人推演出&amp;quot;理论上能打成 RCE&amp;quot;，但当时没找到具体路径，其他有明确影响的漏洞更紧急，就压下去了。&lt;/p&gt;
&lt;p&gt;后来要修，发现有几种改法，每种都有代价：破坏向后兼容、引入新的拒绝服务风险、或者要改一堆第三方扩展（基本没法协调）。安全团队是共识制，没人敢拍板，怕选错。于是&amp;quot;修—停—再修&amp;quot;反复折腾了几个月。&lt;/p&gt;
&lt;p&gt;基金会原话是：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;我们不打算掩饰，这次延迟是一次结构性的失败，既有决策流程的问题，也有人力不足的问题。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;这段话我看了两遍。它说明的事其实很朴素：&lt;strong&gt;开源基础设施的维护者常年人手不够。&lt;/strong&gt; 你依赖的东西越是&amp;quot;默默无闻地支撑一切&amp;quot;，出问题时越是没人兜底。PHP 撑着大半个互联网，但它的安全团队要靠基金会筹钱养。&lt;/p&gt;
&lt;h2 id="如果你的站真是-php"&gt;如果你的站真是 PHP
&lt;/h2&gt;&lt;p&gt;我把这段整理出来了，万一以后要帮朋友处理，不用再翻公告。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;唯一真正的解法是升级。&lt;/strong&gt; 官方说得很直白：没有完整的缓解措施。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 先看清现状&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;php -v
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;php-fpm -v 2&amp;gt;/dev/null
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;宝塔用户：软件商店 → PHP → 更新或切到 8.3.36 / 8.4.27 / 8.5.12，然后&lt;strong&gt;必须重启 PHP&lt;/strong&gt;（老进程还在跑旧代码，光换版本没用）。&lt;/p&gt;
&lt;p&gt;Debian / Ubuntu：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo apt install --only-upgrade php8.3-fpm
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl restart php8.3-fpm
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Docker 的话，&lt;code&gt;docker restart&lt;/code&gt; 没用，镜像得重建：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker pull php:8.3-fpm
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose up -d --build
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;升完还得确认三件事，这几个坑我都见过：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1）实际运行的版本真的变了吗&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;php -v
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2）worker 是不是全重启了&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ps aux &lt;span class="p"&gt;|&lt;/span&gt; grep php-fpm &lt;span class="p"&gt;|&lt;/span&gt; grep -v grep
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 3）角落里有没有第二套老 PHP（多版本共存时常见）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls /usr/bin/php* /usr/local/bin/php* 2&amp;gt;/dev/null
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;实在升不了级，只能做临时缓解，但要有心理准备：&lt;strong&gt;这些措施只降低特定路径的暴露面，不会让你的安装变安全。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;针对 OOM 那个洞：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;; 移除可控的内存上限失败（要写在 FPM pool / Apache 配置里，用 php_admin_value，防止应用改回来）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;php_admin_value[memory_limit]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;-1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;; 收紧请求体&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;post_max_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;8M ; 不上传就 8M，需要上传就 32M&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;upload_max_filesize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;2M ; 必须小于 post_max_size&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;注意别用 &lt;code&gt;RLIMIT_AS&lt;/code&gt; / &lt;code&gt;RLIMIT_DATA&lt;/code&gt; 去兜内存——它们造成的分配失败正好会走进漏洞路径。要用容器或 cgroup 限制，并且配成&amp;quot;只杀出问题的那个 worker&amp;quot;。&lt;/p&gt;
&lt;p&gt;针对残留状态那个洞：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;session.upload_progress.enabled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;0 ; 官方确认的一条利用路径，直接关掉&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;fatal_error_backtraces&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;0 ; 仅 PHP 8.5 有效&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;改完&lt;strong&gt;必须重启所有 worker&lt;/strong&gt;，而且要写在 &lt;code&gt;php.ini&lt;/code&gt;、FPM pool 或服务器配置里——&lt;strong&gt;不能靠 &lt;code&gt;ini_set()&lt;/code&gt; 或 &lt;code&gt;.user.ini&lt;/code&gt;&lt;/strong&gt;，那时候请求已经在解析了，晚了。&lt;/p&gt;
&lt;p&gt;还有个容易忽略的点：用 &lt;code&gt;error_reporting&lt;/code&gt;、&lt;code&gt;display_errors&lt;/code&gt; 或者 &lt;code&gt;@&lt;/code&gt; 把警告藏起来是没用的。问题不在&amp;quot;显示&amp;quot;，在于它被触发了。那些无效的、已废弃的 per-request 设置，得真的清掉。&lt;/p&gt;
&lt;p&gt;最后，补丁只修漏洞，不修复已经发生的入侵。如果站已经被人摸进去过，升级之后还得查：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 有没有可疑进程&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ps aux &lt;span class="p"&gt;|&lt;/span&gt; grep -E &lt;span class="s2"&gt;&amp;#34;php|sh -c|curl|wget&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; grep -v grep
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 网站目录有没有被塞进奇怪的文件（一句话木马通常文件名短、体积小）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;find /www/wwwroot -name &lt;span class="s2"&gt;&amp;#34;*.php&amp;#34;&lt;/span&gt; -newermt &lt;span class="s2"&gt;&amp;#34;2026-10-20&amp;#34;&lt;/span&gt; -ls
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 定时任务有没有被加东西（挖矿、回连的常见手法）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;crontab -l&lt;span class="p"&gt;;&lt;/span&gt; ls -la /etc/cron.* /var/spool/cron/ 2&amp;gt;/dev/null
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;真发现痕迹就别自己清了，断网、留证据、找专业应急。&lt;/p&gt;
&lt;h2 id="虚惊一场之后"&gt;虚惊一场之后
&lt;/h2&gt;&lt;p&gt;关掉那条短信的时候，我有点庆幸当初选了静态站。&lt;/p&gt;
&lt;p&gt;但冷静下来想，这种&amp;quot;庆幸&amp;quot;其实是有代价的——静态站把 PHP 这一整类风险换掉了，代价是评论、点赞、搜索这些动态功能全得另外搭：Twikoo 要单独跑一个 Node 服务连 MongoDB，看板要单独跑一个 Go 服务，每一个都是新的攻击面。&lt;strong&gt;风险没有消失，只是挪了位置。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;所以这条短信对我来说不算白紧张。至少现在我清楚地知道：自己的站靠什么在跑、哪些端口开着、万一真中招该从哪查起。这种&amp;quot;知道&amp;quot;比&amp;quot;应该没事吧&amp;quot;踏实得多。&lt;/p&gt;
&lt;p&gt;至于我那些用 WordPress 的朋友，我已经把消息转过去了——他们的 PHP 是真得升级。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;参考资料&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PHP 官方公告（2026-10-21）：&lt;a class="link" href="https://www.php.net/archive/2026.php#2026-10-21-5" target="_blank" rel="noopener"
 &gt;https://www.php.net/archive/2026.php#2026-10-21-5&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;PHP 基金会复盘：&lt;a class="link" href="https://thephp.foundation/blog/2026/10/21/todays-php-security-release-and-how-were-strengthening-php-security/" target="_blank" rel="noopener"
 &gt;https://thephp.foundation/blog/2026/10/21/todays-php-security-release-and-how-were-strengthening-php-security/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;技术公告 GHSA-w8hw-w9fx-j79w：&lt;a class="link" href="https://github.com/php/php-src/security/advisories/GHSA-w8hw-w9fx-j79w" target="_blank" rel="noopener"
 &gt;https://github.com/php/php-src/security/advisories/GHSA-w8hw-w9fx-j79w&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;技术公告 GHSA-6wmf-4rv5-p3rp：&lt;a class="link" href="https://github.com/php/php-src/security/advisories/GHSA-6wmf-4rv5-p3rp" target="_blank" rel="noopener"
 &gt;https://github.com/php/php-src/security/advisories/GHSA-6wmf-4rv5-p3rp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;CERT-EU 安全通告 2026-018：&lt;a class="link" href="https://cert.europa.eu/publications/security-advisories/2026-018" target="_blank" rel="noopener"
 &gt;https://cert.europa.eu/publications/security-advisories/2026-018&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;英国 NCSC：&lt;a class="link" href="https://www.ncsc.gov.uk/news/critical-security-issue-affecting-php" target="_blank" rel="noopener"
 &gt;https://www.ncsc.gov.uk/news/critical-security-issue-affecting-php&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;阿里云漏洞通告：&lt;a class="link" href="https://www.aliyun.com/notice/118746" target="_blank" rel="noopener"
 &gt;https://www.aliyun.com/notice/118746&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;内嵌 PHP 的受影响产品清单（NCSC-NL）：&lt;a class="link" href="https://github.com/NCSC-NL/php2shell" target="_blank" rel="noopener"
 &gt;https://github.com/NCSC-NL/php2shell&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>