php-fpm 的 listen.allowed_clients 本意是只允许白名单内的客户端连接 fastcgi 端口,但 ghsa-62xp-839h-2637 公告显示:实现中对地址做了部分比较(memcmp 只比较前 12 字节),攻击者可以构造特定 ipv6 地址绕过 acl 限制,评级 moderate。

▲ 事件来源页面实时截图:php/php-src Security Advisories
谁受影响
同时满足两个条件的部署:使用 PHP-FPM 且 allowed_clients 配置依赖 IPv6 白名单。只做内网监听或使用 Unix socket 的实例不受影响。
处置
升级至 9 月批次及以后的版本;在升级前可以临时改为 TCP 端口加防火墙规则的双重限制,降低对单一 ACL 的依赖。
只比较 96 位带来的后果
FastCGI 客户端的 IPv6 访问检查在比较地址时只看前 12 字节,而 IPv6 地址是 16 字节,等价于把「精确地址匹配」放宽成了「/96 前缀匹配」。攻击者只要源地址与前 96 位与允许地址相同(同一 /96 网段内即可构造),就能通过检查直达 FastCGI 进程。
修复与部署注意
修复改为比较完整 16 字节地址。部署时注意:listen.allowed_clients 里若配置了宽松网段,应同步收紧;FPM 端口不要暴露在公网,配合 unix socket 或本地回环绑定;升级后重启 FPM 使配置与代码同时生效。
修复补丁(官方提交)
该问题由 php-src 官方提交 dcdfcf86fcf7 修复(2026-08-25),提交说明为「Fix GHSA-62xp-839h-2637: FastCGI allowed_clients compared only 96 bits of IPv6 addresses」。改动涉及 3 个源码/测试文件,核心变更如下:
main/fastcgi.c
@@ -1340,7 +1340,7 @@ static int fcgi_is_allowed(void) {
if (client_sa.sa.sa_family == AF_INET6) {
for (i = 0; allowed_clients[i].sa.sa_family ; i++) {
if (allowed_clients[i].sa.sa_family == AF_INET6
- && !memcmp(&client_sa.sa_inet6.sin6_addr, &allowed_clients[i].sa_inet6.sin6_addr, 12)) {
+ && !memcmp(&client_sa.sa_inet6.sin6_addr, &allowed_clients[i].sa_inet6.sin6_addr, sizeof(client_sa.sa_inet6.sin6_addr))) {
return 1;
}
#ifdef IN6_IS_ADDR_V4MAPPED
▲ 补丁片段摘自 php-src 官方仓库该提交
完整补丁与测试用例可在 php-src 仓库该提交页面查看:https://github.com/php/php-src/commit/dcdfcf86fcf7f42fa98dd3d000f310ebdad41965

▲ 官方公告页配图

▲ 官方修复提交页面截图
关键信息
| 项目 | 内容 |
|---|---|
| 类目 | 安全漏洞 |
| 级别 | 中 |
| 日期 | 2026-09-24 |
| 关联编号 | CVE-2026-91768 / GHSA-62xp-839h-2637 |
| 影响范围 | PHP-FPM + IPv6 ACL |
| 核验状态 | 已官方确认 |
| 修复提交 | dcdfcf86fcf7(php-src) |
来源:https://github.com/php/php-src/security/advisories/GHSA-62xp-839h-2637


















