资讯 PHP 8.5.11 安全修复:SAN 不匹配回退 CN、FPM IPv6 ACL 绕过与 HTTP wrapper 凭据泄露

2026-10-30 21:04:20

PHP 8.5.11 安全修复:SAN 不匹配回退 CN、FPM IPv6 ACL 绕过与 HTTP wrapper 凭据泄露

PHP 8.5.11(2026-09-24)的 changelog 里有一批安全条目,集中在 OpenSSL 主机名校验、FPM 的 IPv6 ACL、HTTP stream wrapper 重定向和 phar TAR 解析。下面按模块记录每处问题、影响范围,以及能用命令验证的自查点和升级后的行为变化。

OpenSSL:SAN 不匹配后回退比对 CN(CVE-2026-91769)

GHSA-vvx9-73fr-5jjx:TLS 主机名验证在证书 SAN 与目标主机名不匹配之后,会回退去比对 CN。后果是:一张 SAN 里写的是别的主机名、CN 却恰好匹配的证书,在旧版本上能通过校验;只要服务端能出示这种证书(或能签发这种证书),就能冒充目标站点。

同一模块还修了 CVE-2026-91767(GHSA-xr7j-rvgx-xq5p):php_openssl_matches_wildcard_name() 在构造的通配符 CN 上发生堆缓冲区溢出。

自查:

# 看证书的 SAN 与 CN 是否一致
openssl s_client -connect example.com:443 -servername example.com </dev/null 2>&1 \
  | grep -E "Verify return code|subject="
openssl x509 -in cert.pem -noout -subject -ext subjectAltName

如果 SA N 里根本没有 DNS: 项,或者 SAN 与 CN 指向不同主机名,这类证书正好是旧逻辑下的可乘之机。

升级到 8.5.11 后:SAN 不匹配直接判定验证失败,不再回退 CN。依赖旧回退行为的老证书(只有 CN、没有 SAN)需要重新签发并补上 SAN 条目。

FPM:listen.allowed_clients 的 IPv6 ACL 被绕过(CVE-2026-91768)

GHSA-62xp-839h-2637:FastCGI 在比较 listen.allowed_clients 时地址前缀比较不完整,IPv6 客户端因此可以绕过白名单连接到 FPM 端口。

自查:

php -i | grep -i 'listen.allowed_clients'
php-fpm -tt 2>&1 | grep -i 'listen.allowed_clients'
grep -rn "listen.allowed_clients" /etc/php* /usr/local/etc/php-fpm.d/ 2>/dev/null

只要 pool 配的是 TCP listen 且 allowed_clients 里出现 IPv6 地址(含 ::1),就属于需要升级的情况。升级后前缀比较完整,白名单按完整地址匹配;之前"看起来配了但实际放行"的 IPv6 条目会开始真正生效。

同版本还修了 GH-19320(FPM UID 和 GID 溢出)。

Phar:phar_tar_number() 整数溢出(CVE-2026-6103)

GHSA-j3wh-g957-2m85:TAR 归档条目数字字段的整数溢出,可导致条目注入——用畸形 TAR 就能让解析结果里出现攻击者构造的条目。

grep -rn --include=*.php -E "new PharData|extractTo\(|Phar::tar" .

凡是把外部上传或下载的 TAR 交给 PharData 处理的路径都要检查一遍。同模块另修 GH-23418(查找挂载目录时的 use-after-free)与 GH-23477(重复 native manifest 条目上的内存泄漏)。

SOAP:cleanup_xml_node() 无界递归(CVE-2026-91765)

GHSA-rgrp-mwpx-f6rm:服务端 cleanup_xml_node() 递归无上界,深构造的 XML 可打到栈溢出。同一批还有 CVE-2025-14181(SOAP HTTP 解析中整数溢出转为缓冲区溢出)、解析自引用 schema group / attributeGroup 的 WSDL 时的栈溢出,以及 soap:header 定义 headerfaults 时的 WSDL 缓存损坏。

