<?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://blog.liurb.org/tags/%E5%AE%89%E5%85%A8/</link><description>Recent content in 安全 on 大卷学长的博客</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Wed, 21 Oct 2026 23:48:00 +0000</lastBuildDate><atom:link href="https://blog.liurb.org/tags/%E5%AE%89%E5%85%A8/index.xml" rel="self" type="application/rss+xml"/><item><title>活久见 ！PHP 爆出漏洞，同时还有 GO 和 Node</title><link>https://blog.liurb.org/posts/2026/10/21/oct-vulns-php-go-node/</link><pubDate>Wed, 21 Oct 2026 23:48:00 +0000</pubDate><guid>https://blog.liurb.org/posts/2026/10/21/oct-vulns-php-go-node/</guid><description>&lt;img src="https://blog.liurb.org/images/posts/2026/oct-vulns_cover.png" alt="Featured image of post 活久见 ！PHP 爆出漏洞，同时还有 GO 和 Node" />&lt;h1 id="活久见-php-爆出漏洞同时还有-go-和-node">活久见 ！PHP 爆出漏洞，同时还有 GO 和 Node
&lt;/h1>&lt;p>这年头没想到像 PHP 这种古法编程语言，还能爆出这种级别的洞。不巧的是 10 月 21 日晚上 22 点，PHP 安全团队真的发了公告，&lt;strong>8.5.12、8.4.27、8.3.36、8.2.35&lt;/strong> 四个版本一起修两个未认证远程代码执行，CVSS v4.0 都是 &lt;strong>9.2&lt;/strong>，社区给它们起名字叫 &lt;code>php2shell&lt;/code>。&lt;/p>
&lt;p>据我了解，PHP 写的项目里全球用户最多的应该就是 WordPress，出海做独立站那批尤其扎堆在 WordPress + WooCommerce 上，支付、订单、会员数据全在同一个进程里。按 W3Techs 的统计，服务端语言已知的网站到现在还有接近七成跑着 PHP。再加上服务器上挂着的那些老项目，5.x、7.x 挪不动，安全更新早就断了。&lt;/p>
&lt;p>无独有偶，同一周里 Go 和 Node 也各发了一版安全更新，以前一个漏洞修起来都够呛，现在三连发，真的不让码农活命了哈哈哈。&lt;/p>
&lt;h2 id="php">PHP
&lt;/h2>&lt;p>PHP 官方把这两个 CVE 拆开写，成因不一样。&lt;/p>
&lt;p>&lt;strong>CVE-2026-109618&lt;/strong> 走的是内存耗尽这条路。PHP 在 OOM 时会从当前任务里跳出来，这时候请求内存可能只初始化了一半，后面的清理逻辑把这份残缺数据当成正常数据用，就出事了。攻击者不用找什么特殊接口，构造一个 multipart 请求、在正常大小限制内把内存逼爆就行。官方原话是这个过程 &amp;ldquo;happens entirely before any application-specific code begins execution&amp;rdquo;，在 Apache mod_php 上已经在默认限制下验证过未认证利用。&lt;/p>
&lt;p>&lt;strong>CVE-2026-109619&lt;/strong> 是跨请求的陈旧状态。worker 进程会跨请求保留一部分全局状态，某些操作访问到了上一个请求没重置干净的数据，形成堆上的 use-after-free，能拿内存泄露也能拿 RCE。这个需要两个请求落到同一个 worker 上。官方确认的路径有两条，PHP 8.5 的 fatal error backtrace 和 session 上传进度。&lt;/p>
&lt;p>两者的共同点在于请求异常结束时，PHP 把内存留在了损坏状态。这两个洞是 Calif、Wiz 和 OpenAI 的安全研究员一起找出来的。&lt;/p>
&lt;p>官方对部署方式的判断很具体，不是一刀切。Apache mod_php 被列为风险最高，有演示证明未认证请求可以在任何应用代码运行之前触发。PHP-FPM 在 109619 的 session 上传进度路径上有确认的利用，109618 那边官方只说 susceptible，没给完整的 FPM 利用。FrankenPHP 和 LSAPI 是基于源码分析的怀疑对象。&lt;/p>
&lt;p>四个分支各自对应一个新版本，对上就行。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">PHP 8.5.x → 8.5.12
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">PHP 8.4.x → 8.4.27
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">PHP 8.3.x → 8.3.36
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">PHP 8.2.x → 8.2.35
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>官方只给受支持分支发包。8.1 及更早没有官方更新，但这次给了 PHP 7.4 / 8.0 / 8.1 的最小化源码回移分支，走发行版或者自己编的话能用上。5.x 和 7.0 到 7.3 是真没有，要么找 LTS 厂商要，要么从公网摘下来。另外 PHP 8.2 分支今年 12 月 31 日 EOL，&lt;code>8.2.35&lt;/code> 是这个分支最后几个计划内的安全包之一。&lt;/p>
&lt;blockquote>
&lt;p>配置救不了这两个洞。PHP 8.6 的 release manager Joe Ferguson 说得更直白，「ini settings won&amp;rsquo;t save you」。官方 blog 里给的那些缓解措施（&lt;code>memory_limit=-1&lt;/code>、&lt;code>post_max_size&lt;/code> 调小、&lt;code>session.upload_progress.enabled=0&lt;/code>、&lt;code>fatal_error_backtraces=0&lt;/code>）只盖住部分已知路径，属于争取时间的操作，不是安全状态。&lt;/p>&lt;/blockquote>
&lt;p>这次之所以这么紧，是因为补丁在发布前就被泄了。10 月 20 日凌晨 Hacker News 上有人发帖爆料，帖子很快被删，但截图已经在社交网络上转了一圈。watchTowr 随后确认漏洞是真的，并且复现了 109618。PHP 原计划周四发版，因为细节已经流出，直接挪到了周三。补丁正式出来之前，Cloudflare 的 CTO Dane Knecht 已经在推上说 &amp;ldquo;seeing early attacks emerging&amp;rdquo;，同时给所有客户（含免费版）上了 WAF 规则，但也明确讲这只是 stopgap，而且只覆盖走 Cloudflare 的流量。&lt;/p>
&lt;p>&lt;img src="https://blog-worker.liurb.org/api/2026/10/oct-vulns-timeline-20261021-232106.png"
loading="lazy"
>&lt;/p>
&lt;h2 id="go">Go
&lt;/h2>&lt;p>CVE-2026-111943，Go 漏洞库里编号 &lt;code>GO-2026-6809&lt;/code>，10 月 21 日凌晨公开（UTC 00:52，北京时间早上八点五十多）。修复在 &lt;strong>Go 1.26.10 和 1.27.3&lt;/strong>，走的是 Go 的 URGENT 发布通道，这两个版本 10 月 20 日周二就出去了，所以严格说补丁比 CVE 记录早一天。&lt;/p>
&lt;p>补丁内容就是一份 denylist。&lt;code>crypto/x509&lt;/code> 里的 &lt;code>Certificate.Verify&lt;/code> 碰到包含这些中间证书的链，直接返回错误。&lt;/p>
&lt;p>背后是 eMudhra 那件事。八个中间 CA 的 P-384 私钥在 2025 年 4 月生成时随机性不够，值小于 256，也就是暴力试 256 次就能把私钥推出来。事后公开出来的一个键，值是 4。研究员 Wayne 在 10 月 17 日周六报给 Chrome Root Program，自证方式是拿每个密钥各签一条 &amp;ldquo;We have a problem here – Wayne&amp;rdquo;。&lt;/p>
&lt;p>浏览器的反应是小时级的。Chrome 用 1 小时 40 分推了 CRLSet 拦住六个 TLS 中间证书，Firefox 三小时内上了 OneCRL。后面几天是各家运行时和信任库跟在后面收尾。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>时间&lt;/th>
&lt;th>谁&lt;/th>
&lt;th>动作&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>10/19&lt;/td>
&lt;td>苹果&lt;/td>
&lt;td>中间证书加黑名单&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>10/20&lt;/td>
&lt;td>微软&lt;/td>
&lt;td>平台侧阻断在这天生效&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>10/20&lt;/td>
&lt;td>Go&lt;/td>
&lt;td>1.26.10 / 1.27.3 把八个证书编进 denylist&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>10/21&lt;/td>
&lt;td>Node.js&lt;/td>
&lt;td>22.23.4 / 24.22.1 / 26.12.1 拒掉含被拉黑公钥的链&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>10/21&lt;/td>
&lt;td>印度 CERT-In&lt;/td>
&lt;td>发公告，建议改信任设置、换证书&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>10/27&lt;/td>
&lt;td>Chrome&lt;/td>
&lt;td>把 &lt;code>emSign ECC Root CA - G3&lt;/code> 整个根摘掉&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>最后一行值得单独记一下，那天之后还在用这条链的正常站点也会连不上。另外 Python 的 &lt;code>certifi&lt;/code>、Rust 的 &lt;code>webpki-roots&lt;/code>、PHP 的 &lt;code>composer/ca-bundle&lt;/code> 这几天也都改了包，思路都一样，把自己那份根证书和黑名单更新掉。&lt;/p>
&lt;p>好消息是目前没看到滥用痕迹。Chrome 说在 block 之前，CT 日志里没有任何用这六个中间证书签出来的证书，看起来密钥虽然能推出来，但还没被用上。&lt;/p>
&lt;p>对 Go 程序来说，这里有个容易漏的点，&lt;strong>这道 denylist 编在工具链里&lt;/strong>。Go 在大多数平台直接读系统根证书，系统信任库更新之后链自然就断了。但在容器、精简镜像、或者自带 root store 的场景里，系统那层不一定跟得上，所以 Go 选择自己也拦一道。问题在于 &lt;code>go.mod&lt;/code> 里没有版本号可以升，&lt;code>go get -u&lt;/code> 也解决不了，只能换 toolchain 重新编译、重新发版。&lt;/p>
&lt;p>要不要现在就动，问两个问题就够了。你的服务会主动验证 TLS 吗（出站 HTTPS、webhook、gRPC、调第三方 API）？它跑的系统信任库能及时更新吗？两个都是「是」，优先级可以往后放；有一条不是，就别等下一个发版周期。&lt;/p>
&lt;h2 id="node">Node
&lt;/h2>&lt;p>Node 生态在 10 月 15 日已经有一波了，不过那波在 undici 里，编号 CVE-2026-87018。TLS 1.2 服务端在连接建立后重新协商、换一张主机名不匹配但 CA 仍然信任的证书，undici 的 socket 错误处理里有个断言认为这个错误码不可能出现，结果异常直接把进程带走。修在 6.29.1 / 7.30.1 / 8.12.2。同期还有一个 WebSocket 客户端的 HTTP/2 握手 DoS。&lt;/p>
&lt;p>10 月 21 日这波是 Node 本体，&lt;strong>22.23.4、24.22.1、26.12.1&lt;/strong>，十个 CVE，四个高危。&lt;/p>
&lt;p>四个高危里三个是校验类问题。&lt;code>dns.resolve&lt;/code> 碰到 NUL 字符会把域名截断（CVE-2026-105482）；IP 写成全角数字时 TLS 主机名验证能被绕过（CVE-2026-105483，只影响 26 和 24）；主机名能被宽松解析成 IP 地址时同样能绕过（CVE-2026-106069）。这三个要不要紧，取决于你有没有把用户输入直接送进 TLS 校验或者 DNS 解析，属于要查但不一定有。&lt;/p>
&lt;p>真正值得单独看的是 &lt;strong>CVE-2026-111497&lt;/strong>，Brotli 解码器越界写，可以导致远程代码执行，影响 22 / 24 / 26 三条线。这条的可达性有前提，Node 的 http server 不会自动解压请求体，所以不是所有服务都暴露。踩得到的是两类，一是代码里直接调 &lt;code>zlib.brotliDecompress&lt;/code>，二是用 &lt;code>fetch&lt;/code> / undici 拉外部资源、让它自动解 &lt;code>content-encoding: br&lt;/code> 的响应。前者 grep 一下就知道，后者看你有没有在信外部 URL 的内容。顺手可以用 &lt;code>zlib.brotliDecompressSync&lt;/code> 在本地复现一遍调用链，确认自己走的是哪条。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 先看有没有直接解压 Brotli&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">grep -rn &lt;span class="s2">&amp;#34;brotliDecompress&amp;#34;&lt;/span> --include&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;*.js&amp;#34;&lt;/span> --include&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;*.mjs&amp;#34;&lt;/span> --include&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;*.ts&amp;#34;&lt;/span> .
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>另外一条容易被划过去的是 &lt;strong>CVE-2026-106074&lt;/strong>。&lt;code>crypto.randomUUID()&lt;/code> 和 &lt;code>randomInt()&lt;/code> 的熵缓存会被写进 user-land startup snapshot 和 SEA，导致每个进程重复同样的随机值。如果你的服务用 SEA 打包、又拿 &lt;code>randomUUID&lt;/code> 生成 session id 或者 token，那等于所有实例共用一套随机序列。CVSS 标的是中危，实际后果比标价重。&lt;/p>
&lt;p>这版还顺手升了 c-ares、Undici、OpenSSL（24 / 22）、SQLite（22），以及把 eMudhra 那条链加入阻断，也就是拒掉含被拉黑公钥的证书链。&lt;/p>
&lt;h2 id="先动谁">先动谁
&lt;/h2>&lt;p>&lt;strong>PHP 先动，它没有前置条件。&lt;/strong> 先把版本号打出来。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">php -v
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>对照 8.5.12 / 8.4.27 / 8.3.36 / 8.2.35。低于这条线、发行版有包的直接升；还在 5.x / 7.x / 8.1 的，官方没包，一周内要么把回移包搞到手，要么先摘公网。Cloudflare 那套 WAF 规则可以先挂着，但它只盖已知向量，只对走 Cloudflare 的流量生效，别把它当解决方案。另外提醒一句，共享主机和面板托管的场景，你改不了 PHP 本体，得拿着版本号去问服务商到底什么时候上包。&lt;/p>
&lt;p>&lt;strong>Go 排第二，动作是重编译。&lt;/strong> 查的不是 &lt;code>go.mod&lt;/code>，是 &lt;code>go version&lt;/code>，以及你的 CI 用哪条 toolchain 编译。要动就是重新编译、重新发版，改依赖没用。&lt;/p>
&lt;p>&lt;strong>Node 按条件走。&lt;/strong> grep 完 &lt;code>brotliDecompress&lt;/code>、确认有没有用 SEA 打包，踩到了就跟 PHP 一起升，没有就按常规节奏。&lt;/p>
&lt;h2 id="补丁装完以后">补丁装完以后
&lt;/h2>&lt;p>Go 那个看着最轻，反而最容易做假动作，版本号填了、CI 绿了、发版记录也写了，跑的还是带旧 denylist 的二进制。要确认的是「这个二进制是哪条 toolchain 编出来的」，不是「我升到 1.26.10 了没」。&lt;/p>
&lt;p>Node 那个急不急，取决于一个很具体的问题。你有没有把别人的数据丢进 Brotli 解压器？有这个动作的，跟 PHP 一起处理；没有的，按常规节奏跟。&lt;/p>
&lt;p>还有一件比这三个都靠后的事。10 月 27 日 Chrome 会把 &lt;code>emSign ECC Root CA - G3&lt;/code> 整个根摘掉。那天之后如果有人来找你，说某个第三方接口突然报 TLS 错误，先想想是不是这条链，别第一反应去关证书校验。&lt;/p>
&lt;!--
配图清单（共 2 条）
代码绘制（dj-blog-image-gen，落 out/，pub 后压到 1280 宽）：
1. oct-vulns-timeline php2shell 从泄露到发版的时间线 → 「php2shell」段末尾，已插入，URL 见正文
封面：
· oct-vulns_cover PIL 绘制 1280×720，已落 static/images/posts/2026/，frontmatter 已填
--></description></item></channel></rss>