abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · n8n-function-vm2
n8n 2.42.0 - n8n GmbH
GHSA-j4p8-h8mh-rh8q 将 n8n-nodes-base.code 迁移到了 JS 任务运行器子进程。生产环境启动时添加了 --disallow-code-generation-from-strings 和 --disable-proto=delete。遗留的是那些他们隐藏起来而非迁移的节点。Function.node.ts 是 hidden: true。FunctionItem 也是。LangChain Code 也是。面板隐藏只是一个 UI 标志。工作流 JSON 保存/导入仍然会解析该类型。默认的 NODES_EXCLUDE 仅包含 Execute Command 和 Local File Trigger。执行路径位于 n8n 主进程中的进程内 vm2 NodeVM 3.12.2。
一个能够创建工作流的默认成员即可在 n8n 主进程中运行 JS。隐藏不是 ACL。
| ID | 暂无 CVE |
| CWE | CWE-94, CWE-269 |
| CVSS | High: 8.8 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| 产品 | n8n |
| 受影响版本 | 至 2.42.0(86c23326);GHSA-j4p8 的遗留问题 |
| 认证 | 具有工作流创建/导入/执行权限的已认证成员 |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅限 127.0.0.1 |
作为默认成员,导入或创建一个节点 type 为 n8n-nodes-base.function(或 functionItem,或 @n8n/n8n-nodes-langchain.code)的工作流并执行它。该 JS 运行在 n8n 主进程中。
这就是以 n8n UID 身份实现的宿主机 RCE:实例密钥、磁盘上其他用户的凭据密文、数据库。多租户成员到实例接管。不是操作系统 LPE。不是未认证。同一实例上的 Code v2 无法以那种方式看到 process。
同一产品,同类遗留问题:Databricks path join。
我先阅读了 2026 年 9 月 16 日的 GHSA 浪潮,然后在标签 [email protected] 上进行了十次搜寻。表达式沙箱、Code/Function/vm2、凭据、webhooks、HTTP/SSRF、Git 节点、社区包、认证/SSO、节点注入、公共 API。该浪潮中的大多数 High 在此版本上已关闭。Code 尚未完成。
v3 破坏性变更规则已将 Function / FunctionItem 标记为 已移除。在 2.42.0 上它们是遗留物,而非预期的长期沙箱。Function 还会注入 this.helpers,包括 JS 运行器列为不支持的 helpers。我不需要公开的 vm2 gadget 来证明进程边界。
我搭建了原版 n8nio/n8n:2.42.0,注册了一个 成员(非实例所有者),导入 n8n-nodes-base.function,执行它。Function 的 pid=7 就是 n8n 主 PID。Code v2 中的相同 JS:hasProcess: false。任务运行器子进程是 pid 26。见证 N8N-FUNCTION-VM2-WITNESS。
已记录的弯路:Function 类型被拒绝为隐藏/未知(然后该节点实际上被排除);Function pid 等于任务运行器子进程(然后它已经迁移);Code v2 看到 process(然后运行器不是控制点);vm2 漏洞利用 gadget、反向 shell、操作系统 LPE。都是表演。见证是主 PID 对比 hasProcess: false。
cd lab
./run.sh
目标 仅限 http://127.0.0.1:18201。默认 NODES_EXCLUDE。攻击者为成员。
authenticated-as=member
function-fields pid=7 witness=N8N-FUNCTION-VM2-WITNESS
code-fields hasProcess=False pid=None
compare function_pid=7 code_pid=None main_pid=7 runner_pid=26 who=member
SUCCESS N8N-FUNCTION-VM2 who=member function_pid=7 code_pid=None main_pid=7 runner_pid=26 N8N-FUNCTION-VM2-WITNESS
将 n8n-nodes-base.function、n8n-nodes-base.functionItem 和 @n8n/n8n-nodes-langchain.code 添加到默认 NODES_EXCLUDE,或者像 Code v2 已经做的那样将它们路由到 JsTaskRunnerSandbox。面板 hidden 不够。
Function.node.ts · Code.node.ts · nodes.config.ts · task-runner-process-js.tsGNU Affero GPL v3.0。参见 LICENSE。仅限回环实验环境。无担保。