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-7RX3-5WX3-5V76

GHSA-7rx3-5wx3-5v76: Missing Authorization in Nebula-mesh Webhook Subscription API Enables Server-Side Request Forgery

Amit Schendel
Amit Schendel
Senior Security Researcher

Jul 14, 2026·4 min read·14 visits

Executive Summary (TL;DR)

A missing authorization check in Nebula-mesh allows non-admin operators to toggle the 'allow_private' parameter on webhooks, bypassing SSRF guards and allowing them to target internal systems.

Nebula-mesh allows non-admin operators to disable webhook SSRF (Server-Side Request Forgery) protection via the allow_private parameter. Low-privilege operators can configure webhook endpoints targeting internal endpoints and trigger lifecycle events on resources they own, bypassing network access controls.

Vulnerability Overview

In Nebula-mesh, non-admin operators (possessing the role user) can register and manage webhook subscriptions. The API exposes POST and PATCH endpoints at /api/v1/webhook-subscriptions to handle the webhook subscription lifecycle.

A severe authorization gap exists in this design. When creating or updating a webhook subscription, operators can set the parameter allow_private: true on their subscription requests. The backend fails to verify whether the operator has administrative privileges before persisting this parameter.

At the event delivery phase, when an event is fired, the event dispatcher checks the AllowPrivate field of the target subscription. If AllowPrivate is false, the dispatcher uses a guarded HTTP client that validates the destination URL and rejects loopback, private, and link-local addresses. If AllowPrivate is true, the dispatcher switches to an unguarded HTTP client, completely bypassing the Server-Side Request Forgery (SSRF) defenses.

Root Cause Analysis

The technical root cause of this vulnerability lies in the missing role-based access control (RBAC) within the webhook creation and modification controllers. In the file internal/api/webhooks.go, the handlers handleCreateWebhookSubscription and handleUpdateWebhookSubscription unpack client-provided payloads into internal model structs without filtering administrative toggles.

Specifically, the application defines a parameter named allow_private which allows requests to target loopback and RFC 1918 private subnets. Although the application contains a helper function s.isActiveAdmin(r.Context()) to enforce administrative restrictions on other handlers, this validation check was omitted from the webhook endpoints.

This structural oversight allows low-privilege operator sessions to successfully register endpoints matching loopback (127.0.0.1, localhost), private (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16), and link-local networks. The application then trustingly maps these configurations to an unguarded HTTP delivery engine during asynchronous event dispatch operations.

Code Analysis

The vulnerability is resolved by explicitly introducing s.isActiveAdmin(r.Context()) verification before checking the validation rules of the incoming webhook configuration request.

Below is the code difference from the patched file internal/api/webhooks.go:

@@ -70,6 +70,10 @@ func (s *Server) handleCreateWebhookSubscription(w http.ResponseWriter, r *http.
 		writeError(w, http.StatusBadRequest, "invalid request body")
 		return
 	}
