Skip to main content

nebula-mgmt EUVDEUVD-2026-71715

| CVE-2026-53602 MEDIUM
Insufficient Session Expiration (CWE-613)
2026-07-09 https://github.com/forgekeep/nebula-mesh GHSA-339v-266x-79xr
6.9
CVSS 4.0 · Vendor: https://github.com/forgekeep/nebula-mesh
Share

Severity by source

Vendor (https://github.com/forgekeep/nebula-mesh) PRIMARY
6.9 MEDIUM
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X
vuln.today AI
5.4 MEDIUM

Prior enrollment credentials are the minimum privilege (PR:L); auto-renewal path requires no user interaction; impact limited to low-level overlay network access bypass with no availability dimension.

3.1 AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:N
4.0 AV:N/AC:L/AT:N/PR:L/UI:N/VC:L/VI:L/VA:N/SC:N/SI:N/SA:N

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

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

Attack Vector
Network
Attack Complexity
Low
Privileges Required
None
User Interaction
None
Scope
X

Lifecycle Timeline

2
CVSS changed
Sep 04, 2026 - 20:22 NVD
6.9 (MEDIUM)
Analysis Generated
Jul 09, 2026 - 21:21 vuln.today

DescriptionCVE.org

Summary

Two related authorization gaps let a host that should no longer be trusted obtain a fresh, valid Nebula certificate, because nebula-mgmt does not re-evaluate revocation/authorization state at certificate *issuance* time - only at poll time.

1. Blocklist not enforced at sign / re-enroll time

internal/api/enroll.go:128 calls caMgr.Sign(...) without consulting the blocklist. The blocklist is only checked in the poll path (internal/api/updates.go:57, fingerprintInBlocklist). The blocklist is keyed by certificate *fingerprint* (internal/store/sqlite.go), so a re-enrollment produces a new fingerprint that is not in the blocklist.

mintEnrollmentTokenForHost (internal/api/hosts.go:491) authorizes the caller via canAccessHost but does not check the host status. There is no guard preventing a blocked host from transitioning back to enrolled (internal/store/sqlite.go, enrollHostInTx updates status unconditionally).

Impact: A host that an operator has blocked can be silently un-blocked by issuing a new enrollment token and re-enrolling - it receives a fresh certificate (new fingerprint) that passes all subsequent poll-time blocklist checks. Revocation is therefore not durable. Requires an operator action (minting a re-enroll token), so this is an integrity/operational-revocation failure rather than an unauthenticated bypass.

2. Renewal does not re-validate operator / CA status

Auto-renewal at poll time (internal/api/updates.go:285-319, signHostCert) reads host.Name, host.Groups, host.NebulaIPs from the DB and re-signs without checking whether the owning operator is still active or the CA still valid. DisableOperator (internal/store/sqlite_operators.go) revokes sessions and API keys but does not retire the operator's CAs, and pki/signer.go checks only CA cert time-expiry, not operator/CA status.

Impact: A host enrolled under an operator who is later disabled continues to renew its certificate indefinitely. Offboarding an operator does not cut off the hosts they provisioned.

Affected versions

Latest tagged release (v0.3.6) and main.

Remediation

  1. Call a blocklist/status guard inside handleEnroll and signHostCert before caMgr.Sign(...); refuse issuance for a host whose status is blocked or whose previous fingerprint is on the blocklist. Require an explicit unblock before re-enroll.
  2. At renewal, re-resolve the owning operator/CA status and reject renewal if the operator is disabled or the CA retired (force re-enrollment instead).

Discovery

Found during an internal source + offensive security audit (tracking issue #178). Adversarially cross-verified against the code paths above.

AnalysisAI

Certificate revocation in nebula-mgmt (forgekeep/nebula-mesh ≤ v0.3.6) is non-durable due to two distinct authorization gaps at certificate issuance time. Blocked hosts bypass blocklist enforcement entirely by re-enrolling with a new token because enroll.go:128 calls caMgr.Sign() without consulting the blocklist - a fingerprint-keyed structure that treats any fresh certificate as unknown. Separately, hosts enrolled under a subsequently-disabled operator auto-renew certificates indefinitely because signHostCert never re-validates operator or CA lifecycle status, meaning operator offboarding does not terminate provisioned host access. No public exploit is identified at time of analysis; both issues were discovered during an internal offensive security audit (tracking issue #178).

Technical ContextAI

nebula-mgmt is the management-plane component of forgekeep/nebula-mesh, a self-hosted control plane for the Nebula overlay network protocol (pkg:go/github.com_forgekeep_nebula-mesh). The vulnerability class is CWE-613 (Insufficient Session Expiration), expressed here as incomplete revocation enforcement across two code paths. The blocklist in internal/store/sqlite.go is keyed by certificate fingerprint, making it structurally bypassable by any operation that generates a new certificate. The sign path at internal/api/enroll.go:128 invokes caMgr.Sign() with no blocklist guard; that guard exists only in the poll path at internal/api/updates.go:57 (fingerprintInBlocklist). The host-status transition function enrollHostInTx updates status unconditionally, allowing a blocked host to transition back to enrolled without any explicit unblock step. For the renewal gap, signHostCert (internal/api/updates.go:285-319) reads host.Name, host.Groups, and host.NebulaIPs from the database and re-signs without querying operator or CA revocation state. DisableOperator in internal/store/sqlite_operators.go revokes sessions and API keys but does not retire the operator's CAs, and pki/signer.go validates only certificate time-expiry - not operator lifecycle status.

RemediationAI

No vendor-released patch is identified at time of analysis; the advisory at https://github.com/forgekeep/nebula-mesh/security/advisories/GHSA-339v-266x-79xr describes code-level fixes but references no tagged release containing them. The prescribed upstream fix is: add a blocklist/status guard inside handleEnroll and signHostCert before caMgr.Sign() that refuses issuance for any host whose status is blocked or whose prior fingerprint is on the blocklist, and require explicit operator unblock before re-enrollment; additionally, re-resolve owning operator and CA status at renewal time and force re-enrollment if either is retired or disabled. Until a patch is released, operators should strictly audit which accounts can call mintEnrollmentTokenForHost and limit that permission to a minimal set of trusted operators, immediately retire CA keys associated with disabled operators (out-of-band, as the software does not do this automatically), and monitor certificate issuance logs for unexpected re-enrollments. Restricting access to the enrollment API endpoint at the network layer for known-blocked hosts provides a compensating control for Issue 1 but does not address the renewal path in Issue 2.

Vendor StatusVendor

SUSE

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

Share

EUVD-2026-71715 vulnerability details – vuln.today

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