Jun 17, 2026·5 min read·20 visits
A validation flaw in the n8n Public API allowed users with read-only workflow permissions to execute retries, triggering unauthorized workflow executions on the server.
An incorrect authorization vulnerability in the Public API of n8n allows authenticated users with read-only permissions to bypass access control boundaries. By invoking the execution retry endpoint, an unauthorized user can trigger workflow executions, effectively escalating their privileges from workflow:read to workflow:execute.
The workflow automation platform n8n provides a Public API to manage and automate executions. In multi-tenant or team environments, n8n relies on a defined permission model to enforce boundaries between different users and projects. These boundaries ensure that users with read-only access cannot modify state or trigger actions.
A logical flaw in the Public API endpoint responsible for retrying workflow executions broke this authorization model. The endpoint allowed users to perform write/execution operations if they possessed read-only permissions. This flaw is classified under CWE-863 (Incorrect Authorization).
This vulnerability is significant for environments where workflows connect to production resources, cloud infrastructure, or databases. By abusing this endpoint, an unauthorized actor can trigger side effects in downstream integrations, leading to unintended modifications of third-party systems.
The root cause of this vulnerability lies in the incorrect mapping of permission scopes within the Public API router. n8n utilizes distinct scopes to govern user actions: workflow:read for viewing resources, workflow:write for configuration modifications, and workflow:execute for initiating runtime activities.
When a client targets the endpoint /v1/executions/{executionId}/retry, the application API gateway is responsible for verifying the caller's scope. Due to an integration oversight, the route guard applied to this endpoint verified the presence of the workflow:read scope instead of the workflow:execute scope.
Because the API key or authorization token of a read-only user naturally contains the workflow:read scope, the gateway passed the request to the execution controller. The backend then processed the execution payload as if the user possessed full execution rights, demonstrating a direct breakdown in role-based access control.
In the vulnerable version of the application, the controller responsible for execution actions implemented route protection decorators incorrectly. The following conceptual representation demonstrates how the middleware authorized the request based on the read scope:
// VULNERABLE ROUTE DEFINITION
@Post('/executions/:executionId/retry')
@Scope('workflow:read') // Bug: Validated read access instead of execute access
async retryExecution(@Param('executionId') executionId: string) {
return await this.executionService.retry(executionId);
}The fix applied by the n8n developers updated the decorator to reference the correct cryptographic execution scope. This change ensures that the router drops requests from read-only users before invoking the execution engine:
// PATCHED ROUTE DEFINITION
@Post('/executions/:executionId/retry')
@Scope('workflow:execute') // Fix: Enforce active execution permissions
async retryExecution(@Param('executionId') executionId: string) {
return await this.executionService.retry(executionId);
}This patch completely resolves the specific logical path. However, organizations should perform regression testing to ensure no other active state-changing endpoints are decorated with passive read scopes.
To exploit this vulnerability, an attacker requires a valid account or API key with read-only privileges. The attack vector is entirely network-based and can be executed via standard HTTP command-line tools.
First, the attacker identifies a target workflow to which they have read-only access. They query the execution list to discover historic execution identifiers:
curl -X GET "https://n8n.example.com/v1/executions?workflowId=10" \
-H "X-N8N-API-KEY: n8n_api_readonly_token_abc"Next, the attacker selects a target execution ID (e.g., 105) from the response. They issue a POST request to the retry endpoint using the same read-only credentials:
curl -X POST "https://n8n.example.com/v1/executions/105/retry" \
-H "X-N8N-API-KEY: n8n_api_readonly_token_abc" \
-H "Content-Type: application/json"The server returns a successful execution response, and the engine initiates a new runtime instance of the workflow using the historical input data of execution 105.
This vulnerability carries a CVSS v3.1 score of 6.4 (Medium). The scope parameter is classified as 'Changed' (S:C) because exploiting the API allows low-privileged users to trigger backend events that execute operations on third-party integrations outside the user's immediate scope.
Integrity impact is low to medium depending on the specific nodes configured in the target workflow. If the workflow executes SQL updates, writes to a cloud CRM, or interacts with transactional systems, repeating the execution can result in duplicated transactions or data corruption.
Resource exhaustion is also an operational risk. An automated script could repeatedly call the retry endpoint, causing n8n's execution queue to fill up. This would prevent legitimate workflows from running and deplete memory or CPU resources.
The definitive remediation for GHSA-H3JJ-5F3V-3685 is to upgrade n8n to a patched release. Systems on the 2.25.x release path must upgrade to 2.25.7 or later. Systems on the 2.26.x path must upgrade to 2.26.2 or later.
If patching cannot be performed immediately, administrators should implement strict network-level controls. Restrict access to the /v1/ API paths to trusted administrative source IP addresses using an API Gateway or Web Application Firewall.
Additionally, audit all active API keys and user privileges within the n8n application. Revoke any unnecessary keys and ensure that sharing workflows across teams is limited only to instances where collaboration is strictly required.
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:L/I:L/A:N| Product | Affected Versions | Fixed Version |
|---|---|---|
n8n n8n-io | < 2.25.7 | 2.25.7 |
n8n n8n-io | >= 2.26.0, < 2.26.2 | 2.26.2 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-863 |
| Attack Vector | Network |
| CVSS v3.1 Score | 6.4 (Medium) |
| CVSS Vector | CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:L/I:L/A:N |
| Exploit Status | poc |
| Patched Versions | 2.25.7, 2.26.2 |
The product performs an authorization check when an actor attempts to access a resource or perform an action, but it does not correctly associate the authorization with the explicit action being executed.
CVE-2026-118773 (GHSA-3g3m-2fjr-6pw4) is an uncontrolled resource consumption vulnerability in the node-glob npm package affecting versions 9.0.0 through 14.0.1. Due to missing return statements in the AbortSignal check routines within the directory traversal walker, aborted operations reject the caller promise as expected but continue executing background filesystem reads and pattern matching. Applications that rely on AbortSignal or AbortSignal.timeout() to enforce execution budgets on user-influenced glob operations remain susceptible to CPU, event loop, and disk I/O exhaustion.
CVE-2026-118764 (also tracked as GHSA-g3hv-75wg-m249) is an asymmetric resource consumption vulnerability (CWE-405) in the npm package minimatch prior to version 11.0.1. When pattern compilation is invoked with an optimizationLevel of 2 or higher, the internal preprocessing functions firstPhasePreProcess() and secondPhasePreProcess() in src/index.ts perform unbounded pattern splitting and quadratic pairwise deduplication. An attacker supplying a crafted glob string containing repeated **/.. segments can induce a combinatorial explosion of pattern permutations followed by an O(M^2) comparison routine, blocking the Node.js event loop and exhausting process memory.
A regular expression denial of service (ReDoS) vulnerability exists in @hapi/content from version 3.0.6 prior to 6.0.3. The Content.disposition() function utilizes an unanchored parameter-name regular expression inside a global replacement scan. When processing a Content-Disposition header parameter containing a long token lacking an equals sign, the JavaScript regular expression engine undergoes quadratic O(N^2) backtracking. Because @hapi/content is invoked by @hapi/pez during multipart/form-data request parsing, unauthenticated remote attackers can send a crafted multipart request to any Hapi route with multipart payload parsing enabled, starving the single-threaded Node.js event loop.
A Regular Expression Denial of Service (ReDoS) vulnerability exists in the joi schema description and data validation library for JavaScript. When validating multiple email addresses using the Joi.string().email({ multiple: true }) configuration, the library compiles a separator regular expression with an unanchored greedy leading whitespace quantifier. Supplying an input string containing a long sequence of whitespace characters without the expected delimiter triggers quadratic time complexity during String.prototype.split execution, blocking the single-threaded Node.js event loop.
CVE-2026-119205 (GHSA-mfr5-77xh-9j7h) is a Denial of Service (DoS) vulnerability in pypdf prior to version 6.21.4. The flaw occurs during the cloning or duplication of nested PDF dictionary structures. Because the cycle-detection algorithm within DictionaryObject._clone() tracked generated destination object references rather than the original source indirect references, cyclic reference graphs in source PDFs evaded detection, resulting in an infinite loop and CPU exhaustion.
CVE-2026-119204 (also tracked as GHSA-cggf-277g-3q54) is a Denial of Service (DoS) vulnerability in pypdf prior to version 6.21.4. The vulnerability stems from uncontrolled resource consumption (CWE-400) during the flattening of a PDF document's page tree. By supplying a compact PDF containing a hierarchical amplification structure of shared `/Pages` and `/Page` nodes with dense dictionary entries or inherited resources, an unauthenticated attacker can cause pypdf to copy millions of dictionary entries into individual `PageObject` instances without enforcing a document-wide entry budget. This triggers severe heap memory exhaustion and process termination via Out-Of-Memory (OOM) kills.