GHSA-ghmh-jhmj-wcmf: Github.com/juev/nebula mesh Nebula-mesh's Stores Enrollment Tokens Unhashed Vulnerability
MODERATEGHSA-ghmh-jhmj-wcmf is a MODERATE nebula-mesh's stores enrollment tokens unhashed vulnerability (CWE-312: Cleartext Storage of Sensitive Information) affecting Github.com/juev/nebula mesh libraries in the Go ecosystem. The issue involves nebula-mesh's stores enrollment tokens unhashed in sqlite. Remediation is available by upgrading affected packages to version 0.3.2.
GHSA-ghmh-jhmj-wcmf at a Glance
How to Fix GHSA-ghmh-jhmj-wcmf
To remediate this vulnerability, upgrade all affected Github.com/juev/nebula mesh dependencies to a patched release. Both direct and transitive dependencies should be checked, as frameworks or security libraries may pull in vulnerable versions transitively.
Upgrade github.com/juev/nebula-mesh to 0.3.2
Run the following command in your project directory to verify that all resolved dependencies use the patched release:
inspect dependencies for github.com/juev/nebula-mesh
How to Check if You Are Affected
To determine whether your application is affected by GHSA-ghmh-jhmj-wcmf, inspect your project dependencies for Github.com/juev/nebula mesh:
inspect dependencies for github.com/juev/nebula-mesh
Analyze the terminal output to locate any version of Github.com/juev/nebula mesh in your dependency tree. If any resolved version matches the vulnerable ranges listed in the table below (for example, versions earlier than 0.3.2), your application is affected.
Note: Verify declared build manifests and deployed runtime container environments.
Technical Details
Vulnerability Mechanism & Technical Analysis
This vulnerability is classified under CWE-312: Cleartext Storage of Sensitive Information, where the product stores sensitive information in cleartext within a resource that might be accessible to another control sphere. In Github.com/juev/nebula mesh, software state validation or input boundaries are circumvented during processing. Review the official source advisory statement below for specific affected components, classes, and reproduction details.
Source Advisory Statement
GHSA-ghmh-jhmj-wcmf Affected Github.com/juev/nebula mesh Versions
1 component(s)| Product / Package | Ecosystem | Affected Versions | Fixed Version |
|---|---|---|---|
|
github.com/juev/nebula-mesh
|
Go |
< 0.3.2
|
0.3.2
|
References
Frequently Asked Questions
What is GHSA-ghmh-jhmj-wcmf?
Which Github.com/juev/nebula mesh versions are affected?
What version fixes GHSA-ghmh-jhmj-wcmf?
Is github.com/juev/nebula-mesh affected?
What CWE is associated with GHSA-ghmh-jhmj-wcmf?
How can I check Go dependencies for GHSA-ghmh-jhmj-wcmf?
Machine-readable OSV JSON
OSV v1.5 Schema
{
"schema_version" : "1.4.0",
"id" : "GHSA-ghmh-jhmj-wcmf",
"modified" : "2026-06-22T22:57:27Z",
"published" : "2026-06-22T22:57:27Z",
"aliases" : [ ],
"summary" : "nebula-mesh's stores enrollment tokens unhashed in SQLite",
"details" : "`internal/store/sqlite.go:1177,1192,1221,1245` — the `enrollment_tokens.token` column holds the raw UUID token. `ConsumeToken` does `WHERE token = ?` against the raw string. Compare with `operator_api_keys.key_hash`, which is SHA-256 hex (constructed in `internal/api/middleware.go:51-53`).\n\n## Affected\nAll released versions up to v0.3.0.\n\n## Threat model\nRead access to `nebula-mgmt.db`: backup, snapshot, file-system access, future SQL-injection sink. The principle of defense-in-depth: API keys are hashed at rest; enrollment tokens — which grant the same lifecycle authority over a host's identity — are not.\n\nAn attacker who reads the DB before a legitimate agent enrolls can consume the single-use token first, mint a cert against their own keypair, and take the agent's intended Nebula identity.\n\n## Suggested fix\n1. Schema migration: rename `enrollment_tokens.token` → `token_hash` (or add the new column and drop the old after backfill of pending rows).\n2. Store SHA-256 of token on create:\n ```go\n sum := sha256.Sum256([]byte(token))\n row.TokenHash = hex.EncodeToString(sum[:])\n ```\n3. `ConsumeToken` accepts the raw token, hashes once, looks up by hash, atomically marks consumed.\n\nSide bonus: take this opportunity to switch the token format from `uuid.New().String()` (122 bits) to `hex.EncodeToString(crypto/rand 32 bytes)` (256 bits), matching the project's session-token and API-key conventions. UUIDs are recognisable in logs and crash dumps; opaque hex blends in.\n\nTOTP recovery codes appear to already be SHA-256 hashed at rest (`internal/web/totp.go:74-78`) — confirming that pattern is intentional elsewhere, just missed here.",
"severity" : [ {
"type" : "CVSS_V4",
"score" : "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:L/VI:H/VA:N/SC:N/SI:N/SA:N/E:U"
} ],
"affected" : [ {
"package" : {
"ecosystem" : "Go",
"name" : "github.com/juev/nebula-mesh"
},
"ranges" : [ {
"type" : "ECOSYSTEM",
"events" : [ {
"introduced" : "0"
}, {
"fixed" : "0.3.2"
} ]
} ],
"database_specific" : {
"last_known_affected_version_range" : "<= 0.3.1"
}
} ],
"references" : [ {
"type" : "WEB",
"url" : "https://github.com/juev/nebula-mesh/security/advisories/GHSA-ghmh-jhmj-wcmf"
}, {
"type" : "PACKAGE",
"url" : "https://github.com/juev/nebula-mesh"
} ],
"database_specific" : {
"cwe_ids" : [ "CWE-312" ],
"severity" : "MODERATE",
"github_reviewed" : true,
"github_reviewed_at" : "2026-06-22T22:57:27Z",
"nvd_published_at" : null
}
}