2026 年 10 月 21 日,五起独立的高危安全事件在 24 小时内集中披露:一个国家级 CA 的私钥弱到可以暴力猜出、PHP 全版本被曝远程代码执行、Node.js 与 Go 各自修复证书校验缺陷、LiteLLM 发布被投毒的版本。
本文逐条核实了公开信息源,包括官方公告、CISA/ENISA/CERT-EU 的联合声明、Cloudflare 与 Sansec 的技术分析。传闻与事实有出入的地方,文中会指出。
一、eMudhra:弱到可以猜的 CA 私钥
印度证书机构 eMudhra 的八张中间证书私钥被判定为可破解级别。
关键点:这些私钥的熵值远低于应有的 384 位。有分析指出其中一张的私钥整数小到可以用单个数字概括,这也是传闻里”用 4 当私钥”的由来。实际披露的八张证书里,至少有一张的密钥强度属于可暴力枚举的范围。
影响范围:八张中间证书分别挂在 emSign Root TLS CA - G3(六张)与 emSign Root CS CA - G3(两张)之下,覆盖 DV、OV、EV 三类签发。持有私钥的攻击者可以为任意域名伪造证书,中间人劫持 HTTPS 流量。
时间线:
| 时间 | 事件 |
|---|---|
| 10 月 18 日 | CCADB 吊销日志标记八张证书为 cACompromise |
| 10 月 19 日 17:00 UTC | Cloudflare 确认私钥泄露 |
| 10 月 20 日 | Cloudflare、Ars Technica 等公开分析 |
| 10 月 21 日 | 各语言运行时与浏览器跟进吊销 |
二、PHP2Shell:5.4 之后全版本 RCE
CVE-2026-109618 与 CVE-2026-109619,均评为 CVSS v4.0 9.2。
影响范围:所有运行 PHP 5.4 及以后版本的 Web 服务器。缺陷在 PHP 引擎本身,因此即使应用代码是干净的,Magento、Shopware、WooCommerce 等也会被波及。
Sansec 确认的未认证 RCE 目标包括:
1 | Magento 2.4.9 WordPress 7.1.2 Drupal 11.4.3 |
漏洞工具 PHP2Shell 把两个缺陷组合成一个不需要登录的攻击链。
修复状态:
- PHP 官方只维护 8.2 及以上。8.1 及更旧版本没有官方补丁,需要发行版回填或升级。
- 10 月 21 日发布当天,Remi 仓库(RHEL 系常用)未同步更新。
- Cloudflare 在 07:43 UTC 就观测到攻击尝试,早于 14:00 UTC 的正式发布。
临时缓解:所有已知触发点都是 multipart/form-data 请求,可在 Web 服务器层直接拒绝这类请求。这是权宜之计,不是修复。
关于”上游补丁被入侵”的传闻:目前没有公开证据支持。能确认的是 Remi 仓库当天未发布更新,以及官方不再支持旧版本。建议通过 php.net 官网或发行版官方源获取补丁,不要从第三方镜像拉取。
三、Node.js Brotli 解码器越界写入
CVE-2026-111497,高风险。
Brotli 解压过程中的越界写入,可导致远程代码执行。攻击面是任何解压攻击者可控数据的 Node.js 进程,例如接收压缩请求体的 HTTP 服务器。
修复版本:
1 | Node.js 22.23.4 |
同批发布的还有九个 CVE,其中三个高危与 TLS 证书主机名校验相关(Unicode 全角数字绕过、松解析 IP 绕过、非规范 IPv4 主机名认证绕过)。这批修复也同步更新了 eMudhra 相关证书的信任处理。
四、Go 的证书吊销:硬编码黑名单
CVE-2026-111943,影响 crypto/x509 的 Certificate.Verify。
问题:Go 在多数平台使用系统根证书,但在某些场景下系统信任库不会自动更新,导致已被吊销的中间证书仍被接受。
修复方式:在标准库里加了一张硬编码的 SPKI 哈希表。命中八张 eMudhra 中间证书中的任意一张,Verify 直接返回错误。
1 | // src/crypto/x509/verify.go |
两个设计细节值得注意:
- 按 SPKI 哈希匹配,所以即使重新签发、换了序列号,只要沿用同一密钥对仍会被拒绝。
- 遍历整条链而非只看叶子证书。
对 Darwin 和 Windows,Go 会在操作系统已经构建出”有效”证书链之后,再把它整条丢弃。
修复版本:go1.27.3 与 go1.26.10。
关于”不执行实时证书吊销”:这个说法需要更精确。Go 长期不做 OCSP 或 CRL 实时查询,这是因为实时吊销查询本身有隐私与可用性问题,业界普遍如此。本次的问题是这个策略在 eMudhra 这种极端场景下失效了,于是用黑名单兜底。黑名单确实不优雅,但它针对的是八张已知的证书,不是启发式规则。
五、LiteLLM 供应链投毒
litellm==1.107.0 被植入恶意代码,通过 PyPI、Docker Hub、GHCR 三个渠道分发。
时间窗口:
| 渠道 | 受影响版本 | 时间 |
|---|---|---|
| PyPI | 1.107.0(全部七个 wheel) | 11:39 – 13:23 UTC |
| Docker Hub | v1.107.0 / latest / main-latest / main-stable | 11:46 – 14:20 UTC |
| GHCR | 同上 | 11:46 – 13:51 UTC |
恶意行为:窃取凭据,并加载远程代码执行工具(每小时轮询)。
关键细节:GitHub 上 v1.107.0 的源码 tag 本身是干净的,恶意产物是从攻击者控制的仓库构建的。也就是说,只对源码做审计无法发现这次投毒。
影响判定:在 11:39 到 13:23 UTC 之间通过 pip 安装未锁定版本、或拉取上述 Docker 镜像的部署受影响。企业私有发行版不受影响。AISLE 在包发布 3 分钟后即检出。
LiteLLM 在 20:30 UTC 通报已定位攻击链,需要攻破多个独立安全控制才能实施。
六、几条流传的说法与核实结果
| 说法 | 核实结果 |
|---|---|
| 印度 CA 用”4”当私钥 | 部分属实。八张证书私钥熵值严重不足,其中至少一张小到可用单个数字概括 |
| PHP 5.4 起全版本高危 | 属实。CVE-2026-109618/109619,CVSS 9.2,未认证 RCE |
| PHP 旧版本没有补丁 | 属实。官方仅维护 8.2+,8.1 及更旧需靠发行版回填 |
| Node.js Brotli 越界写入可 RCE | 属实。CVE-2026-111497 |
| Go 用硬编码黑名单修证书校验 | 属实。八条 SPKI 哈希,go1.26.10 / go1.27.3 |
| LiteLLM 维护者账号被攻破 | 属实。1.107.0 在三个渠道被投毒,约两小时窗口 |
| PHP 上游补丁本身被入侵 | 未获证实。目前可确认的是 Remi 仓库当天未发布更新 |
| 早苗发文建议升级 PHP | 未能核实该推文,账号与内容均无法确认 |
七、需要立刻做的事
PHP 服务器
1 | php -v # 确认版本 |
无法立即修复的,先在 nginx/Apache 层拒绝 multipart/form-data。
Node.js
1 | node -v |
Go
1 | go version |
LiteLLM
1 | pip show litellm # 若为 1.107.0 立即处理 |
如果曾在上述时间窗口内运行过 1.107.0,需要轮换该环境中所有凭据。
通用
- 检查系统与语言的根证书信任库是否已更新
- 浏览器与操作系统打上 eMudhra 相关吊销更新
- 对锁定依赖版本这件事,重新评估”不锁”的风险
写在最后
这五件事有一个共同点:问题都不在使用者的代码里。
CA 的问题在信任链的起点,PHP 的问题在引擎,Node.js 和 Go 的问题在标准库,LiteLLM 的问题在构建流程。任何一层出问题,上层写再好的代码也没用。
也正因如此,这类事件的应对方式是固定的:尽早升级、锁定依赖、监控上游。没有捷径。
参考
- Cloudflare Blog: 8 eMudhra certificates are compromised
- Sansec: PHP2Shell – CVE-2026-109618, CVE-2026-109619
- CISA / ENISA / CERT-EU: Joint statement on critical PHP vulnerabilities
- Node.js: October 2026 Security Releases
- Go: GO-2026-6809 / CVE-2026-111943
- LiteLLM: Contained – Oct 21, 2026 release v1.107.0 Compromised
- Datadog Security Labs / StepSecurity / AISLE: LiteLLM supply chain analyses