{"id":"CVE-2026-91168","kind":"vulnerability","aliases":["CVE-2026-91168"],"related":[],"title":"Warpgate: deleted account's Kubernetes access reused by replacement account","description":"Warpgate is an open source SSH, HTTPS, and MySQL bastion host for Linux. From 0.21.0 until 0.29.0, the Kubernetes request correlator in warpgate-protocol-kubernetes/src/correlator.rs keys an authorized AdmittedTarget by username, target_name, and client IP rather than by the immutable user UUID, while KubernetesSessionHandle::close does not evict the entry. If an account is deleted and a different low-privilege account is created with the same username, the replacement account can successfully authenticate as that recreated username and reuse the predecessor's still-live correlation entry when requesting the same target from the same client IP before kubernetes.session_max_age expires. Current-request authentication still occurs, but the reused entry bypasses a fresh target authorization check and can cause Warpgate to proxy requests with Kubernetes target credentials that the replacement account is not authorized to use, exposing cluster resources or permitting unauthorized mutations. This issue is fixed in version 0.29.0.","summary":"Warpgate, a bastion host for SSH, HTTPS and MySQL, caches Kubernetes target authorization by username rather than user ID, and does not clear the cache when a session closes. A new low-privilege account created with a deleted account's username can reuse that cached entry and reach Kubernetes cluster resources with the old account's target credentials.","severity":"medium","cvss":6.8,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["kubernetes","package","self-hosted","warpgate"],"not_affected_if":["no-kubernetes-targets","version-0.29.0-or-later"],"how_to_check":"- Check the Warpgate version with `warpgate --version`; versions from 0.21.0 through 0.28.x are in the affected range.\n- Check whether Kubernetes targets are configured in Warpgate (unknown whether the sources name a specific config key).\n- Check whether accounts are deleted and recreated with the same username.","fix":"- Upgrade Warpgate to `0.29.0`.","status":"open","published_at":"2026-11-04T16:17:54+00:00","first_seen_at":"2026-11-04T16:28:15+00:00","triaged_at":"2026-11-04T16:28:58+00:00","updated_at":"2026-11-04T16:28:58+00:00","category":"package","confidence":0.7,"triage":{"at":"2026-11-04T16:28:58Z","model":"claude-haiku-5-5","output":{"fix":"- Upgrade Warpgate to `0.29.0`.","reach":"network","title":"Warpgate: deleted account's Kubernetes access reused by replacement account","impact":"high","summary":"Warpgate, a bastion host for SSH, HTTPS and MySQL, caches Kubernetes target authorization by username rather than user ID, and does not clear the cache when a session closes. A new low-privilege account created with a deleted account's username can reuse that cached entry and reach Kubernetes cluster resources with the old account's target credentials.","audience":"businesses","category":"package","nicknames":[],"who_cares":["warpgate","kubernetes","self-hosted"],"confidence":0.7,"fix_status":"available","needs_auth":"yes","worst_case":"Replacement account reaches Kubernetes cluster resources with predecessor's target credentials","analyst_note":"","how_to_check":"- Check the Warpgate version with `warpgate --version`; versions from 0.21.0 through 0.28.x are in the affected range.\n- Check whether Kubernetes targets are configured in Warpgate (unknown whether the sources name a specific config key).\n- Check whether accounts are deleted and recreated with the same username.","plain_action":"","needs_analyst":false,"not_affected_if":["no-kubernetes-targets","version-0.29.0-or-later"],"who_is_affected":"Teams running Warpgate 0.21.0 through 0.28.x that use its Kubernetes target support and can delete and recreate user accounts. The flaw needs the replacement account to authenticate successfully and connect from the same client IP within the session max age window. Deployments without Kubernetes targets, or that never reuse usernames, are less exposed.","user_interaction":"no","needs_special_setup":"yes","severity_if_unknown":"medium"},"cost_usd":0.000752,"input_tokens":4402,"output_tokens":624,"severity_before":"medium"},"analyst_status":null,"analyst_note":null,"search":"'-2026':12A,15A '-91168':13A,16A '/src/correlator.rs':108C '0.21.0':96C '0.29.0':98C,237C 'access':6A 'account':3A,10A,57B,62B,78B,137C,146C,155C,218C 'admittedtarget':112C 'age':186C 'authent':158C,191C 'author':35B,111C,202C,221C 'bastion':25B,91C 'bypass':198C 'cach':32B,47B,68B 'caus':206C 'check':203C 'clear':45B 'client':118C,181C 'close':51B,129C 'cluster':73B,225C 'correl':102C,171C 'creat':58B,148C 'credenti':81B,214C 'current':189C 'current-request':188C 'cve':11A,14A 'delet':2A,61B,139C 'differ':142C 'entri':69B,134C,172C,197C 'evict':132C 'expir':187C 'expos':224C 'fix':234C 'fresh':200C 'host':21B,26B,92C 'https':29B,88C 'id':41B 'immut':124C 'ip':119C,182C 'issu':232C 'key':109C 'kubernet':5A,17B,33B,72B,100C,107C,212C 'kubernetes.session':184C 'kubernetessessionhandl':128C 'linux':94C 'live':170C 'low':55B,144C 'low-privileg':54B,143C 'max':185C 'mutat':230C 'mysql':31B,90C 'name':116C 'new':53B 'occur':193C 'old':77B 'open':85C 'packag':18B 'permit':228C 'predecessor':166C 'privileg':56B,145C 'protocol':106C 'proxi':209C 'rather':38B,120C 'reach':71B 'recreat':161C 'replac':9A,154C,217C 'request':101C,174C,190C,210C 'resourc':74B,226C 'reus':7A,66B,164C,196C 'self':20B 'self-host':19B 'session':50B 'sourc':86C 'ssh':28B,87C 'still':169C,192C 'still-liv':168C 'success':157C 'target':34B,80B,115C,177C,201C,213C 'unauthor':229C 'use':223C 'user':40B,125C 'usernam':37B,64B,114C,152C,162C 'uuid':126C 'version':236C 'warpgat':1A,22B,23B,82C,105C,207C 'warpgate-protocol-kubernet':104C","nicknames":[],"mitigations":[],"who_affected":"Teams running Warpgate 0.21.0 through 0.28.x that use its Kubernetes target support and can delete and recreate user accounts. The flaw needs the replacement account to authenticate successfully and connect from the same client IP within the session max age window. Deployments without Kubernetes targets, or that never reuse usernames, are less exposed.","tier":"C","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"businesses","plain_action":null,"pkeys":[],"ptokens":[],"labels":["kubernetes","medium","package","selfhosted","warpgate"],"campaign_type":null,"first_public_at":"2026-09-18T09:12:15+00:00","kev":null,"cvss_vector":"CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:N","cvss_by":"security-advisories@github.com","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-91168","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-91168","severity":null,"published_at":"2026-11-04T16:17:54+00:00","modified_at":"2026-11-04T16:17:55+00:00","first_seen_at":"2026-11-04T16:28:15+00:00","fetched_at":"2026-11-04T16:28:15+00:00","note":null}],"documents":[{"id":68513,"url":"https://github.com/warp-tech/warpgate/commit/2f77f07b8335ff495068aa10d650d4b314bf4cc8","title":"Patch: github.com","kind":"other","source":"nvd","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Patch: github.com"},{"id":68511,"url":"https://github.com/warp-tech/warpgate/releases/tag/v0.29.0","title":"Release notes: github.com","kind":"release","source":"nvd","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Release notes: github.com"},{"id":68515,"url":"https://github.com/warp-tech/warpgate/security/advisories/GHSA-pw7m-635x-pmx7","title":"Vendor advisory: github.com","kind":"vendor","source":"nvd","publisher":"vendor","text":null,"published_at":"2026-09-18T09:12:15+00:00","relation":"advisory","confidence":null,"note":"Vendor advisory: github.com"}],"notice":"Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai"}