10 月 21 日 14:00 UTC,PHP 发布 8.5.12、8.4.27、8.3.36、8.2.35,修掉两个不需要账号就能触发的远程代码执行漏洞,编号 CVE-2026-109618 与 CVE-2026-109619。1 同一天,三份档案写下三个答案:9.2、9.8、和一句「没有观察到利用」。
它们被排进同一条右对齐的数字列——NVD 的页面上就是这样排的。看过一眼的人多半会留下印象:这是同一个洞的三种说法。这一期想说的是,它们量的不是同一件事;而决定你今晚要不要动手的,还不是这三个数里的任何一个。
9.2 是写补丁的人给的
PHP 是这两枚 CVE 的编号授予方(CNA)。它给的是 CVSS 4.0 的 9.2,向量里有两个字段值得看:攻击复杂度 AC 记 HIGH,攻击前提 AT 记 PRESENT。2
AT 是 4.0 才加进来的一格。FIRST 的定义是:成功攻击取决于目标系统特定的部署或执行条件;规范举的例子之一是必须赢下一次竞态。3 放到这个漏洞上,条件是这样的:请求要正好在内存上限那一刻被打断,PHP 才会把没初始化完的内存当成有效数据来清理。触发要靠时机,不是靠参数。
9.8 是没写补丁的人给的
NVD 在 14:17 UTC 建档,用 CVSS 3.1 给出 9.8,攻击复杂度记 LOW。它把自己的这一条标为 Primary,把 PHP 的 4.0 那条标为 Secondary。2
后果很具体:所有从 NVD 拉数据的扫描器、工单系统和仪表盘,显示的都会是 9.8。写补丁那一方的分数,在系统里是次要来源。
3.1 的向量里没有 AT 这一格,NIST 的选择是把复杂度记成 LOW。NVD 的记录里没有一句解释为什么——PHP 的公告写了整段机制说明,Red Hat 写了整段部署说明,NVD 只有分和向量。24
8.1:同一个版本,另一种部署
Red Hat 用的也是 3.1,向量和 NIST 那条只差一个字段:AC 记 HIGH,得分 8.1。4 它在 Statement 里写得很清楚:可靠利用需要精确的堆布局与时机;而红帽企业版默认跑 PHP-FPM 而不是 mod_php,FPM 在请求初始化失败时会直接退出子进程,远程利用在实践中很难。它同时写着,缓解措施要么没有,要么不满足红帽的产品安全标准。
两者的差别只在这一格,值 1.7 分。那条向量的其余七个字段和 NIST 完全一致。
三个数不能横着比
FIRST 在 4.0 规范里唯一相关的表述是:4.0 的定性严重等级边界与 3.x 保持兼容。3 规范没有说两个版本的数值可以互相比较。换句话说,9.2 和 9.8 之间那 0.6,既不是「更严重」,也不是「更宽松」,是两把不同的尺子各量了一次。
那一格不是分数
CISA 在 NVD 里留下的第三样东西不是分数。它是一条 SSVC 记录,时刻精确到毫秒——14:34:39.479770Z,北京时间 22:34——三个字段:exploitation=none、automatable=no、technicalImpact=total,角色一栏逐字写着 CISA Coordinator。25
这三个字段拼不出一个结论。按 CISA 自己的说明,它的决策树要看五个值——利用状态、技术影响、能否自动化、任务普遍性、公共福祉影响——最后落到 Track、Track*、Attend、Act 四档。6 前三个在记录里,后两个不在。把这三个字段换算成某个分数或某个档位的做法,都是换算的人自己加的。
同一天,两种语言
CISA 当天还发了一份告警。它写:「虽然 CISA 在发布时尚未观察到这些漏洞被利用,但如果放任不打补丁,它们会对组织构成风险。」接着要求:立刻打,优先公网系统;打不了的,或者还在用 8.1 及更早版本的,「在能打上补丁之前,把基于 PHP 的系统下线」。7
同一天、同一个机构,一边在档案里记「没有观察到利用」,一边下令下线。这两句话并不矛盾,因为它们回答的不是同一个问题:前一句说的是它看到了什么,后一句说的是你该怎么办。
KEV 目录那天也生成过一次:catalogVersion 2026.10.21,时刻 14:04:39Z,1754 条,两枚 CVE 都不在里面。8 这张表收的是「已被在野利用」的漏洞;不进表,就没有可引用的在野利用证据。
流传最广的那个数字
泄露发生的时候,跟着两个 CVE 编号一起传的是一个 10.0。PHP 基金会的复盘点名说,那是「一个错误的 CVSS 分数(实际是 9.2)」。9 它不属于任何一份评分表:没有授予方,没有向量,没有版本。
同时传开的还有一条临时措施:关掉 session.upload_progress。这条措施属于另一个 CVE——它封的是 109619 的会话生命周期路径,109618 那份公告里根本没提会话。公告给 109618 的第一条措施反而看着像在降低安全性:把 memory_limit 设成 -1,并确认没有池子把它改回去;同时明确不要用 RLIMIT_AS,因为那会让分配失败,正好走回那条老路。101112
谁真的提前动了手
真正在公开之前就已经对全部客户默认生效的那一层,是三份官方文件里唯一没有署名的一层。
PHP 基金会的复盘点名了 Calif、Wiz、OpenAI、OSTIF、Quarkslab,以及单方面提前解禁的 Chainguard,没有一家 CDN。9 CISA 的告警只写了一句「web application firewall 可能提供一些保护」,没有一个厂商名。7 把这件事写清楚的,是 Cloudflare 自己的博文:规则在免费版上也默认生效,用户不必做任何操作。13
怎么用
这一期剩下的只有三句话。
第一句:今晚要不要动手,不看分数看分支。8.1 及更早没有官方补丁,CISA 的原话是把系统下线,等能打上再说。
第二句:临时措施抄公告的第一条,不抄转得最广的那条。memory_limit 设成 -1 并确认没有池子改回去;RLIMIT_AS 不要用。
第三句:翻不翻日志,看你怎么引用。CISA 记「未观察到利用」,Cloudflare 记「观察到针对客户的攻击流量」——两句都可以是真的,能写进你报告的是前一句。
边界
CISA 的「尚未观察到」只代表它自己的观测面与那一刻,它没有说没人被打。Cloudflare 的博文说它观察到针对客户的攻击流量,两者并不冲突。
NVD 那条记录在 17:18 UTC 又被改过一次,改了什么没有公开说明;SSVC 是发布 34 分钟后的快照,之后没有更新记录。NIST 为什么把复杂度记成 LOW,公开文本里找不到理由。
Red Hat 的 8.1 是产品口径,只覆盖它自己发布的版本;不跑 RHEL 的人不能直接套用。PHP 一侧的 9.2 与 NIST 一侧的 9.8 也不能直接相减。
能确定的是:同一天里,同一对漏洞得到过 9.2、9.8、8.1 和三个 SSVC 字段四份记录;流传最广的 10.0 不属于其中任何一份;唯一提前对所有人生效的那层防护,不在任何一份官方文件的署名里。
References
- 1
- 2CVE-2026-109618 · NVD
services.nvd.nist.gov
- 3
- 4CVE-2026-109618 · Red Hat
access.redhat.com
- 5CVE-2026-109619 · NVD
services.nvd.nist.gov
- 6
- 7
- 8
- 9
- 10RCE via OOM corruption · php/php-src
github.com
- 11RCE via stale global state · php/php-src
github.com
- 12
- 13Cloudflare deploys protections against php2shell vulnerability · Cloudflare
blog.cloudflare.com


Comments