Severity by source
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:N/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
AC:H because database read access is a genuine secondary prerequisite; C:H for full session token exposure; I:N and A:N as no integrity or availability impact applies.
Primary rating from Vendor (https://github.com/forgekeep/nebula-mesh).
CVSS VectorVendor: https://github.com/forgekeep/nebula-mesh
Lifecycle Timeline
6DescriptionCVE.org
Impact
Operator session tokens are stored in plaintext in the operator_sessions table (the token column is the PRIMARY KEY). The session token is a 32-byte random hex value sent directly in a cookie and valid for 24 hours.
internal/models/operator.go:61-OperatorSession.Tokenholds the plaintext token.internal/store/sqlite_operators.go:590-CreateOperatorSessioninsertssess.Tokenverbatim.internal/store/sqlite_operators.go:603,642,681,698- lookups/updates/deletes useWHERE token = ?against the plaintext value.
Anyone who can read the database (backup, snapshot, file copy, or SQL-level disclosure) obtains every active session token and can hijack operator sessions directly, with no further authentication.
This is functionally identical to the plaintext enrollment-token issue fixed in GHSA-ghmh-jhmj-wcmf. API keys (OperatorAPIKey.KeyHash) and enrollment tokens (EnrollmentToken.TokenHash) already store only a SHA256 hash; session tokens were missed.
Patches
Store only a SHA256 hash of the session token, mirroring API keys and enrollment tokens:
- Add a
HashSessionTokenhelper (alongside the existing token-hash helpers). - Migration to add a
token_hashcolumn. - Update
CreateOperatorSession,PromoteOperatorSession, andGetOperatorBySessionto write/look up by hash. - Drop the plaintext
tokencolumn in a follow-up migration.
Sessions are ephemeral (24h TTL), so all active sessions can be invalidated on deployment - no backward compatibility needed.
Workarounds
Restrict and encrypt database backups; rotate the operator database. These mitigate exposure but do not fix the underlying storage of plaintext tokens.
Resources
internal/models/operator.go:58-66internal/store/sqlite_operators.go:577-698- Migration
005_operators.up.sql:27 - Prior related advisory: GHSA-ghmh-jhmj-wcmf
AnalysisAI
Plaintext session token storage in nebula-mesh's SQLite operator_sessions table exposes every active operator session to anyone who can read the database. All versions through 0.3.7 of the Go-based mesh network management tool (pkg:go/github.com/forgekeep/nebula-mesh) insert 32-byte hex session tokens verbatim as the primary key in operator_sessions, meaning a database backup, snapshot, file copy, or a future SQL-injection disclosure path yields all tokens needed for immediate session hijack. The fix, shipped in v0.3.8 (commit 7cb01bab), mirrors the SHA-256 hashing already applied to API keys and enrollment tokens; no public exploit or active exploitation has been identified at time of analysis.
Technical ContextAI
nebula-mesh is a Go application (pkg:go/github.com/forgekeep/nebula-mesh) that uses SQLite for persistence via an internal store layer. Operator sessions are managed in the operator_sessions table defined in migration 005_operators.up.sql. The session token is a 32-byte cryptographically random hex string generated at login and sent in an HTTP cookie; it is valid for 24 hours. CWE-312 (Cleartext Storage of Sensitive Information) applies because internal/store/sqlite_operators.go:590 calls CreateOperatorSession inserting sess.Token verbatim, and lookups at lines 603, 642, 681, and 698 compare raw token values with WHERE token = ?. A related class of token storage - API keys (OperatorAPIKey.KeyHash) and enrollment tokens (EnrollmentToken.TokenHash) - was already hashed with SHA-256, as was the enrollment-token bug fixed in GHSA-ghmh-jhmj-wcmf. Session tokens were the only remaining credential class stored in cleartext, now corrected by migration 019_session_token_hash which renames the column to token_hash and updates the application layer to write and compare SHA-256 digests.
RemediationAI
Upgrade to nebula-mesh v0.3.8, which applies SHA-256 hashing to session tokens at rest via migration 019_session_token_hash and updates CreateOperatorSession, PromoteOperatorSession, and GetOperatorBySession accordingly (patch commit 7cb01bab281ded557f8b6c81dab5f48d4c10182e). Because existing operator_sessions rows contain raw tokens that will never match a hash-based lookup after migration, all active sessions are automatically invalidated on upgrade - operators must re-authenticate, which the advisory notes is acceptable given the 24-hour TTL. If immediate upgrade is not possible, restrict filesystem permissions on the SQLite database file to the service account only, encrypt all database backups at rest, and audit snapshot or cloud-storage configurations for unintended database exposure. These workarounds reduce the probability of token extraction but do not eliminate the plaintext storage flaw. Advisory: https://github.com/forgekeep/nebula-mesh/security/advisories/GHSA-q4vm-pq3q-8wgq.
Same weakness CWE-312 – Cleartext Storage of Sensitive Information
View allSame technique Information Disclosure
View allVendor 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 |
| openSUSE Leap 15.6 | Affected |
Share
External POC / Exploit Code
Leaving vuln.today
EUVD-2026-71716
GHSA-q4vm-pq3q-8wgq