grep -rn --include=*.php -E "new SoapServer|new SoapClient" . | grep -i wsdl

WSDL 来自外部输入、或 SOAP 服务直接暴露在公网的,是主要暴露面。

流包装器与 Standard:跨源重定向泄露凭据(CVE-2026-91766)

GHSA-fpwc-w8rq-cr92:HTTP stream wrapper 在跟随重定向时不区分源,原本发给 A 站点的凭据会被带到重定向目标 B 站点。

grep -rn --include=*.php -E "follow_location|http\[|'header'\s*=>" .

重点看用 stream_context_create() 手工塞 Authorization/Cookie 头、同时又开了 follow_location 的调用。升级后跨源重定向不再把原凭据带过去;确实要带,得在目标请求上显式重新设置 context。

同模块另有几条越界与崩溃修复:

  • CVE-2026-92842(GHSA-88hq-2827-7pg6):convert.* 过滤器在 line-break-chars 含 NUL 时越界读。
  • CVE-2026-93682(GHSA-7875-c8px-7q5f):跟随 Location 为空的重定向时越界读。
  • stream filter 回调在重新挂载 bucket 前 unset StreamBucket::$data 导致的段错误;php_stream_filter_flush() 的读缓冲压缩。
  • GH-22410(大数浮点行为错误)、GH-23338(fsockopen()/pfsockopen() 的 $timeout 报错参数编号错)、GH-23576(array_keys() 返回数组的下一个索引错误)。

Windows、MySQLnd

  • CVE-2026-17545(GHSA-9f67-6fw4-hpfp):保留设备名在文件和流 I/O 之前未被拒绝。
  • CVE-2025-1218(GHSA-r6x9-5r99-36j7):mysqlnd 线协议中的多处报文越界读。

其他模块

  • Zlib:inflate_init() 对非默认窗口的 raw 流丢失预设字典。
  • Intl:grapheme_strpos() / grapheme_strrpos() 在空 needle 下返回 UTF-16 偏移而非 grapheme 偏移。
  • Session:mod_mm 数据损坏;GH-23043(错误的 session id 代码可导致 zend_mm_heap corrupted)。
  • PCRE:GH-21134(\C + UTF-8 崩溃)。行为变更:UTF-8 模式下使用 \C 现在被禁止,相关正则需要改写。
  • Zip、ODBC、Exif(libgd 升级,CVE-2026-9672)、BCMath(bccomp 越界写,CVE-2026-17544)在 8.5.9/8.5.11 这条线上一并修复。

8.5.12(2026-10-22)顺带修的两处

  • Core:GHSA-w8hw-w9fx-j79w、GHSA-6wmf-4rv5-p3rp,避免 bailout 造成状态损坏。
  • OpenSSL:stream_socket_enable_crypto() 在握手超时后把套接字留在非阻塞状态;Windows 上收到 close_notify 后 feof() 仍返回 false。

版本判断与升级后的行为变化

php.net 的 ChangeLog-8 显示 8.5.x 是当前维护分支,修复会按适用情况回合到 8.4/8.3。就 8.5 线而言,8.5.11 之前的 8.5.x 都在这批问题的影响范围内;8.4/8.3 的具体修复版本以对应分支的 changelog 为准。

升级到 8.5.11 后需要留意的行为变化:

位置升级前升级后
OpenSSL 主机名校验SAN 不匹配后回退比对 CN直接失败,无 CN 回退
FPM allowed_clientsIPv6 前缀比较不完整,可绕过完整比较,白名单真正生效
HTTP wrapper 重定向凭据跟到跨源目标跨源不再带回原凭据
PCRE UTF-8 模式\C 可用被禁止,需改写模式

上线前建议按上面的 grep 把证书签发、FPM pool 配置、WSDL 来源、TAR 处理和带凭据的重定向请求各过一遍。

复制全文 生成海报 PHP 安全公告 OpenSSL FPM

推荐文章

程序员茄子在线接单