+	if req.AllowPrivate && !s.isActiveAdmin(r.Context()) {
+		writeError(w, http.StatusForbidden, "allow_private requires the admin role")
+		return
+	}
 	if err := config.ValidateWebhookURL("url", req.URL, req.AllowPrivate); err != nil {
 		writeError(w, http.StatusBadRequest, err.Error())
 		return
@@ -120,6 +124,10 @@ func (s *Server) handleUpdateWebhookSubscription(w http.ResponseWriter, r *http.
 	if req.URL == "" {
 		req.URL = sub.URL
 	}
+	if req.AllowPrivate && !s.isActiveAdmin(r.Context()) {
+		writeError(w, http.StatusForbidden, "allow_private requires the admin role")
+		return
+	}
 	if err := config.ValidateWebhookURL("url", req.URL, req.AllowPrivate); err != nil {
 		writeError(w, http.StatusBadRequest, err.Error())
 		return

While the patch successfully eliminates the direct authorization bypass on the allow_private parameter, organizations should evaluate remaining edge cases. The application relies on standard HTTP client resolution, which may be susceptible to DNS Rebinding variants if the destination hostname resolves to a public address during validation and a local address during socket connection.

Exploitation Methodology

Exploitation requires the attacker to possess an active session token with the base non-admin user role. Using this session, the attacker can configure and trigger the SSRF sequence.

To construct the bypass, the attacker submits a structured registration payload specifying allow_private set to true and pointing the delivery destination to an internal network target:

POST /api/v1/webhook-subscriptions HTTP/1.1
Host: 127.0.0.1:8181
Authorization: Bearer d984bbe6680a9b3f57def0caf8556466e502d35c8c287bd2f1fd6938fcda2e7c
Content-Type: application/json
 
{
  "url": "http://127.0.0.1:9999/internal-admin",
  "allow_private": true,
  "events": ["host.enrolled"]
}

Once registered, the attacker triggers an event associated with the subscription (e.g., enrolling or unblocking a host resource). The server processes the event, retrieves the subscription payload, and executes an asynchronous, blind POST request using its unguarded client. The attacker can subsequently poll the /api/v1/webhook-subscriptions/{id} endpoint to view the request dispatch status, using the returned error metrics as a rudimentary port scanner and reachability oracle.

Impact Assessment

The impact of this vulnerability is severe because it allows low-privilege actors to query restricted internal infrastructure directly from the host operating the Nebula-mesh service.

This network reachability bypasses firewalls and network segmentation rules. Attackers can interact with loopback management interfaces, probe ports on peer network hosts, or query Cloud Metadata Services (e.g., IMDSv1 at 169.254.169.254) to exfiltrate administrative IAM credentials.

Because the webhook dispatch mechanism processes responses and populates debugging information in the subscription metadata, the attacker gains a functional infrastructure scanning and enumeration vector. This allows them to systematically map internal services, potentially preparing for secondary exploits against vulnerable private APIs.

Fix Analysis (1)

Technical Appendix

CVSS Score
7.7/ 10
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N

Affected Systems

Nebula-mesh

Affected Versions Detail

Product
Affected Versions
Fixed Version
github.com/forgekeep/nebula-mesh
forgekeep
>= 0.6.0, <= 0.7.10.7.2
AttributeDetail
CWE IDCWE-862, CWE-918
Attack VectorNetwork
CVSS v3.1 Score7.7
Exploit Statuspoc
ImpactServer-Side Request Forgery (SSRF)

MITRE ATT&CK Mapping

T1190Exploit Public-Facing Application
Initial Access
T1083System Information Discovery
Discovery
CWE-918
Server-Side Request Forgery (SSRF)

The web application receives a user-supplied URL, passes it through, and makes a request to it on behalf of the attacker, bypassing security boundaries.

Known Exploits & Detection

GHSA-7rx3-5wx3-5v76 Advisory DetailsProof of concept showcasing how non-admin operators can trigger outbound webhook requests to arbitrary loopback destinations.

Vulnerability Timeline

Vulnerability reported and validation fix commit f3c54530e388dd21763e548923426e60a8e93ff0 submitted
2026-07-01
Version 0.7.2 released containing security patches
2026-07-14
Official Advisory GHSA-7rx3-5wx3-5v76 published
2026-07-14

References & Sources

  • [1]GitHub Security Advisory GHSA-7rx3-5wx3-5v76
  • [2]Nebula-mesh Security Advisory
  • [3]Official Fix Commit
  • [4]Nebula-mesh v0.7.2 Release Tag

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

•about 10 hours ago•CVE-2026-54720
5.4

CVE-2026-54720: Stored Cross-Site Scripting (XSS) via Sandbox Bypass in Silverstripe Framework

CVE-2026-54720 is a stored Cross-Site Scripting (XSS) vulnerability inside the Silverstripe Framework's media shortcode processor. Due to a flawed performance optimization, HTML inputs containing two or fewer opening angle brackets bypassed security sandboxing. This flaw allows authenticated or lower-privileged users to inject administrative panel payloads that execute arbitrary client-side JavaScript when viewed by system administrators.

Amit Schendel
Amit Schendel
3 views•6 min read
•about 11 hours ago•CVE-2026-54713
3.7

CVE-2026-54713: Idempotency Key Collision and Silent Job Dropping in cakephp/queue

An incomplete array comparison vulnerability in cakephp/queue version 0.1.11 through 2.3.0 allows unauthenticated attackers to cause key collisions in unique job deduplication. This is caused by standard array value sorting that discards associative keys, normalizing different payload keys to identical arrays and leading to a denial of service (DoS) by dropping legitimate jobs.

Alon Barad
Alon Barad
2 views•7 min read
•about 12 hours ago•CVE-2026-55558
5.9

CVE-2026-55558: STARTTLS Response Injection in aiosmtplib

An input buffering vulnerability exists in the aiosmtplib asynchronous SMTP client library before version 5.1.2. When upgrading a plaintext connection to TLS via STARTTLS, the library processes buffered plaintext responses after transport negotiation has completed. This behavior allows a network-positioned attacker to inject spoofed server responses prior to negotiation, leading to command/response desynchronization, arbitrary capability injection, and potential credential theft.

Alon Barad
Alon Barad
2 views•6 min read
•about 13 hours ago•CVE-2026-54770
6.1

CVE-2026-54770: Open Redirect via Parser Differential in WebOb

An open redirect vulnerability exists in WebOb before version 1.8.11 due to a parser differential between WebOb's validation logic and Python's standard urllib.parse.urljoin() function. Under Python 3.10+, the urljoin function strips leading and trailing space characters and C0 control characters, which allowed specially crafted inputs to bypass WebOb's prefix checks while still resolving as off-host redirects.

Amit Schendel
Amit Schendel
3 views•7 min read
•about 14 hours ago•CVE-2026-54687
6.1

CVE-2026-54687: Path Traversal via User-Controlled Database File Path in n8n-nodes-sqlite3

Prior to version 1.0.0, the n8n-nodes-sqlite3 integration exposed the db_path parameter as an unrestricted node parameter. By default, n8n node parameters allow the evaluation of dynamic data expressions, meaning untrusted external input could be mapped to the database path. This vulnerability allows an external attacker to control which SQLite database file the n8n backend process attempts to open, leading to directory traversal outside of the intended directory context.

Amit Schendel
Amit Schendel
6 views•5 min read
•about 15 hours ago•CVE-2026-42350
5.1

CVE-2026-42350: Client-Side Open Redirect in Kargo UI OIDC Authentication Flow

A client-side open redirect vulnerability has been identified in the Kargo user interface. The flaw resides in the handling of OpenID Connect (OIDC) login and token renewal flows, where the application extracts an unvalidated destination path from the redirectTo query parameter. Attackers can exploit this to redirect authenticated users to arbitrary external domains.

Alon Barad
Alon Barad
4 views•6 min read