ELSEIF
Your brief EB
186 stories from 105 feeds 343 clusters Refreshed 12 minutes ago next pull 18:51

SECURITY Signal 425

Prototype pollution in n8n GSuiteAdmin node chains to remote code execution via Git node

A prototype pollution vulnerability in n8n's GSuiteAdmin node allows an attacker with editor access to write arbitrary properties onto Object.prototype, which chains through the Git node to full remote code execution.

WHY IT MATTERS

An attacker who can configure a workflow's GSuiteAdmin Custom Fields can pollute the global object prototype and achieve RCE as the n8n process user, which means full credential theft since n8n holds the encryption key for all stored credentials. The pollution also crashes every database query via TypeORM, making the instance non-functional until a full restart. The vulnerability affects all deployment types: self-hosted, worker mode, and Cloud.

Written by elseif from the cluster below · every claim links back to a source

The three things worth knowing

01

The GSuiteAdmin node uses a user-supplied schema name as a dynamic object property key without checking for __proto__, constructor, or prototype, allowing Object.prototype pollution.

02

The polluted prototype propagates into the Git node's environment via simple-git and Node.js spawn(), where GIT_SSH_COMMAND is executed as a shell command when git encounters an SSH URL.

03

The fix is to reject dangerous property names before using them as keys or to use Object.create(null), and n8n's codebase already has a deepMerge utility with prototype pollution guards that the GSuiteAdmin node was not using.

THE READ

What the cluster adds up to.

ORIGINAL ANALYSIS

The root cause is a classic prototype pollution pattern: the GSuiteAdmin node takes a user-supplied schema name from workflow configuration and uses it directly as a property key on a plain object. When that schema name is "__proto__", the nullish coalescing assignment is a no-op because the __proto__ getter returns Object.prototype, which is not nullish. The subsequent assignment then writes an attacker-controlled field name and value directly onto Object.prototype, and every plain object created afterwards inherits the polluted property. The attacker only needs editor access to the workflow configuration to control all three values: schema name, field name, and value.

The pollution chains into RCE through a multi-step gadget. The Git node uses simple-git, which allocates a plain object to hold environment variables; that object inherits from the now-polluted Object.prototype. When Node.js spawn() builds the child process environment, it iterates inherited properties, so the polluted GIT_SSH_COMMAND propagates into the git child process. When git encounters an SSH-style URL, it spawns GIT_SSH_COMMAND as a shell command, executing the attacker's payload as the n8n process user. The full chain is Webhook to GSuiteAdmin for pollution, then Git for code execution, triggered by a single HTTP POST request.

The pollution is independently destructive even without the RCE chain. After Object.prototype is polluted, TypeORM's buildWhere function picks up the extra properties through for...in iteration and throws EntityPropertyNotFoundError on every database query. The n8n UI goes unresponsive, all workflow executions fail, and the instance requires a full restart to recover. This means an attacker who can reach the GSuiteAdmin node can cause a complete denial of service without needing the Git node in the workflow at all.

The remediation is straightforward: reject dangerous property names such as __proto__, constructor, and prototype before using them as object keys, or use Object.create(null) for the customSchemas object to eliminate prototype inheritance entirely. Notably, n8n's codebase already contains a deepMerge utility with prototype pollution guards, but the GSuiteAdmin node was not using it. The report was submitted to n8n's security team on 2025-02-26, and the advisory and CVE were published on 2025-03-25. Only one feed is carrying this story, so corroboration is limited.

Written by elseif from the cluster below · checked for specifics the sources never contained

THE CLUSTER

Same story, 1 feed.

ORDERED BY FIRST SEEN
simonkoeck.com via Lobsters CVE-2026-33696: From a Schema Name to RCE in n8n Open ↗