CVE-2026-42231漏洞分析报告

admin 2026-05-08 05:05:01 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: CVE-2026-42231是n8n工作流自动化平台中的严重原型污染漏洞,攻击者通过向Webhook发送恶意XML负载污染对象原型链,结合Git节点SSH操作实现远程代码执行。影响版本包括n8n<1.123.32及部分2.x版本,CVSS评分9.4。修复方案为升级至安全版本并配置标签名过滤器,同时建议实施最小权限原则和Webhook访问控制。 综合评分: 85 文章分类: 漏洞分析,WEB安全,应用安全,红队,解决方案


cover_image

CVE-2026-42231 漏洞分析报告

md-bot md-bot

隐雾安全团队

2026年5月7日 22:37 广东

在小说阅读器读本章

去阅读

# CVE-2026-42231 漏洞分析报告

**CVE编号:** CVE-2026-42231

**标题:** CVE-2026-42231-n8n-XML原型污染致远程代码执行

**创建时间:** 2026-05-07T09:37:24.749932+08:00


## 漏洞描述

该漏洞是n8n开源工作流自动化平台中的一个严重安全缺陷,属于典型的原型污染漏洞,最终可被利用实现远程代码执行。其根本原因在于n8n在处理XML格式的Webhook请求体时,使用了存在缺陷的第三方库xml2js(版本0.6.2)进行解析。在packages/cli/src/middlewares/body-parser.ts中,n8n创建了一个模块级的xml2js解析器实例,但未配置tagNameProcessorsattrNameProcessors来过滤或转义危险的标签名称。这允许攻击者向Webhook端点发送一个精心构造的XML负载,其中包含如这样的标签。 由于`xml2js 0.6.2`的特定实现,当解析到标签时,它会在生成的对象上创建一个名为\_\_proto\_\_的**自有可枚举数据属性**,而非更新该对象的原型链。这个自有属性会保留在对象中,并随执行数据一并被JSON.stringify序列化后持久化到n8n的数据库(SQLite或PostgreSQL)中。当工作流执行数据被重新加载时,JSON.parse会将\_\_proto\_\_重新创建为一个普通对象的自有属性。随后,n8n在进行对象合并操作时(例如Object.assign),会错误地将一个对象的原型链替换为攻击者控制的原型对象。 为实现最终的远程代码执行,攻击者需要将原型污染与n8n工作流中的**Git节点**的SSH操作进行链式利用。通过原型污染,攻击者可以为simple-git库的配置选项(spawnOptions)和环境变量(GIT\_SSH\_COMMAND)注入恶意值。当Git节点尝试执行SSH连接时,simple-git会使用这些被污染的原型属性,从而执行攻击者注入的任意操作系统命令,最终导致主机被完全控制。


# CVE-2026-42231-n8n-XML原型污染致远程代码执行

**漏洞类型:** 原型污染 (Prototype Pollution)

**影响应用:** n8n

**危害等级:** 严重 (Critical),CVSS评分9.4,攻击者可在认证后通过原型链污染结合Git节点SSH操作实现远程代码执行,完全控制n8n主机

**影响版本:** n8n < 1.123.32, >= 2.17.0 < 2.17.4, >= 2.18.0 < 2.18.1

**利用条件:** 需要攻击者拥有n8n平台的合法低权限账号(如能创建/修改工作流),且目标n8n实例存在可公开或半公开访问的Webhook触发器节点,同时工作流中必须配置并使用Git节点执行SSH操作

**POC 可用性:** 是

**投毒风险:** 0%

**项目地址:** rudSarkar/CVE-2026-42231

**漏洞详情:** NVD数据库

## 详情

该漏洞是n8n开源工作流自动化平台中的一个严重安全缺陷,属于典型的原型污染漏洞,最终可被利用实现远程代码执行。其根本原因在于n8n在处理XML格式的Webhook请求体时,使用了存在缺陷的第三方库xml2js(版本0.6.2)进行解析。在packages/cli/src/middlewares/body-parser.ts中,n8n创建了一个模块级的xml2js解析器实例,但未配置tagNameProcessorsattrNameProcessors来过滤或转义危险的标签名称。这允许攻击者向Webhook端点发送一个精心构造的XML负载,其中包含如<\_\_proto\_\_>这样的标签。

由于xml2js 0.6.2的特定实现,当解析到<\_\_proto\_\_>标签时,它会在生成的对象上创建一个名为\_\_proto\_\_的**自有可枚举数据属性**,而非更新该对象的原型链。这个自有属性会保留在对象中,并随执行数据一并被JSON.stringify序列化后持久化到n8n的数据库(SQLite或PostgreSQL)中。当工作流执行数据被重新加载时,JSON.parse会将\_\_proto\_\_重新创建为一个普通对象的自有属性。随后,n8n在进行对象合并操作时(例如Object.assign),会错误地将一个对象的原型链替换为攻击者控制的原型对象。

为实现最终的远程代码执行,攻击者需要将原型污染与n8n工作流中的**Git节点**的SSH操作进行链式利用。通过原型污染,攻击者可以为simple-git库的配置选项(spawnOptions)和环境变量(GIT\_SSH\_COMMAND)注入恶意值。当Git节点尝试执行SSH连接时,simple-git会使用这些被污染的原型属性,从而执行攻击者注入的任意操作系统命令,最终导致主机被完全控制。

## 漏洞利用

漏洞利用的完整攻击流程如下:

**第一步:前提条件**

攻击者需拥有n8n平台的有效账户(例如,具有editor角色),该账户有权创建或修改工作流。目标实例上需要有一个配置了公共Webhook触发器的工作流,并且该工作流(或攻击者可以修改的工作流)中包含一个Git节点,该节点配置了SSH操作。

**第二步:原型污染**

