n8n is an open source workflow automation platform. Versions starting with 1.65.0 and below 1.121.0 enable an attacker to access files on the underlying server through execution of certain form-based workflows. A vulnerable workflow could grant access to an unauthenticated remote attacker, resulting in exposure of sensitive information stored on the system and may enable further compromise depending on deployment configuration and workflow usage. This issue is fixed in version 1.121.0.
PoC代码[已公开]
id: CVE-2026-21858
info:
name: n8n Webhooks - Remote Code Execution
author: rxerium
severity: critical
description: |
n8n is an open source workflow automation platform. Versions starting with 1.65.0 and below 1.121.0 enable an attacker to access files on the underlying server through execution of certain form-based workflows. A vulnerable workflow could grant access to an unauthenticated remote attacker, resulting in exposure of sensitive information stored on the system and may enable further compromise depending on deployment configuration and workflow usage. This issue is fixed in version 1.121.0.
impact: |
Unauthenticated remote attackers can access sensitive files, potentially leading to information disclosure and further system compromise.
remediation: |
Update to version 1.121.0 or later.
reference:
- https://thehackernews.com/2026/01/critical-n8n-vulnerability-cvss-100.html
- https://nvd.nist.gov/vuln/detail/CVE-2026-21858
classification:
cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:N
cvss-score: 10.0
cve-id: CVE-2026-21858
epss-score: 0.02955
epss-percentile: 0.86059
cwe-id: CWE-20
metadata:
verified: true
max-request: 1
shodan-query: http.favicon.hash:-831756631
tags: cve,cve2026,n8n,workflow,rce,passive,vkev
http:
- method: GET
path:
- "{{BaseURL}}/signin"
extractors:
- type: regex
name: base64_content
group: 1
regex:
- '<meta name="n8n:config:sentry" content="([A-Za-z0-9+/=]+)"'
internal: true
- type: dsl
name: decoded
dsl:
- 'base64_decode(base64_content)'
internal: true
- type: dsl
name: version
dsl:
- 'replace_regex(base64_decode(base64_content), ".*n8n@([0-9]+\\.[0-9]+\\.[0-9]+).*", "$1")'
internal: true
- type: dsl
dsl:
- '"n8n Version: " + version'
matchers-condition: and
matchers:
- type: word
part: body
words:
- "<title>n8n.io"
case-insensitive: true
- type: status
status:
- 200
- type: dsl
name: vulnerable
dsl:
- compare_versions(version, '>= 1.65.0', '< 1.121.0')
# digest: 490a0046304402201bf421ea1024f54ba96e7aa5eda102c04e8ee729f3b4934f7539d12fbaf57e5a022041f9d282b11145be0ab6e249d8caed2e906f15ed45577e0a077f78dfc2a07602:922c64590222798bb761d5b6d8e72950