n8n 任意文件读取分析 CVE-2026-21858
之前看到了这个
【已复现】n8n 远程代码执行漏洞(CVE-2026-21858)安全风险通告
虽然大伙都说是代码执行漏洞,但是代码执行是n8n的正常功能,最关键的是通过文件读取登录后台的过程。通过漏洞编号找到nvd的通告:
nvd的参考链接里面有个漏洞分析,写的很好,不过是英文的,熟悉英语的大伙可以直接看这篇,不用看我的。不想熟悉英语的大伙可以看看我的
Ni8mare - Unauthenticated Remote Code Execution in n8n (CVE-2026-21858) | Cyera Research Labs
其实我在看这个漏洞的时候还不知道有这篇英文的漏洞分析文章,我是先自己分析,结果最后不知道怎么回显文件,再去查资料的时候发现的
不过代码都看了,也不能白看,我按照自己的思路也写一遍吧
这个漏洞的前置条件是在n8n工作流中配置一个表单

表单至少要有一个字段,字段类型无所谓,不一定是文件类型,我这里是字符串类型

然后提交poc
POST /form/7bd2624c-4120-4263-9afe-c4f606b888fd HTTP/1.1
Host: localhost:5678
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36
Content-Type: application/json
Content-Length: 67
{"files":{"field-0":[{"filepath":"/etc/passwd","fieldLabel":"1"}]}}

在节点执行记录里可以看到被读取的文件内容

最大的问题是,查看节点执行记录这个操作是需要登录的,攻击者没账号的情况下拿不到文件数据
后来看了那篇英文的漏洞分析,才知道这个文件要配合后续工作流读取。比如这个文件内容作为AI的上下文,那你就可以让AI告诉你文件内容
那RCE是怎么回事呢?其实就是利用文件读取漏洞,把n8n的配置文件读取出来了,然后让AI找到cookie的签名密钥,伪造cookie,最后直接登录n8n后台,用shell节点执行命令
接下来看看代码
n8n的web框架是express,表单节点是作为webhook挂在packages/cli/src/webhooks/webhook-request-handler.ts上面的
在webhook解析http参数时,上传文件和其他方式(json等)提交的参数会存在req里(packages/cli/src/webhooks/webhook-helpers.ts)


这里的req会存储在上下文里面,这个上下文会在跑工作流的时候用上
packages/nodes-base/nodes/Form/utils.ts是表单节点的工具方法,可以看到这里有个保存文件的操作,用来把用户上传的文件拷贝到持久化的文件存储中


这个拷贝操作的路径是可控的,但是需要一点小技巧;下面两张图是关于文件路径的相关代码,可以看到poc是从getBodyData出来的


getBodyData的代码如下,其实就是获取了上下文解析出来的http参数

我们打一个正常的文件上传请求看看getBodyData的结果


虽然form节点设计上不使用json请求,但是也并没有禁止json请求。express中间件会正常解析json数据到getBodyData的body,而form节点默认的multipart-form数据会存放在getBodyData的body里的data和files中
这里就存在一个bug,那就是如果用户用json请求表单节点,就可以控制data和files的值,从而使copyBinaryFile读取任意文件。poc传入sink点的过程我们也看过了,接下来打poc debug一下看看



