PHP2Shell漏洞修复教程:PHP/Node.js/Go紧急升级指南(10月21日)

智谱
AI 正在加载摘要

10月21日安全事件全记录:PHP2Shell 紧急补丁、Node.js 高危漏洞、Go 移除被攻破的 CA 证书

过去 48 小时,PHP、Node.js、Go 三大语言生态同时发布紧急安全更新,根源之一是一个”私钥只有 1 字节”的证书机构事故。本文梳理完整时间线,并给出自查与升级清单。

QQ20261022-002907_compressed

一句话时间线

时间事件
10 月 17-20 日证书机构 eMudhra 中间证书私钥被证实可被重建,Chrome/Apple/Microsoft 相继拉黑
10 月 20 日Go 发布 1.27.3 / 1.26.10,从信任库移除问题 CA;Firefox 紧急发版
10 月 21 日PHP 紧急发布非计划补丁,修复两个 CVSS 9.2 的 RCE(PHP2Shell);Node.js 发布安全更新


一、证书机构 eMudhra 事故:私钥只有 1 字节

这是本轮事件的”震中”,也是整个互联网基础设施层面的事故。

发生了什么: 印度证书机构(CA)eMudhra 的 8 个中间证书私钥被研究人员从公开数据中重建出来。原因是密钥生成时用了小于 256 的整数初始化,而不是密码学安全随机数——P-384 椭圆曲线私钥本该是 48 字节,实际只有 1 字节有效。

8 个私钥的值分别是:4、56、66、115、155、156、230、237。不需要暴力破解,把 0 到 255 枚举一遍就全出来了。

为什么严重: 持有中间证书私钥的人,可以为任何网站签发”合法”的 TLS 证书。也就是说,攻击者可以对任意 HTTPS 站点实施中间人攻击,浏览器的小锁完全失效。

各方响应速度:

    • Chrome/Google 产品:10 月 17 日已屏蔽

    • Apple:10 月 19 日屏蔽

    • Microsoft:10 月 20 日屏蔽

    • Firefox:10 月 20 日发布 158.0.1 / 153.5.1 / 115.43.1,更新 NSS 3.131.1

    • 各 Linux 发行版(Ubuntu/Debian/Arch/Gentoo)陆续更新 ca-certificates 包

    • Python certifi、Electron、RustTLS、curl、Go 同步更新

事件详情页(可自测浏览器是否已更新):https://emudhra.we-have-a-problem.com/


二、Go:1.27.3 / 1.26.10 专为此事发布

10 月 20 日 Go 发布两个小版本,唯一的安全修复就是这件事:

crypto/x509: mitigation for security concerns with a specific Certificate Authority。Verify 将过滤掉包含这些中间证书的信任链。

对应 CVE-2026-111943。Go 官方原话是”强烈建议立即升级”。

升级:

# 检查当前版本
go version

# 官方下载页:https://go.dev/dl/
# 目标版本:go1.27.3 或 go1.26.10


三、PHP2Shell:两个 CVSS 9.2 的 RCE,紧急补丁

10 月 21 日,PHP 发布非计划安全更新,修复两个远程代码执行漏洞:

    • CVE-2026-109618:内存分配失败后,清理例程处理了无效数据

    • CVE-2026-109619:PHP worker 复用了上一个请求的陈旧状态

两个漏洞 CVSS v4.0 评分均为 9.2(Critical)。

几个关键事实(Datadog Security Labs 已独立复现确认):

    1. 应用层认证拦不住。恶意请求在到达任何应用代码之前就被 PHP 处理了——即使你的代码只有一个 echo,站也一样被打。

    1. 不需要爆破、不需要崩溃。攻击者可以用校准的内存布局加几个预备请求绕过 ASLR。

    1. 社区流传的缓解措施无效。比如设置 session.upload_progress.enabled=0,实测挡不住。只有打补丁这一条路。

    1. 漏洞利用代码在补丁发布前已提前泄露,PoC 已经公开,随时会被大规模扫描。

受影响的版本与修复版本:

版本线状态
PHP 8.2升级到 8.2.35
PHP 8.3升级到 8.3.36
PHP 8.4升级到 8.4.27
PHP 8.5升级到 8.5.12
PHP 5.x – 8.1同样受影响,但已 EOL(停止维护),没有补丁,必须升级大版本

自查:

php -v

版本低于上表修复版本的,立即升级。下面按部署环境分开给命令。

① 宝塔面板(最常见):

软件商店 → 搜索 PHP → 安装修复版本(如 PHP 8.3.36 / 8.4.27)→ 网站 → 设置 → PHP 版本切换到新版。切换后检查站点是否报错,老 WordPress 主题/插件如果只兼容旧版 PHP,先在测试环境验证再切。

② Ubuntu / Debian(apt 安装的 PHP,用 ondrej 仓库):

# 查看当前版本
php -v

# 添加 ondrej 仓库(Ubuntu 22.04/24.04 通用)
sudo add-apt-repository ppa:ondrej/php
sudo apt update

# 安装修复版本(以 8.3 为例,对应 8.2/8.3/8.4/8.5 改数字即可)
sudo apt install php8.3 php8.3-fpm php8.3-cli php8.3-mysql \
  php8.3-gd php8.3-mbstring php8.3-xml php8.3-curl php8.3-zip

# 重启 PHP-FPM 生效
sudo systemctl restart php8.3-fpm
# Apache 用户则重启 Apache:sudo systemctl restart apache2

③ CentOS / RHEL / Rocky / AlmaLinux(Remi 仓库):

# EL9 用 9,EL8 把 9 换成 8
sudo dnf install epel-release
sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-9.rpm

# 重置 PHP 模块并装修复版本(8.3 为例)
sudo dnf module reset php
sudo dnf module install php:remi-8.3

