CVE-2026-53604: nebula-mesh CA Private Key Not Zeroized Vulnerability

HIGH
Advisory Identifier: GHSA-2p2f-px33-4vv5
CWE-212 CWE-316
Published
Advisory Summary

CVE-2026-53604 is a HIGH ca private key not zeroized vulnerability (CWE-212: Improper Removal of Sensitive Information Before Storage or Transfer) affecting nebula-mesh libraries in the Go ecosystem. The issue involves ca private key not zeroized on web mobile-bundle error paths. Remediation is available by upgrading affected packages to version 0.3.8.

CVE-2026-53604 at a Glance

CVE Identifier CVE-2026-53604
GHSA Identifier GHSA-2p2f-px33-4vv5
Severity HIGH
CVSS v3.1 Base Score N/A
CWE Classification CWE-212: Improper Removal of Sensitive Information Before Storage or Transfer
Affected Product nebula-mesh
Package Ecosystem Go
Published Date
Last Updated

How to Fix CVE-2026-53604

To remediate this vulnerability, upgrade all affected 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.

github.com/forgekeep/nebula-mesh fixed: 0.3.8
Upgrade github.com/forgekeep/nebula-mesh to 0.3.8
Verify Direct and Transitive Dependencies

Run the following command in your project directory to verify that all resolved dependencies use the patched release:

inspect dependencies for github.com/forgekeep/nebula-mesh

How to Check if You Are Affected

To determine whether your application is affected by CVE-2026-53604, inspect your project dependencies for nebula-mesh:

inspect dependencies for github.com/forgekeep/nebula-mesh

Analyze the terminal output to locate any version of 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.8), 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-212: Improper Removal of Sensitive Information Before Storage or Transfer, where the product stores, transfers, or shares a resource that contains sensitive information, but it does not properly remove that information before the product makes the resource available to unauthorized actors. In 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

## Impact The web handler `renderMobileBundle` (`internal/web/handlers.go:1325`) passes the real `*pki.CAResolver` directly into `mobilebundle.Build`. Inside `Build` (`internal/mobilebundle/builder.go:54`), `resolver.LoadByID` decrypts the CA's ed25519 private key into a `*pki.CAManager`, but `Build` never calls `CAManager.Wipe()` on any return path (success or any of the error paths at lines 56, 62, 68, 80, 86, 92, 98, 102, 109, 118, 150). As a result, when a mobile-bundle request goes through the **web** UI and `Build` returns — especially on error (missing network, invalid prefix, DB error, signing failure) — the plaintext CA private key remains on the Go heap, unwiped, until garbage collection. An attacker able to read process memory (core dump, swap, memory-scraping) can recover the CA signing key, which would allow minting arbitrary host certificates for the mesh. The **API** handler (`internal/api/mobile_bundle.go:74`) already does this correctly: it loads the `CAManager`, `defer caMgr.Wipe()`, and wraps it in `caManagerResolver`. Only the web path is affected. This is the same key-zeroization class previously addressed in GHSA-8h84-fhqq-q58v. ## Patches Add `defer caMgr.Wipe()` inside `mobilebundle.Build` immediately after the `LoadByID` call so every caller (web and API) is protected on all return paths. Ensure `CAManager.Wipe()` is idempotent, since the API handler also wipes the same manager. ## Workarounds None at the configuration level; requires a code fix. ## Resources - `internal/web/handlers.go:1325` - `internal/mobilebundle/builder.go:54` - `internal/api/mobile_bundle.go:74` (correct reference implementation) - Prior related advisory: GHSA-8h84-fhqq-q58v

CVE-2026-53604 Affected nebula-mesh Versions

1 component(s)
Fixed Versions:
0.3.8
Product / Package Ecosystem Affected Versions Fixed Version
github.com/forgekeep/nebula-mesh
Go
< 0.3.8
0.3.8

References

Frequently Asked Questions

