CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



GHSA-38C7-23HJ-2WGQ

Signed, Sealed, Ignored: Forging Zendesk Webhooks in n8n

Alon Barad
Alon Barad
Software Engineer

Feb 27, 2026·6 min read·34 visits

Executive Summary (TL;DR)

The Zendesk Trigger node in n8n failed to verify webhook signatures, allowing anyone with the webhook URL to spoof events. Attackers could trigger workflows with fake data. The fix introduces HMAC verification, but users must manually toggle workflows to fetch the signing keys.

A critical oversight in the n8n Zendesk Trigger node allowed attackers to forge incoming webhooks, bypassing authentication completely. By ignoring the cryptographic signature provided by Zendesk, n8n accepted any HTTP POST request to the webhook URL as a legitimate event. This vulnerability highlights the dangers of implicit trust in webhook endpoints and requires a manual intervention—deactivating and reactivating workflows—even after patching.

The Hook: Trust Issues in Automation

Automation platforms like n8n are the glue of the modern internet. They take data from Service A (Zendesk), massage it, and shove it into Service B (Slack, Jira, Postgres). It's magic, until it's black magic.

The Zendesk Trigger node is designed to sit passively, waiting for Zendesk to shout "New Ticket!" or "Ticket Updated!" via a webhook. Webhooks are essentially public HTTP endpoints. Because they are public, the standard security model relies on a "shared secret" handshake. Zendesk signs the payload, and the receiver (n8n) checks the signature.

But what happens when the receiver is too polite to check credentials? You get GHSA-38C7-23HJ-2WGQ. In affected versions of n8n, the Zendesk Trigger node was operating on the "honor system." It assumed that if a request arrived at the specific UUID-generated URL, it must be from Zendesk. It’s the digital equivalent of unlocking your front door just because someone knocked.

The Flaw: A Missing Signature

Zendesk, being a responsible platform, includes a header in its webhook requests: X-Zendesk-Webhook-Signature. This is an HMAC-SHA256 hash of the timestamp and the request body, signed with a secret key known only to Zendesk and the integration owner.

The vulnerability here wasn't a complex buffer overflow or a heap grooming exploit. It was a simple logic omission. The code responsible for handling the incoming trigger looked something like this (conceptually):

  1. Receive HTTP POST.
  2. Is the URL correct? Yes.
  3. Parse Body.
  4. Execute Workflow.

Notice the missing step? It never validated the X-Zendesk-Webhook-Signature. The node blindly trusted the input. This falls under CWE-345 (Insufficient Verification of Data Authenticity). If an attacker guessed, leaked, or brute-forced the webhook URL—which is often just a UUID—they could send any JSON payload they wanted. n8n would happily ingest it and pass it down the pipeline as trusted data.

The Code: Autopsy of a Fix

The patch, introduced in commit 3839e310bd4c3002c646c363d1411916fa195151, reveals exactly how the developers closed the hole. They had to introduce a mechanism to fetch the signing secret and then use it to validate requests.

First, they added a helper to compute the HMAC:

function verifySignature(signature: string, timestamp: string, body: string, secret: string): boolean {
	const hmac = crypto.createHmac('sha256', secret);
	const data = timestamp + body;
	const digest = hmac.update(data).digest('base64');
	return crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(digest));
}

> [!NOTE] > Notice the use of crypto.timingSafeEqual. This prevents timing attacks where an attacker could guess the signature byte-by-byte by measuring how long the comparison takes.

However, the most interesting part of the patch is the fail-open mechanism for backward compatibility. Look at this logic in the trigger handler:

// If we don't have a secret, we can't verify, so we let it through
// to avoid breaking existing workflows that haven't been reactivated.
if (!webhookSecret) {
	return true;
}

This is a critical nuance. The code only verifies the signature if webhookSecret exists in the workflow's static data. This secret is only fetched when the node is activated (setup). This means patching the software is not enough to stop the exploit. Old workflows remain vulnerable until manually reset.

The Exploit: Faking the Ticket

