CVE-2026-86080: n8n: GitHub Trigger 422 Reuse Path Skips Webhook Secret Storage, Causing Signature Verification to Fail-Open
n8n's GitHub Trigger can end up with no stored webhook secret. When GitHub answers webhook creation with a 422 because the hook already exists, the node keeps the hook id but drops the signing secret, and signature checks then fail open. Anyone who knows the webhook URL can send events. Fixed in n8n 1.123.76, 2.37.7 and 2.38.2.
Published Sep 10, 2026 · Analysis Oct 24, 2026
What an attacker can do
The GitHub Trigger generates a signing secret when it registers a webhook, then verifies X-Hub-Signature-256 on each delivery. If the create request returns a 422 because a webhook for that URL already exists, the node adopts the remote hook. It keeps only the hook id and events and discards the secret it just generated.
With no stored secret, the verification step accepted every delivery. Anyone who can reach the workflow's webhook URL can post forged GitHub events, and the workflow runs on them. This is improper signature verification (CWE-347).
The attack needs network access and knowledge of the webhook URL, with no account. The CVSS vector rates integrity impact as low and the attack-requirements flag as present, because only workflows that went through the 422 reuse path are exposed. Typical results are workflows triggered by fake push, issue or pull request events, which can feed attacker-chosen data into later nodes such as deployments or notifications.
The patch re-fetches the existing hook by its stored id, re-applies the signing secret, and makes verification fail closed when no secret is stored.
Who is affected
Affected: n8n below 1.123.76, 2.0.0 up to but not including 2.37.7, and 2.38.0 up to but not including 2.38.2. Within those versions, only GitHub Trigger workflows that hit the 422 reuse path are exposed. Check the version:
npm ls n8nThen inspect each GitHub Trigger workflow's static data. An entry with a webhookId but no webhookSecret marks an unprotected workflow.
n8n
- Ecosystem
- npm
- Affected
- < 1.123.76
- Fixed in
- 1.123.76
- Check
npm ls n8n
n8n
- Ecosystem
- npm
- Affected
- >= 2.38.0, < 2.38.2
- Fixed in
- 2.38.2
- Check
npm ls n8n
n8n
- Ecosystem
- npm
- Affected
- >= 2.0.0, < 2.37.7
- Fixed in
- 2.37.7
- Check
npm ls n8n
How to fix it
Upgrade to 1.123.76, 2.37.7 or 2.38.2, or later:
npm install -g [email protected]The advisory lists stopgaps that it says do not fully remediate the risk:
- Delete the existing GitHub hook, then deactivate and reactivate the GitHub Trigger workflow to register a fresh webhook with a new secret. Without the deletion, the 422 path is taken again.
- Limit network access to the n8n webhook endpoint to GitHub's published IP ranges.
- Treat any workflow with a
webhookIdbut nowebhookSecretas unprotected until it is reactivated successfully.
How to tell if you were hit
Audit the static data of every GitHub Trigger workflow for a webhookId without a webhookSecret. Review execution history for runs triggered by events that have no matching activity in the GitHub repository, and check webhook access logs for deliveries from IP addresses outside GitHub's published ranges. In GitHub, compare the repository's webhook delivery list with n8n executions. The advisory gives no other indicators.
Original advisory
From the GitHub Advisory Database (CC BY 4.0).
Impact
The GitHub Trigger generated a signing secret when it registered a webhook and verified X-Hub-Signature-256 on each delivery. When GitHub answered the create request with a 422 because a webhook for the URL already existed, the node adopted the remote hook but kept only its id and events, discarding the secret it had generated. Deliveries to that workflow's webhook URL were then accepted from anyone. The patch re-fetches the existing hook by its stored id, re-applies the signing secret, and makes verification fail closed when no secret is stored.
Patches
The issue has been fixed in n8n versions 1.123.76, 2.37.7, and 2.38.2. Users should upgrade to one of these versions or later to remediate the vulnerability.
Workarounds
If upgrading is not immediately possible, administrators should consider the following temporary mitigations:
- Deactivate and reactivate any GitHub Trigger workflows to force a fresh webhook registration with a new secret, provided the remote GitHub hook has been deleted first so that the 422 reuse path is not taken again.
- Restrict network access to the n8n webhook endpoint to GitHub's published IP ranges only.
- Audit GitHub Trigger workflow static data for entries that contain a
webhookIdbut nowebhookSecret, and treat those workflows as unprotected until reactivated successfully.
These workarounds do not fully remediate the risk and should only be used as short-term mitigation measures.
Credited to vonypeto.
Questions
- How does a GitHub Trigger end up without a secret?
GitHub returns 422 when a webhook for the URL already exists. The vulnerable node adopted that hook but stored only its id and events, so the generated secret was lost.
- Can someone exploit CVE-2026-86080 without credentials?
Yes, if they know the workflow's webhook URL. The CVSS vector lists no privileges and no user interaction, and deliveries were accepted from anyone.
- Is reactivating the workflow enough?
Only if you first delete the remote GitHub hook. Otherwise the 422 reuse path runs again. The advisory says even this does not fully remediate the risk, so upgrade.
- Which versions fix it?
1.123.76, 2.37.7 and 2.38.2. Verification now fails closed when no secret is stored.
References
Read for this analysis:
How this page is made: the data panel comes from the GitHub Advisory Database, CISA’s KEV catalog, the NVD and FIRST EPSS, and updates twice a day. The analysis is written by an AI model from the sources listed above and checked by automated rules before it is published. Check versions against the vendor's advisory before you act. Methodology
More n8n vulnerabilities
All n8n entriesCVE-2026-86073
n8n: Per-Resource OAuth Consent Bypass via Unbound Refresh Token Resource Substitution
medium5.9Sep 10, 2026CVE-2026-86074
n8n: Instance AI Credential Setup Accepts Unvalidated Probe URL from Fetched Content
medium5.9Sep 10, 2026CVE-2026-86075
n8n: Unauthenticated Persistent Storage Exhaustion via OAuth Dynamic Client Registration Endpoint
high8.7Sep 10, 2026CVE-2026-86076
n8n: Expression Sandbox Escape via Class-Field Sanitizer Rebinding Can Lead to Code Execution
high8.7Sep 10, 2026CVE-2026-86077
n8n: Anonymous Approval-Gate Bypass via Reused resumeToken over the Chat WebSocket
medium6.3Sep 10, 2026CVE-2026-86078
n8n: Prototype Pollution via Workflow Structure Summary Can Lead to Denial of Service
medium6.0Sep 10, 2026