What is CVE-2026-53604?
CVE-2026-53604 is a security vulnerability in nebula-mesh involving CA private key not zeroized on web mobile-bundle error paths under CWE-212: Improper Removal of Sensitive Information Before Storage or Transfer.
Which nebula-mesh versions are affected?
Affected versions include releases prior to 0.3.8 across affected packages: github.com/forgekeep/nebula-mesh.
What version fixes CVE-2026-53604?
Upgrading to 0.3.8 (or the latest patched release for your respective branch) resolves the vulnerability.
Is github.com/forgekeep/nebula-mesh affected?
Yes, github.com/forgekeep/nebula-mesh is affected in releases prior to 0.3.8. Upgrade your dependency to 0.3.8 or later.
What CWE is associated with CVE-2026-53604?
CVE-2026-53604 is classified under CWE-212: Improper Removal of Sensitive Information Before Storage or Transfer (The product stores, transfers, or shares a resource that contains sensitive information, but it does not properly remove that information before the product makes the resource available to unauthorized actors.).
How can I check Go dependencies for CVE-2026-53604?
Run the dependency tree command: 'inspect dependencies for github.com/forgekeep/nebula-mesh'. This command lists direct and transitive dependencies in your build configuration so you can verify if a vulnerable version is resolved.
Machine-readable OSV JSON OSV v1.5 Schema
Normalized schema output
{
  "schema_version" : "1.4.0",
  "id" : "GHSA-2p2f-px33-4vv5",
  "modified" : "2026-07-14T20:05:38Z",
  "published" : "2026-07-14T20:05:38Z",
  "aliases" : [ "CVE-2026-53604" ],
  "summary" : "nebula-mesh: CA private key not zeroized on web mobile-bundle error paths",
  "details" : "## Impact\n\nThe web handler `renderMobileBundle` (`internal/web/handlers.go:1325`) passes the real `*pki.CAResolver` directly into `mobilebundle.Build`. Inside `Build` (`internal/mobilebundle/builder.go:54`), `resolver.LoadByID` decrypts the CA's ed25519 private key into a `*pki.CAManager`, but `Build` never calls `CAManager.Wipe()` on any return path (success or any of the error paths at lines 56, 62, 68, 80, 86, 92, 98, 102, 109, 118, 150).\n\nAs a result, when a mobile-bundle request goes through the **web** UI and `Build` returns — especially on error (missing network, invalid prefix, DB error, signing failure) — the plaintext CA private key remains on the Go heap, unwiped, until garbage collection. An attacker able to read process memory (core dump, swap, memory-scraping) can recover the CA signing key, which would allow minting arbitrary host certificates for the mesh.\n\nThe **API** handler (`internal/api/mobile_bundle.go:74`) already does this correctly: it loads the `CAManager`, `defer caMgr.Wipe()`, and wraps it in `caManagerResolver`. Only the web path is affected.\n\nThis is the same key-zeroization class previously addressed in GHSA-8h84-fhqq-q58v.\n\n## Patches\n\nAdd `defer caMgr.Wipe()` inside `mobilebundle.Build` immediately after the `LoadByID` call so every caller (web and API) is protected on all return paths. Ensure `CAManager.Wipe()` is idempotent, since the API handler also wipes the same manager.\n\n## Workarounds\n\nNone at the configuration level; requires a code fix.\n\n## Resources\n\n- `internal/web/handlers.go:1325`\n- `internal/mobilebundle/builder.go:54`\n- `internal/api/mobile_bundle.go:74` (correct reference implementation)\n- Prior related advisory: GHSA-8h84-fhqq-q58v",
  "severity" : [ {
    "type" : "CVSS_V4",
    "score" : "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N"
  } ],
  "affected" : [ {
    "package" : {
      "ecosystem" : "Go",
      "name" : "github.com/forgekeep/nebula-mesh"
    },
    "ranges" : [ {
      "type" : "ECOSYSTEM",
      "events" : [ {
        "introduced" : "0"
      }, {
        "fixed" : "0.3.8"
      } ]
    } ],
    "database_specific" : {
      "last_known_affected_version_range" : "<= 0.3.7"
    }
  } ],
  "references" : [ {
    "type" : "WEB",
    "url" : "https://github.com/forgekeep/nebula-mesh/security/advisories/GHSA-2p2f-px33-4vv5"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/forgekeep/nebula-mesh/commit/1f1ab9aa8472239763d967e3d50a3cd53a1a79b9"
  }, {
    "type" : "PACKAGE",
    "url" : "https://github.com/forgekeep/nebula-mesh"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/forgekeep/nebula-mesh/releases/tag/v0.3.8"
  } ],
  "database_specific" : {
    "cwe_ids" : [ "CWE-212", "CWE-316" ],
    "severity" : "HIGH",
    "github_reviewed" : true,
    "github_reviewed_at" : "2026-07-14T20:05:38Z",
    "nvd_published_at" : null
  }
}