sudo systemctl restart php-fpm

④ lnmp.org / oneinstack 一键包:

# lnmp.org(进入安装目录,按提示选版本号)
cd ~/lnmp2.x && ./upgrade.sh php

# oneinstack
cd ~/oneinstack && ./upgrade.sh

⑤ 编译安装的 PHP: 无法原地升级,用新源码按原 configure 参数重新编译再替换。原参数用 php -i | grep configure 能翻出来。

⑥ Docker / 容器环境:

# 镜像 tag 固定到修复版本并重建,例如 php:8.3-fpm → php:8.3.36-fpm
docker compose down && docker compose up -d --build

⑦ Windows 直接跑的 PHP: 去 windows.php.net 下载修复版本 zip,备份 php.ini 后覆盖替换。

⑧ 虚拟主机用户: 联系服务商升级,这是他们的责任;不给升的赶紧换——PHP 5.x~8.1 连补丁都没有,PoC 已公开,随时被批量扫描打点。

被入侵的排查线索: 异常大的表单提交记录、请求初始化阶段的内存耗尽报错、服务器上出现来源不明的 shell 进程。


四、Node.js:一次修了 10 个漏洞,含一个 RCE

10 月 21 日 Node.js 发布安全更新,覆盖 26.x / 24.x / 22.x 三个版本线:

    • v22.23.4(LTS)

    • v24.22.1(LTS)

    • v26.12.1(最新)

重点关注的高危项:

CVE问题级别
CVE-2026-111497Brotli 解码器越界写入,可导致远程代码执行High
CVE-2026-105482dns.resolve 截断含 NUL 字符的域名High
CVE-2026-105483IP 写成全角数字时 TLS 证书主机名校验被绕过High
CVE-2026-106069主机名宽松解析为 IP 时 TLS 证书校验被绕过High

另外还有个比较有意思的中危:CVE-2026-106074——crypto.randomUUID() 和 randomInt() 的熵缓存被存进了启动快照,导致每个进程重复生成相同的”随机”值。如果你用到了 Node 的 startup snapshot / SEA 打包,随机数可能一直是同一串。

本次更新还同步修复了 eMudhra CA 的证书信任问题。

升级:

node -v

# nvm 用户
nvm install 24.22.1 --reinstall-packages-from=current

# 直接安装用户去官网下载对应版本
# https://nodejs.org/en/blog/vulnerability/october-2026-security-releases


五、普通用户和站长该做什么

普通用户:

    1. 更新浏览器(Chrome/Edge/Firefox/Safari 全都发了相关更新);

    1. 可以用 https://emudhra.we-have-a-problem.com 检测浏览器信任库是否已更新。

站长/服务器:

# 1. PHP(最紧急,PoC 已公开;各环境升级命令见上文第三节)
php -v    # 低于 8.2.35 / 8.3.36 / 8.4.27 / 8.5.12 立即升级

# 2. Node.js
node -v   # 目标 22.23.4 / 24.22.1 / 26.12.1

# 3. Go
go version    # 目标 1.27.3 / 1.26.10

# 4. 系统 CA 证书(按发行版选对应命令)
# Ubuntu / Debian
sudo apt update && sudo apt install --only-upgrade ca-certificates

# CentOS / RHEL / Rocky / AlmaLinux / Fedora
sudo dnf update ca-certificates   # 老系统:yum update ca-certificates

# Arch Linux
sudo pacman -Syu ca-certificates-mozilla

# openSUSE
sudo zypper update ca-certificates-mozilla

# Alpine
apk update && apk upgrade ca-certificates

# macOS(Homebrew)
brew update && brew upgrade ca-certificates

系统 ca-certificates 包还没出更新时的应急方案(手工拉黑两张问题证书):

# Debian / Ubuntu:屏蔽 emSign ECC Root CA G3 与 Comodo AAA Services root
sudo sed -i \
  -e 's|^mozilla/emSign_ECC_Root_CA_-_G3.crt|!&|' \
  -e 's|^mozilla/Comodo_AAA_Services_root.crt|!&|' \
  /etc/ca-certificates.conf && sudo update-ca-certificates

验证系统信任库是否已修复:

# 1. 看 ca-certificates 包版本(Ubuntu 修复版为 20260816ubuntu0.2*.04.1,Debian 为 20250419+deb13u1)
dpkg -l ca-certificates

# 2. 确认问题证书已从信任库移除(输出为空 = 已移除)
awk -v cmd='openssl x509 -noout -subject' '/BEGIN/{close(cmd)};{print | cmd}' \
  < /etc/ssl/certs/ca-certificates.crt 2>/dev/null \
  | grep -iE 'emSign ECC Root CA - G3|Comodo AAA Services root' || echo "OK: 问题证书已不在信任库"

# 3. 浏览器侧自测:https://emudhra.we-have-a-problem.com/

开发者的 CI/构建环境同样要检查:Docker 基础镜像里的 PHP/Node/Go 版本、公司内部服务、客户部署的环境,都在受影响范围内。


总结

这一波事件的教训其实就一条:密钥生成必须用真正的密码学安全随机数。eMudhra 用 1 字节”随机数”生成了中间证书私钥,直接动摇了一整条信任链,逼得浏览器厂商、操作系统、Go/Node/Python 全部紧急发版。而 PHP2Shell 再次证明:语言本身的历史包袱(PHP 5-8.1 全部无补丁)在关键漏洞面前就是定时炸弹。

如果你的服务器还在跑旧版本 PHP,今天就是升级的日子,别等。


参考来源

------本页内容已结束,喜欢请分享------

感谢您的来访,获取更多精彩文章请收藏本站。

© 版权声明
THE END
看完了?看完了愣着啊点赞干什么
点赞46 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容