攻击者通过向其有权限的Webhook端点发送一个精心构造的HTTP POST请求,Content-Type头设置为application/xml。请求体为一个包含<\_\_proto\_\_>标签的XML文档,用于污染JavaScript的Object.prototype。典型负载如下:

```xml<__proto__>true```

当n8n的xml解析器处理该请求时,会创建一个包含自有属性\_\_proto\_\_的对象,该属性值包含env.GIT\_SSH\_COMMANDspawnoptions。n8n在执行数据持久化时,会将这个含有\_\_proto\_\_属性的对象通过JSON.stringify序列化后存入数据库。

**第三步:触发代码执行**

当包含Git节点的工作流再次被执行时,n8n从数据库加载之前保存的执行数据。通过JSON.parse反序列化后,该数据对象再次拥有了一个自有的\_\_proto\_\_属性。当n8n在Git节点处理逻辑中进行对象属性合并(例如Object.assign)时,会错误地将这个攻击者控制的\_\_proto\_\_对象作为目标对象的原型。这意味着任何通过原型链读取spawnOptionsGIT\_SSH\_COMMAND的操作都会返回攻击者预设的恶意值。当Git节点调用simple-git库执行SSH命令时,simple-git会读取这些被污染的环境变量和配置选项,从而执行攻击者注入的恶意命令。

**PoC代码说明**

提供的PoC代码文件(poc\_GHSA-q5f4-99jv-pgg5.py)和辅助的DockerfileREADME.md构成了一个完整的演示和利用环境。

  • Dockerfile:用于构建包含PoC脚本的Docker镜像,确保环境依赖(Python, requests库)正确。
  • README.md:详细描述了漏洞的根因、利用链、影响版本和修复方式,并提供了命令行使用说明。
  • poc_GHSA-q5f4-99jv-pgg5.py:这是核心的漏洞利用脚本。主要功能包括:
  1. 连接到指定的n8n实例(通过--target参数)。

  2. 使用Webhook ID(通过--webhook-id参数)发送构造的恶意XML负载。

  3. --demo模式:用于验证漏洞是否存在,仅执行污染动作,不执行系统命令。

  4. 未提供--demo模式时,通过--cmd参数指定要在n8n主机上执行的操作系统命令(如反弹Shell、数据窃取等)。脚本会将GIT\_SSH\_COMMAND环境变量设置为该命令。

脚本的工作流程模拟了手工利用的全过程,自动完成了恶意XML的构造和发送,显著降低了利用门槛。

## 修复建议

官方已在n8n的以下版本中修复此漏洞:1.123.32, 2.17.4, 2.18.1。修复的核心是对XML解析器的标签名处理器增加了安全过滤。

**官方补丁详情:**

packages/cli/src/middlewares/body-parser.ts文件中,引入了一个名为sanitizeXmlName的函数,用于过滤和重命名危险的标签名。具体修改如下:

```typescriptfunction&nbsp;sanitizeXmlName(name:&nbsp;string):&nbsp;string&nbsp;{const&nbsp;unsafe&nbsp;=&nbsp;new&nbsp;Set(['__proto__',&nbsp;'constructor',&nbsp;'prototype']);return&nbsp;unsafe.has(name) ? `sanitized_${name}` : name;}const&nbsp;xmlParser =&nbsp;new&nbsp;XmlParser({async:&nbsp;true,normalize:&nbsp;true,normalizeTags:&nbsp;true,explicitArray:&nbsp;false,tagNameProcessors: [sanitizeXmlName],&nbsp;// 新增过滤attrNameProcessors: [sanitizeXmlName],&nbsp;// 新增过滤});```

这个修复方案在解析XML标签和属性名称时,会将\_\_proto\_\_constructorprototype等用于原型链攻击的关键词替换为sanitized\_前缀的安全名称,从根本上阻止了原型污染攻击。

**加固建议:**

  1. 立即升级:所有使用受影响版本(< 1.123.32, 2.17.x < 2.17.4, 2.18.x < 2.18.1)的n8n用户应立即升级到最新安全版本。这是最根本的修复措施。
  2. 最小权限原则:对n8n平台用户进行严格权限管控。限制普通用户创建/修改工作流的能力,尤其是那些涉及Webhook和Git节点的。遵循最小权限原则,仅授予用户完成其工作所必需的最小权限。
  3. Webhook访问控制:对于生产环境中的Webhook触发器,建议尽可能使用更加安全的认证方式(如通过n8n内置的凭证验证)或者限制其来源IP地址,避免暴露于公网。如果必须公开,应仔细审计哪些用户可以与之交互。
  4. 输入验证与净化:虽然官方补丁已解决,但作为纵深防御策略,建议在Webhook处理流程之前(如通过反向代理或WAF)增加对\_\_proto\_\_等恶意关键字的检查或过滤。
  5. 监控与审计:启用并审查n8n的审计日志,特别关注涉及Webhook请求、Git节点操作以及非正常时间的API调用。监控系统进程创建记录,以便及时发现可疑的命令执行行为。
  6. 环境隔离:尽量将n8n运行在隔离的环境中(如容器或虚拟机),限制其与外部网络的交互能力,尤其是出站连接能力,以降低RCE成功后的影响范围。

## 相关仓库

### 1. rudSarkar/CVE-2026-42231

**URL:** https://github.com/rudSarkar/CVE-2026-42231


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:隐雾安全团队 md-bot md-bot《CVE-2026-42231 漏洞分析报告》

知识星球—今日摘要 网络安全文章

知识星球—今日摘要

文章总结: 该文档为技术社区知识星球更新摘要,主要记录MCP项目在Docker环境下的部署进展,包含功能修复(关闭主题预览、添加限制机制)、新增Obsidian
评论:0   参与:  0