ghsa-rgrp-mwpx-f6rm 是 9 月批次中评级最高的一份官方公告:soap 扩展的 cleanup_xml_node() 函数存在无界递归,评级 high。攻击面在服务端——任何处理不可信 xml 输入且启用了 soap 扩展的实例都可能被构造的文档打入深度递归。

▲ 事件来源页面实时截图:php/php-src Security Advisories
影响与判断
属于 9 月 24 日安全批次修复项。判断自己是否受影响只需要两个问题:SOAP 扩展是否启用、PHP 是否低于 9 月批次版本。未启用 SOAP 的实例可以降低这条的优先级。
处置
升级至所在分支 9 月及以后的补丁版本(当前为 8.5.12 / 8.4.27 / 8.3.36 / 8.2.35)。
递归为什么没有终点
cleanup_xml_node() 在 SOAP XML 解析器里按 XML 嵌套层级递归,且没有深度上限。任何 SoapServer 端点只要接受请求,攻击者就能提交包含数万层嵌套元素的 SOAP 消息,逐层消耗调用栈直至进程崩溃;同样的无界递归还存在于 SOAP 值解码器与 WSDL 节点处理路径中。
修复做法与残余风险
修复引入了解码深度上限常量,超限时抛出「Nesting level too deep」错误并中止解析,同时覆盖编码、解码与 WSDL 三条路径。升级到含修复的补丁版本后,仍建议在反向代理层限制请求体大小与嵌套深度,形成第二道防线。
修复补丁(官方提交)
该问题由 php-src 官方提交 3655b79c7bfa 修复(2026-09-17),提交说明为「Fix GHSA-rgrp-mwpx-f6rm: unbounded recursion in ext/soap XML parsing and decoding」。改动涉及 5 个源码/测试文件,核心变更如下:
ext/soap/php_encoding.c
@@ -552,7 +552,12 @@ static zval *master_to_zval_int(zval *ret, encodePtr encode, xmlNodePtr data)
}
}
if (encode->to_zval) {
+ if (SOAP_GLOBAL(decode_depth) >= SOAP_MAX_DECODE_DEPTH) {
+ soap_error0(E_ERROR, "Encoding: Nesting level too deep");
+ }
+ SOAP_GLOBAL(decode_depth)++;
ret = encode->to_zval(ret, &encode->details, data);
+ SOAP_GLOBAL(decode_depth)--;
}
return ret;
}
@@ -3444,6 +3449,7 @@ void encode_reset_ns()
{
SOAP_GLOBAL(cur_uniq_ns) = 0;
SOAP_GLOBAL(cur_uniq_ref) = 0;
+ SOAP_GLOBAL(decode_depth) = 0;
if (SOAP_GLOBAL(ref_map)) {
zend_hash_destroy(SOAP_GLOBAL(ref_map));
} else {
@@ -3456,6 +3462,7 @@ void encode_finish()
{
SOAP_GLOBAL(cur_uniq_ns) = 0;
SOAP_GLOBAL(cur_uniq_ref) = 0;
+ SOAP_GLOBAL(decode_depth) = 0;
▲ 补丁片段摘自 php-src 官方仓库该提交
完整补丁与测试用例可在 php-src 仓库该提交页面查看:https://github.com/php/php-src/commit/3655b79c7bfa90db004d75a3b282ed0f538f4836

▲ 官方公告页配图

▲ 官方修复提交页面截图
关键信息
| 项目 | 内容 |
|---|---|
| 类目 | 安全漏洞 |
| 级别 | 高 |
| 日期 | 2026-09-24 |
| 关联编号 | CVE-2026-91765 / GHSA-rgrp-mwpx-f6rm |
| 影响范围 | 启用 SOAP 扩展的实例 |
| 核验状态 | 已官方确认 |
| 修复提交 | 3655b79c7bfa(php-src) |
来源:https://github.com/php/php-src/security/advisories/GHSA-rgrp-mwpx-f6rm


















