highCVSS 7.7Vulnerability

GHSA-7rx3-5wx3-5v76

### Summary Non-admin operators (role `user`) can set `allow_private: true` on their own managed webhook subscription (`POST`/`PATCH /api/v1/webhook-subscriptions`). No admin check exists on this field. At delivery time, `allow_private` switches the dispatcher to an unguarded HTTP client, bypassing the private/loopback/link-local SSRF guard — letting a low-privilege operator make the server request internal addresses. ### Details `internal/api/webhooks.go:67` (`handleCreateWebhookSubscription`) and `:110` (`handleUpdateWebhookSubscription`) persist operator-supplied `AllowPrivate` with no role check — only ownership is enforced (`canAccessWebhookSub`), and that's not even called on create. `internal/webhook/webhook.go:294-296`: ```go client := d.guarded if tgt.AllowPrivate { client = d.unguarded } ``` `d.unguarded` skips the loopback/private/link-local rejection `config.ValidateWebhookURL` otherwise enforces. Every other tenant-impacting toggle (network create `internal/api/networks.go:21`, settings PATCH `internal/api/settings.go:36`, CA management) gates on `isActiveAdmin`. `allow_private` is the exception — introduced with managed webhook subscriptions (PR #258) and missed by the two prior fixes for the same authz-gap class in this repo (GHSA-598g-h2vc-h5vg, GHSA-c6v2-3ffm-vcmc). ### PoC Verified live against a real running instance of nebula-mesh (HEAD `2c3457c`, built and run locally, no third-party requests made — the "internal service" below is a loopback listener standing in for one). Setup: `nebula-mgmt init` + `serve` on `127.0.0.1:8181`; admin CLI creates operator `lowpriv` with `-role user` and mints it an API key (`d984bb...c7c`) — the routine, legitimate way any non-admin operator gets access. `lowpriv` self-mints its own CA (`POST /api/v1/cas`, allowed for any operator) and creates a host on a network scoped to that CA, so it owns something it can legitimately act on. **Step 1 — create-side bypass, as the non-admin `lowpriv` operator:** `

Properties

ghsa_id
GHSA-7rx3-5wx3-5v76
severity
high
summary
Nebula-mesh allows non-admin operators to disable webhook SSRF protection via `allow_private`
cvss_score
7.7
cve_id
GHSA-7rx3-5wx3-5v76
cvss_vector
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N
is_ghsa_only
true
ghsa_published
2026-07-14T20:28:42Z
source_url
https://github.com/advisories/GHSA-7rx3-5wx3-5v76
ghsa_updated
2026-07-14T20:28:43Z

Related Entities (5)

VULNERABLE_TO (1)

[Software]go/github.com/forgekeep/nebula-mesh

AFFECTS (1)

[Software]go/github.com/forgekeep/nebula-mesh

HAS_WEAKNESS (2)

[Weakness]Missing Authorization
[Weakness]Server-Side Request Forgery (SSRF)

REPORTED_BY (1)

[Source]GitHub Advisory Database

Explore deeper with Ninja Signal's threat intelligence graph