CVE-2026-47768Medium· 5.5▾ Sunlitnebula-mesh: Newly-minted operator API key exposed in redirect URL (Referer, history, proxy logs)
▾ Sunlit zone — Low / medium · no exploitation signal
impact 30.3 · likelihood 0 · exploitation 0
Need a working PoC? Pro members can cast a request and our team develops one — it lands right here.
Exploit-prediction probability, daily snapshots since Jul 29.
Disclosure to exploitation, from the record and what we observed since indexing it.
Disclosed via GHSA
0.1%
internal/web/operators.go:251 — after handleOperatorCreateAPIKey mints a fresh 32-byte bearer token, the redirect points the operator's browser at:
/ui/operators/<id>?new_key=<raw-token>&key_name=<name>
The raw API key ends up:
Referer header on every cross-origin asset the detail page loads (any third-party SVG/CSS/JS resource the layout pulls in)combined log captures the query string)Authorization: Bearer <token> headers go through the same hops without these problems because access logs typically don't capture request headers and the browser doesn't replay headers cross-origin.
Same handler also appends name (r.FormValue("name")) to the query string without url.QueryEscape, so an & in the operator-supplied key name corrupts query parsing and a \r\n in older proxies could split response headers.
All released versions up to v0.3.1.
As admin, create an API key via /ui/operators/<id>/api-keys (form POST). The 303 Location header carries the raw token in the query string. Open browser DevTools → Network → response headers; or check the reverse-proxy access log; or check the operator-detail page's Referer-emitting fetches.
Stash the raw key in a one-shot server-side flash storage (e.g., a row in operator_sessions keyed by session token, with a one_shot_token column and consumed_at) or in a short-lived signed cookie. Render the key once inline on the detail page after the redirect, and clear the storage on render. Pattern mirrors the recovery-codes display in the TOTP flow.
If the flash-storage refactor is too invasive, the minimal fix is to render the key inline via a POST → 200 OK with HTML (no redirect), losing the post-redirect-get idiom but eliminating the URL exposure.
Also fix name query encoding with url.QueryEscape regardless of which fix shape lands.
AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N — 5.5 (medium). AV:L because realistic exploit requires log-read access on shared infrastructure (proxy, CDN, browser-history backup) the operator's session touches.
github.com/juev/nebula-mesh <= 0.3.1Upgrade to a patched release:
github.com/juev/nebula-mesh 0.3.2Connected by shared product, vendor, weakness, or advisory.
CVE-2026-47722Highnebula-mesh: Host advanced overrides allow YAML injection into agent config.yml
CVE-2026-47723Highnebula-mesh: Web UI and API responses lack security headers (CSP, X-Frame-Options, HSTS, etc.)
CVE-2026-47724Critical· 9.9nebula-mesh: API endpoints lack ownership checks, enabling cross-operator privilege escalation
CVE-2026-47725Highnebula-mesh's web UI lacks CSRF tokens on /ui/* mutating endpoints
CVE-2026-47726Highnebula-mesh: GET /api/v1/audit-log discloses all entries to any operator
CVE-2026-48025Mediumnebula-mesh: Decrypted CA private key persists in heap after signing