漏洞分析 - xml2js 0.4.23 Prototype Pollution
字数 1625 2025-08-24 16:48:07

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__属性的修改。

具体问题出现在对象属性赋值阶段:

  1. 解析器接收恶意构造的XML输入
  2. 将XML元素和属性转换为JS对象的键值对
  3. 在赋值过程中,允许键名为__proto__的属性被设置
  4. 导致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解析的后端服务
  • 使用受影响版本构建的中间件和工具链

危害分析

成功利用此漏洞可能导致:

  1. 拒绝服务(DoS): 通过污染基本对象方法导致应用崩溃
  2. 远程代码执行(RCE): 如果应用使用污染后的属性进行敏感操作
  3. 权限提升: 绕过安全检查或修改应用逻辑
  4. 数据篡改: 修改应用内部状态或配置

修复方案

官方修复

升级到xml2js 0.4.24或更高版本,新版本中已添加对__proto__等特殊属性的过滤。

npm install xml2js@latest

临时缓解措施

如果无法立即升级,可以实施以下缓解方案:

  1. 输入过滤:

    const parser = new xml2js.Parser({
      tagNameProcessors: [name => {
        if (name === '__proto__') throw new Error('Invalid tag name');
        return name;
      }]
    });
    
  2. 对象冻结:

    Object.freeze(Object.prototype);
    
  3. 使用安全替代库:

    • fast-xml-parser
    • libxmljs

防御建议

  1. 对所有用户提供的XML输入进行严格验证
  2. 实施深度对象复制时使用安全的方法
  3. 定期更新依赖库并监控安全公告
  4. 在关键操作前检查对象原型是否被修改
  5. 使用Object.create(null)创建无原型的对象用于敏感操作

漏洞检测

手动检测

检查项目package.json或yarn.lock中是否包含:

"xml2js": "<=0.4.23"

自动化工具

使用以下工具扫描项目:

  • npm audit
  • snyk test
  • OWASP Dependency-Check

相关资源

  1. CVE-2023-0842官方记录
  2. xml2js GitHub仓库
  3. 原型污染漏洞详解

总结

CVE-2023-0842是一个典型的原型污染漏洞,强调了在JavaScript对象操作中实施严格输入验证的重要性。开发人员应及时更新受影响库,并审查所有处理用户输入的代码路径,以防止类似漏洞的发生。

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示例 漏洞利用代码 影响范围 此漏洞影响所有使用xml2js 0.4.23及以下版本的Node.js应用程序,特别是: 接受用户提供的XML输入的应用 使用xml2js进行XML解析的后端服务 使用受影响版本构建的中间件和工具链 危害分析 成功利用此漏洞可能导致: 拒绝服务(DoS) : 通过污染基本对象方法导致应用崩溃 远程代码执行(RCE) : 如果应用使用污染后的属性进行敏感操作 权限提升 : 绕过安全检查或修改应用逻辑 数据篡改 : 修改应用内部状态或配置 修复方案 官方修复 升级到xml2js 0.4.24或更高版本,新版本中已添加对 __proto__ 等特殊属性的过滤。 临时缓解措施 如果无法立即升级,可以实施以下缓解方案: 输入过滤 : 对象冻结 : 使用安全替代库 : fast-xml-parser libxmljs 防御建议 对所有用户提供的XML输入进行严格验证 实施深度对象复制时使用安全的方法 定期更新依赖库并监控安全公告 在关键操作前检查对象原型是否被修改 使用 Object.create(null) 创建无原型的对象用于敏感操作 漏洞检测 手动检测 检查项目package.json或yarn.lock中是否包含: 自动化工具 使用以下工具扫描项目: npm audit snyk test OWASP Dependency-Check 相关资源 CVE-2023-0842官方记录 xml2js GitHub仓库 原型污染漏洞详解 总结 CVE-2023-0842是一个典型的原型污染漏洞,强调了在JavaScript对象操作中实施严格输入验证的重要性。开发人员应及时更新受影响库,并审查所有处理用户输入的代码路径,以防止类似漏洞的发生。