Let's assume we are the attacker. Our goal is to trigger an internal business process defined in n8n. Perhaps the workflow creates a Jira ticket or sends a Slack message when a "High Priority" Zendesk ticket arrives.

Step 1: Reconnaissance We need the webhook URL. These often leak in client-side code, GitHub repos, or browser history. They look like https://n8n.corp.com/webhook/5f8b9....

Step 2: Crafting the Payload We don't need to sign anything. We just need to match the JSON structure the workflow expects. A standard Zendesk payload might look like this:

{
  "ticket": {
    "id": 1337,
    "priority": "urgent",
    "subject": "URGENT: Refund $50,000 to Attacker",
    "description": "Authorized by CEO."
  }
}

Step 3: Execution We send the request using standard tools. No complex headers required, just the content type.

curl -X POST https://n8n.target.com/webhook/uuid-1234-5678 \
     -H "Content-Type: application/json" \
     -d '{"ticket": {"id": 999, "priority": "urgent", "subject": "pwned"}}'

The n8n instance processes this as a valid event. If the workflow has logic like if (ticket.priority === 'urgent') send_slack_alert(), that alert fires. If it has logic like update_database(), the database is corrupt.

The Impact: Automation Abused

Why is this severity only "Moderate" (5.0)? It comes down to the Attack Complexity (AC:H). The attacker needs the specific Webhook URL. Unlike a standard RCE where you hit the root domain, this requires knowledge of a GUID.

However, once that URL is known, the impact can be severe depending on the workflow logic:

  • Data Injection: Flooding the system with fake support tickets.
  • Process Manipulation: Triggering "New Employee Onboarding" workflows to provision accounts.
  • Phishing: Using the n8n instance to send official-looking emails/Slack messages to employees (e.g., "Click here to view urgent ticket").

It turns the automation platform into a proxy for the attacker, bypassing internal firewalls because the requests originate from the trusted n8n server.

The Fix & The Catch

To mitigate this, you must update n8n to version 1.123.18, 2.6.2, or higher. But as mentioned in the code analysis, updating is only half the battle.

The Critical Step: Manual Reactivation Because the fix logic is "fail-open" (to prevent breaking legacy setups), the node will only enforce signature verification if it has fetched the signing secret from Zendesk. This fetch happens during the node's activation phase.

  1. Update your n8n instance.
  2. Open every workflow containing a Zendesk Trigger.
  3. Deactivate the workflow.
  4. Reactivate the workflow.

When you reactivate, n8n makes an API call to Zendesk: GET /webhooks/{id}/signing_secret. It stores this secret. Only then does the verifySignature logic kick in. If you skip this step, you are still vulnerable, even on the latest version.

Official Patches

n8nRelease notes for version 1.123.18

Fix Analysis (1)

Technical Appendix

CVSS Score
5.0/ 10
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:L
EPSS Probability
0.08%
Top 100% most exploited

Affected Systems

n8n (Workflow Automation Tool)Zendesk Trigger Node

Affected Versions Detail

Product
Affected Versions
Fixed Version
n8n
n8n
< 1.123.181.123.18
n8n
n8n
>= 2.0.0, < 2.6.22.6.2
AttributeDetail
Attack VectorNetwork (Webhook Endpoint)
CVSS5.0 (Moderate)
CWECWE-345 (Insufficient Verification)
Exploit StatusPoC Available
ComplexityHigh (Requires URL knowledge)
Privileges RequiredNone

MITRE ATT&CK Mapping

T1566Phishing
Initial Access
T1190Exploit Public-Facing Application
Initial Access
CWE-345
Insufficient Verification of Data Authenticity

Known Exploits & Detection

ManualManual construction of JSON payload sent via curl to the webhook endpoint.

Vulnerability Timeline

Fix committed to repository
2026-01-28
Advisory published on GitHub
2026-01-30
Advisory syndicated to security bulletins
2026-02-09

