CVE-2026-53603
highpriority · track · 0OT risk · elevatedEPSS 0.004 · 29 %ileUSEPSS · scored 2026-10-27
nebula-mesh is a self-hosted control plane for Slack Nebula mesh VPN. Prior to version 0.3.8, 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. 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 issue has been patched in version 0.3.8.
cvss
Technical severity, 0–10. One row per scoring source.
base score 0–10 · higher = more severe · hover a vector to decode⚠ sources disagree · medium–high · 4.9–7.1
ssvc
A stakeholder decision — act, attend, or track — from exploitation and impact.
weaknesses
The CWE weakness classes this flaw belongs to.
affected products (1)
Products and version ranges known to be affected.
advisories (2)
Vendor and ecosystem advisories describing this.
- GHSA-q4vm-pq3q-8wgqnebula-mesh: Operator session tokens stored in plaintext in the database2026-07-14ghsa · osvUS
## 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.Token` holds the plaintext token. - `internal/store/sqlite_operators.go:590` — `CreateOperatorSession` inserts `sess.Token` verbatim. - `internal/store/sqlite_operators.go:603,642,681,698` — lookups/updates/deletes use `WHERE 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: 1. Add a `HashSessionToken` helper (alongside the existing token-hash helpers). 2. Migration to add a `token_hash` column. 3. Update `CreateOperatorSession`, `PromoteOperatorSession`, and `GetOperatorBySession` to write/look up by hash. 4. Drop the plaintext `token` column 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-66` - `internal/store/sqlite_operators.go:577-698` - Migration `005_operators.up.sql:27` - Prior related advisory: GHSA-ghmh-jhmj-wcmf
- GO-2026-5991nebula-mesh: Operator session tokens stored in plaintext in the database in github.com/forgekeep/nebula-mesh2026-07-17vendor · osvUS
nebula-mesh: Operator session tokens stored in plaintext in the database in github.com/forgekeep/nebula-mesh
also known as (2)
Other names and identifiers for this entity.
- GHSA-q4vm-pq3q-8wgqosv
- GO-2026-5991osv
sources
Which sources assert this record, and when.
references (3) nvd
External citations — patches, advisories, analysis.
Attackers weaponise vulnerabilities like this against internet-exposed services. See what is exposed on your perimeter with a free passive scan.
Free scan