NewApp Monitoring is liveSign up free
AgentbeamBeta
AI agent vulnerability · n8n

CVE-2026-86080: n8n: GitHub Trigger 422 Reuse Path Skips Webhook Secret Storage, Causing Signature Verification to Fail-Open

mediumCVSS 4.0 6.3GHSA-5m98-cgcr-xx3q

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 n8n

Then 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 webhookId but no webhookSecret as 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 webhookId but no webhookSecret, 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

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 entries