Skip to main content

nebula-mesh CVE-2026-47724

| EUVDEUVD-2026-48426 CRITICAL
Missing Authorization (CWE-862)
2026-06-08 https://github.com/juev/nebula-mesh GHSA-598g-h2vc-h5vg
9.9
CVSS 3.1 · Vendor: https://github.com/juev/nebula-mesh
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Recon
    Obtain low-priv operator API key
  2. Delivery
    POST /api/v1/operators/{admin-id}/api-keys
  3. Exploit
    Receive admin bearer token
  4. Install
    POST /api/v1/hosts/{victim}/reenroll
  5. C2
    Submit attacker keypair to /api/v1/enroll
  6. Execute
    Overwrite victim signing_pub_pem and cert
  7. Impact
    Seize Nebula identity and cross-tenant CRUD

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V8 - Authorization Authorization checks on every request
MITRE ATT&CK

1 technique across 1 tactic: Privilege Escalation

The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up.

Exploitation Conditions

Requires any valid operator API bearer token for the target nebula-mesh server (PR:L in CVSS vector) - admin role is NOT required; the bug specifically lets a non-admin operator key call admin- and cross-tenant-only endpoints. No user interaction, no special server configuration, and no non-default deployment mode is needed: every release prior to v0.3.4 is affected out of the box, because the gap is in the API authorization model itself, not a toggle. Limiting factors: the attacker must already possess a valid operator API key (not anonymous), the server's /api/v1/* surface must be network-reachable from the attacker, and CA-management endpoints in internal/api/cas.go are NOT exploitable (they correctly enforce canAccessCA); the gap is specifically on host, network, firewall, mobile-bundle, and most operator-management handlers.

Impact