References & Sources

  • [1]GitHub Advisory GHSA-38c7-23hj-2wgq
  • [2]n8n Zendesk Trigger Documentation

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•44 minutes ago•GHSA-534H-C3CW-V3H9
5.5

GHSA-534h-c3cw-v3h9: Local Information Disclosure via Abstract-Namespace Socket in Nuxt Dev Server

A local security vulnerability in the Nuxt development server (nuxt dev) allows local unprivileged users to access sensitive configuration files and source code. On Linux environments running Node.js 20+, Nuxt bound its internal vite-node IPC server to an abstract-namespace Unix socket without any peer authentication, enabling co-resident local users to connect and request module code directly.

Amit Schendel
Amit Schendel
1 views•5 min read
•about 1 hour ago•GHSA-8RFP-98V4-MMR6
0.0

GHSA-8RFP-98V4-MMR6: Protocol-Filtering Bypass via Unicode Obfuscation in Mozilla Bleach

Mozilla Bleach is an open-source HTML sanitizing library for Python. Versions up to and including 6.3.0 contain an incomplete filtering implementation in the URI validation logic ('sanitize_uri_value'). This logic fails to detect disallowed protocols, such as 'javascript:', if they contain Unicode invisible characters, whitespace characters, or characters with a code point greater than U+00A0. While standard-compliant web browsers do not directly execute invalid URI schemes containing these non-standard characters, downstream systems that normalize Unicode text by stripping invisible or non-ASCII characters can unintentionally reactivate the 'javascript:' prefix, causing Cross-Site Scripting (XSS). Additionally, this behavior violates Bleach's core sanitization contract by outputting URIs that bypass protocol allowlists configured by the caller.

Amit Schendel
Amit Schendel
2 views•7 min read
•about 2 hours ago•GHSA-G75F-G53V-794X
4.3

GHSA-G75F-G53V-794X: CPU Exhaustion via Unbounded Email Regular Expression Scanning in Bleach

An uncontrolled resource consumption vulnerability exists in the Python package Bleach when parsing text to linkify email addresses. When `parse_email=True` is enabled, the regular expression engine is forced into a quadratic-time complexity scan on specially crafted payloads lacking an '@' symbol. This causes immediate CPU exhaustion and blocks application server worker processes.

Amit Schendel
Amit Schendel
2 views•6 min read
•about 2 hours ago•GHSA-GR75-JV2W-4656
4.7

GHSA-GR75-JV2W-4656: Path Traversal and Sandbox Escape in LangChain File-Search Middleware and Loaders

A path traversal and sandbox escape vulnerability in LangChain and LangChain-Anthropic Python packages allows unauthenticated local attackers to access files outside the restricted directory via crafted input, symbolic links, or prefix bypasses.

Alon Barad
Alon Barad
2 views•8 min read
•about 3 hours ago•GHSA-M557-WRGG-6RP4
5.8

GHSA-m557-wrgg-6rp4: Server-Side Request Forgery via Authority Information Access (AIA) Chasing in phpseclib

The PHP Secure Communications Library (phpseclib) contains a Server-Side Request Forgery (SSRF) vulnerability due to an insecure default implementation of Authority Information Access (AIA) certificate chasing. This flaw allows remote, unauthenticated attackers to coerce applications validating user-supplied X.509 certificates into generating arbitrary outbound HTTP requests to internal networks or local interfaces.

Amit Schendel
Amit Schendel
3 views•6 min read
•about 3 hours ago•CVE-2026-45491
6.2

CVE-2026-45491: Directory Traversal via Improper Link Resolution in .NET System.Formats.Tar

A directory traversal vulnerability exists in the Microsoft .NET System.Formats.Tar library during archive extraction. When extracting a TAR archive using the TarFile.ExtractToDirectory API, the extraction engine improperly resolves symbolic links prior to file creation, allowing local unauthorized attackers to write or overwrite arbitrary files outside the target directory. This can lead to local tampering, privilege escalation, or arbitrary code execution.

Amit Schendel
Amit Schendel
7 views•6 min read