{"items":[{"id":"NVI-00017801","kind":"vulnerability","title":"nebula-mesh: Host revocation is not durable - blocked/offboarded hosts can regain a valid certificate","revision":1,"unknowns":["Customer inventory, deployment, reachability and exploitation have not been inspected."],"lifecycle":"active","identifiers":["GHSA-339v-266x-79xr","CVE-2026-53602"],"plain_summary":"GitHub lists this reviewed advisory for github.com/forgekeep/nebula-mesh. Published version ranges and source prerequisites are shown below; this is not an inspection of a visitor’s application.","review_status":"source_listed","control_topics":[],"public_actions":[{"summary":"Identify the exact component and deployed version, examine the linked publisher’s conditions, and retain evidence of any mitigation.","source_ids":["sr-6932653f8d1cf50b305ecccf05155338"],"action_type":"investigate","limitations":"Confirm current vendor support, compatibility and deployment evidence. This report has not tested a fix in your system.","current_supported_target":null}],"schema_version":"1.1.0","source_metrics":[],"why_it_matters":"Published affected context helps an owner decide what evidence to gather. This report has not examined your application.","related_sources":[{"id":"sr-6932653f8d1cf50b305ecccf05155338","url":"https://github.com/advisories/GHSA-339v-266x-79xr","basis":"vendor_advisory","notes":"GitHub Advisory Database; CC-BY-4.0. Each advisory links its original attribution. Null normalizes fields.","title":"GHSA-339v-266x-79xr","publisher":"GitHub Advisory Database","observed_at":"2026-11-04T23:34:40.400Z"}],"affected_context":[{"certainty":"source_listed","source_ids":["sr-6932653f8d1cf50b305ecccf05155338"],"technology":"github.com/forgekeep/nebula-mesh","known_exclusions":[],"conditions_summary":"## Summary\n\nTwo 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.\n\n## 1. Blocklist not enforced at sign / re-enroll time\n\n`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.\n\n`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).\n\n**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. Re","public_affected_ranges":["< 0.3.7"]}],"null_published_at":"2026-11-05T19:10:21.469Z","source_updated_at":"2026-07-09T20:52:28.000Z","source_disclosed_at":"2026-07-09T20:52:27.000Z","is_synthetic_fixture":false,"null_last_reviewed_at":null,"public_change_summary":"First indexed by Null; source disclosure date is shown separately.","null_first_observed_at":"2026-11-04T23:34:40.400Z"}],"next_cursor":null,"snapshot_revision":"42594"}