The CVSS 3.1 vector AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H scoring 9.9 is consistent with the described impact: network-reachable API, low complexity (single curl request), low privileges (any operator API key suffices), changed scope (one operator compromises others' tenancy), and full CIA impact. The vendor confirms a patch in v0.3.4 and CWE-862 is well-supported by the source-level evidence in the diff. No KEV listing and no EPSS data are provided, and no public exploit identified at time of analysis - though the advisory itself publishes ready-to-run curl payloads for chains A and B, which substantially lowers the barrier for opportunistic exploitation once an attacker has any operator credential. The PR:L requirement is the main limiting factor: this is not a remote-unauthenticated bug but a horizontal/vertical escalation that turns any low-privilege operator key into full admin and cross-tenant ownership, so realistic risk is highest for multi-tenant deployments with several operators or where operator keys may be leaked.

Exploit ScenarioDerived

A contractor with a low-privilege operator API key issues POST /api/v1/operators/<admin-id>/api-keys with their bearer token and receives a freshly minted admin bearer (chain A); reusing it, they enumerate every tenant's hosts and call POST /api/v1/hosts/<victim-host-id>/reenroll to obtain an enrollment token, then submit their own X25519/Ed25519 keypair to /api/v1/enroll (chain B), overwriting the legitimate agent's signing key and certificate and seizing the victim's Nebula identity. Working curl payloads for both chains are published in the GHSA advisory, so a credentialed insider or anyone who phishes an operator key can reproduce the attack in seconds.

Act Now Prioritize within 24-48h. Why: CRITICAL severity.
Patch available 0.0% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Jun 08, 2026

Privilege escalation and cross-tenant resource takeover in juev/nebula-mesh versions prior to v0.3.4 allow any authenticated low-privilege operator to mint admin API keys, hijack other operators' hosts via the reenroll endpoint, and perform unauthorized CRUD across hosts, networks, and firewall rules. The /api/v1/* route surface trusts the bearer token for authorization without enforcing per-CA ownership checks that the Web UI applies, breaking the per-operator CA tenancy model from ADR 0002. No public exploit identified at time of analysis, though a detailed exploit chain with working curl commands is published in the GHSA advisory.

RemediationAI

Vendor-released patch: upgrade github.com/juev/nebula-mesh to v0.3.4 or later, which introduces the isActiveAdmin helper and applies admin/ownership gates across host, network, firewall, mobile-bundle, and operator-management handlers (see commit 9d8bcd7667ecd0c2975cc71fb35a02fe131f76f2 and advisory GHSA-598g-h2vc-h5vg). Until the upgrade can be deployed, restrict the /api/v1/* surface to admin-trusted networks via a reverse proxy or firewall, rotate and tightly scope all non-admin operator API keys, and consider temporarily routing operator workflows through the Web UI (which already enforces loadAccessibleCA); note that blocking the API surface will break automation that legitimately consumes operator API keys. Audit operator API key issuance and host reenrollment logs for the timeframe prior to patching, since chains A and B leave traces in the operators and hosts tables (fresh keys, overwritten signing_pub_pem).

Affected VersionsENISA

nebula-mesh < 0.3.4

Affected Packages

go github.com/juev/nebula-mesh fix: 0.3.4
euvd nebula_mesh fix: 0.3.4

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 2 packages in go, euvd

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

nebula-mesh is a Go-based management server for Nebula overlay networks (package github.com/juev/nebula-mesh), providing a multi-tenant control plane where operators own Certificate Authorities (CAs) that in turn scope hosts, networks, and firewall rules. The root cause is CWE-862 (Missing Authorization): the API layer (internal/api/hosts.go, internal/api/operators.go, network and firewall handlers) authenticates the bearer token but never resolves the target resource's owning CA against the actor's CA ownership - a check the Web layer correctly performs via loadAccessibleCA in internal/web/cas.go, and which the CA endpoints themselves enforce via canAccessCA. A code comment at hosts.go:384 explicitly documents the gap. The fix introduces an isActiveAdmin helper in a new internal/api/authz.go that re-fetches the actor from the operators table on each call, closing both the snapshot-staleness gap and (partially) a TOCTOU window between authz and the mutating SQL.

Know when the next one hits your stack

  • Watch products and get an email when something new is published
  • Check this CVE against your own stack and servers
  • Exploit and PoC references, threat intelligence from 22 sources

No credit card · 7-day full trial

Severity by source

Vendor (https://github.com/juev/nebula-mesh) PRIMARY 9.9 CRITICAL
AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H
SUSE CRITICAL

Primary rating from Vendor (https://github.com/juev/nebula-mesh).

CVSS VectorVendor: https://github.com/juev/nebula-mesh

Attack Vector
Network
Attack Complexity
Low
Privileges Required
Low
User Interaction
None
Scope
Changed
Confidentiality
High
Integrity
High
Availability
High

DescriptionCVE.org

The /api/v1/* route surface trusts the bearer token alone for authorisation on most endpoints. The codebase itself admits this at internal/api/hosts.go:384: *"API trusts the bearer token for authorisation; per-CA ownership is enforced only in the Web layer."*

The Web UI gates state-changing routes through loadAccessibleCA (internal/web/cas.go); CA-management endpoints in internal/api/cas.go ALSO have proper canAccessCA gates. The gap is on the host, network, firewall, mobile-bundle, and most operator endpoints. Combined with the per-operator CA model from ADR 0002, this gives any non-admin operator API key broad cross-tenant access - instant privilege escalation in the worst case.

Affected

All released versions prior to v0.3.4.

Exploit chain

A) Mint admin API key from any operator key (instant privilege escalation)

internal/api/operators.go:118 - handleCreateOperatorAPIKey does no admin check and no actor/target-operator ownership check. Any operator key can call it for any operator (including admins) and receive a fresh bearer.

curl -X POST -H "Authorization: Bearer <low-priv-key>" \
  https://server/api/v1/operators/<admin-id>/api-keys \
  -H 'Content-Type: application/json' -d '{"name":"oops"}'
# Returns: {"key":"<32-byte admin bearer>","entry":{...}}

Reuse the returned key for subsequent requests → full admin.

B) Cross-operator host takeover via reenroll

internal/api/hosts.go:321,330 → mintEnrollmentTokenForHost. Looks up host by URL param, mints a single-use enrollment token, returns it. No ownership check.

curl -X POST -H "Authorization: Bearer <low-priv-key>" \
  https://server/api/v1/hosts/<victim-host-id>/reenroll
# Returns: {"enrollment_token":"<uuid>",...}

Caller POSTs /api/v1/enroll with their own X25519 + Ed25519 keypairs. enroll.go:175 overwrites signing_pub_pem; SaveCertificateAndEnrollHost overwrites the cert. Legitimate agent's next signed poll fails bad_signature. Attacker now owns the victim's Nebula identity.

C) Cross-tenant CRUD on hosts, networks, firewall

The same gap applies across:

  • /api/v1/hosts* - create, list, get, update, delete, block, unblock
  • /api/v1/networks* - create, list, get
  • /api/v1/networks/{id}/firewall - get, PUT
  • /api/v1/hosts/{id}/mobile-bundle (already filed as public issue #119)

All trust bearer-auth alone. Any operator can read or mutate any other operator's resources.

Affected operator-management handlers (in addition to A)

Beyond handleCreateOperatorAPIKey (covered by A), internal/api/operators.go is missing admin gates on:

  • handleListOperators (line 66) - operator roster info disclosure
  • handleDisableOperator (line 79) - DoS / sabotage
  • handleEnableOperator (line 94) - re-enable disabled operators
  • handleRevokeOperatorAPIKey (line 157) - invalidate any operator's API keys
  • handleListOperatorAPIKeys (line 173) - API-key metadata disclosure

handleCreateOperator (line 26) IS properly gated (actorIsAdmin at line 27).

NOT affected (verified)

internal/api/cas.go properly gates every CA endpoint via canAccessCA (calls at lines 70, 176, 216) and admin shortcuts at lines 39, 82. An earlier description draft mistakenly listed /api/v1/cas/{id}/rotate as affected - that endpoint is properly protected. CAs are not in this gap.

Impact

  • Any non-admin operator → admin via one curl (A).
  • Any non-admin operator → ownership of any victim's hosts with cert + identity transfer (B).
  • Mass cross-tenant CRUD including firewall-rule mutation (C).
  • Any operator → disable/enable other operators, revoke their API keys, enumerate the operator roster.

CVSS 3.1: AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H - 9.6.

Suggested fix

Shared helpers in a new internal/api/authz.go, mirroring the Web layer's loadAccessibleCA:

go
func (s *Server) requireAdmin(w http.ResponseWriter, r *http.Request) bool
func (s *Server) requireOperatorAccess(w http.ResponseWriter, r *http.Request, operatorID string) bool
func (s *Server) requireHostAccess(w http.ResponseWriter, r *http.Request, hostID string) (*models.Host, bool)
func (s *Server) requireNetworkAccess(w http.ResponseWriter, r *http.Request, networkID string) (*models.Network, bool)

Each loads the resource, resolves its CA via *.CAID, accepts if actorIsAdmin(ctx) OR actor owns the CA. Reject 403 forbidden; audit-log api.<resource>.forbidden with the reason.

The operator-management endpoints take requireAdmin instead (operator ownership doesn't map to CA ownership).

Apply at the top of every host-, network-, firewall-, mobile-bundle-touching API handler, plus the 5 operator endpoints listed above. The legacy config-key path retains admin (preserves backward compatibility); the broader legacy-fallback question is tracked separately as issue #121.

Test matrix

  • admin → all operations permitted
  • owning non-admin → operations on owned hosts/networks permitted
  • non-owner non-admin → 403 + audit entry
  • legacy config-key → preserved (admin)
  • unauthenticated → existing 401 from middleware

Coordinated context

Subsumes public issue #119 (mobile-bundle authz). Issue #121 (actor.go:40 legacy-admin fallback) is a separate concern tracked independently.

Executive ViewAI

Why It Matters

Nebula-mesh versions prior to 0.3.4 contain a critical authentication bypass enabling any operator account to escalate to administrative privileges and access other organizations' infrastructure in multi-tenant deployments. This breaks operator isolation across shared network segments and enables unauthorized control of firewall policies, affecting all organizations relying on this platform for network infrastructure.

Business Impact: Severe
Compensating Controls

Apply vendor patch (upgrade to v0.3.4 or later immediately). If upgrade delayed: restrict API endpoint access to internal networks only; temporarily disable the host reenroll endpoint; implement real-time alerting on all admin API key generation events; enable comprehensive API request logging with immutable audit trail.

Threat Intelligence Overview

EPSS Score
0.0%
Top 94% exploitable
Threat Intel
1
1 source
Data Quality
6 sources
Confidence: High

How this decision was reached

The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.

SignalValue
Severity CRITICAL
CISA KEV No
Public POC No
EPSS 0.0%
Patch available Yes
Active threat No
Deciding rule
CRITICAL severity
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation· derived
None
System Exposure· derived
Open
Automatable· derived
No
Human Impact
Very High

Priority Score

50
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +50
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Authentication bypass attacks exploit flaws in the verification mechanisms that control access to systems and applications.

Privilege escalation occurs when an attacker leverages flaws in access control mechanisms to gain permissions beyond what they were originally granted.

Vendor StatusVendor

SUSE

Severity: Critical
Product Status
SUSE Linux Enterprise Server 16.1 Affected
SUSE Linux Enterprise Server for SAP applications 16.1 Affected
SUSE Linux Enterprise Module for Package Hub 15 SP5 Affected
SUSE Linux Enterprise Module for Package Hub 15 SP6 Affected
openSUSE Leap 15.5 Affected

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy