编程 SOAP 扩展的对象生命周期陷阱:三个 CVE 串讲

2026-08-29 21:07:44 views 6

SOAP 扩展的对象生命周期陷阱:三个 CVE 串讲

PHP 的 SOAP 扩展这几年一直处于“无人问津但底层复杂”的状态。最近公开的三个 CVE——CVE-2026-7261、CVE-2026-6722、CVE-2026-7262,恰好都落在 SOAP 扩展的对象生命周期管理上。虽然触发路径各不相同,但根子都是同一类问题:对象什么时候释放、指针什么时候失效,SOAP 扩展没管明白

CVE-2026-7261:SoapServer 会话持久化下的 Use-After-Free

  • CVE 编号:CVE-2026-7261
  • CVSS 评分:9.8(严重)
  • 漏洞类型:Use-After-Free(CWE-416)
  • 影响版本:PHP 8.2.x < 8.2.31、8.3.x < 8.3.31、8.4.x < 8.4.21、8.5.x < 8.5.6
  • 修复版本:8.2.31、8.3.31、8.4.21、8.5.6(原文未提供,但按影响版本对应修复版本)

SoapServer 配置了 SOAP_PERSISTENCE_SESSION,处理程序对象会通过会话存储跨请求持久化。问题在于:一个 SOAP 请求处理出错时,扩展对持久化对象的处理存在缺陷——对象被释放了,但会话里保留的指针没有被清掉。后续请求再访问这个会话,就会拿到悬空指针,触发 UAF。

攻击者只要能发送 SOAP 请求打到配置了会话持久化的端点,就可能造成内存损坏、信息泄露,甚至直接让进程崩溃。9.8 的评分说明它不排除远程代码执行的可能。

触发条件其实不复杂:

  1. SoapServer 开启 SOAP_PERSISTENCE_SESSION
  2. 某个 SOAP 请求在处理过程中触发错误路径
  3. 后续请求继续复用同一会话,访问已被释放的对象

问题本质上是错误处理路径和释放逻辑没有协调好:释放不等于从存储中移除。

CVE-2026-6722:全局映射存储的悬空指针与 RCE

  • CVE 编号:CVE-2026-6722
  • CVSS 评分:9.1(严重)
  • 漏洞类型:Use-After-Free(CWE-416)
  • 影响版本:与 CVE-2026-7261 相关版本范围一致(原文未单独列出,但属于 SOAP 扩展同一时期的修复批次)
  • 修复版本:原文未逐项列出,但应同步升级到上述修复版本

这个漏洞出在 SOAP 扩展的对象去重机制上。

SOAP 消息里如果有多个引用指向同一个对象,扩展需要在全局映射表里记录“哪个指针对应哪个对象”。问题在于:映射表存了 PHP 对象的指针,却没有增加引用计数

apache:Map 节点包含重复键时,处理第二个条目会覆盖第一个条目并释放原来的对象。但映射表里那个指针并没有被清掉,依然指向已经释放的内存。后续通过 href 引用这个映射项时,悬空指针会被直接复制到 SOAP 解码结果中。

攻击者完全可以通过构造 SOAP 请求体来控制这种 UAF 的利用路径——不只是崩溃,CVSS 9.1 指向的是远程代码执行

触发条件概括为:

  1. SOAP 请求包含 apache:Map 节点
  2. Map 中存在重复键
  3. 后续通过 href 引用被覆盖的映射项

这里想强调的是:去重机制如果没有同步管理引用计数,本质上就是在用裸指针做缓存——短期没问题,一旦覆盖或释放,就是悬空指针。

CVE-2026-7262:typemap 解码路径的空指针解引用

  • CVE 编号:CVE-2026-7262
  • CVSS 评分:7.5(高危)
  • 漏洞类型:NULL Pointer Dereference
  • 影响版本:与上述 CVE 同批次 SOAP 扩展修复范围
  • 修复版本:同上

前两个 CVE 是 UAF,这个相对温和一些,但是一个典型的健壮性问题。

当 SOAP 服务器配置了 typemap 时,解码过程中如果缺少 value 元素,错误检查变量没有被正确初始化或检查,导致后续代码对一个空指针执行解引用,直接段错误。

关键是:这个漏洞不需要认证,远程攻击者只要发送一个构造过的 SOAP 请求——typemap 配置存在且请求 XML 缺 value 元素——就能让 PHP 进程崩溃。对线上服务来说,一个可以稳定触发的崩溃就是 DoS。

触发条件:

  1. SoapServer 配置了 typemap
  2. 请求的 SOAP 解码路径中缺少 value 元素
  3. 缺少对该错误状态的检查,进入空指针解引用

修复与缓解

修复没有任何悬念:升级到修复版本。8.2 升 8.2.31+,8.3 升 8.3.31+,8.4 升 8.4.21+,8.5 升 8.5.6+。

如果线上确实无法立即升级:

  • 确认业务是否真正需要 SOAP 服务;用不到直接 ;extension=soap 禁用,最省心
  • SOAP 端点前面加 WAF,拦截异常请求——特别是复杂嵌套结构、含重复键的 apache:Map 节点这类特征明显的载荷
  • 对 SOAP 端点做访问控制,只允许可信 IP 调用,降低被外部攻击面覆盖的概率

另外多说一句:SOAP 扩展的维护状态一直偏冷门,这类对象生命周期问题不是第一次出现,也不太可能是最后一次。如果你的业务还在跑老版本 PHP 且依赖 SOAP,建议把这三个 CVE 的修复纳入近期发布计划——毕竟 9.8 和 9.1 的评分已经说明问题很实际了。

复制全文 生成海报 PHP 安全 漏洞

推荐文章

程序员茄子在线接单