{"id":"CVE-2026-59185","kind":"vulnerability","aliases":["CVE-2026-59185"],"related":[],"title":"identrail: GitHub connect flow lets a tenant read other orgs' repositories","description":"identrail is a machine identity security platform for AWS, GitHub/OIDC, and Kubernetes. Prior to 1.0.2, the default-on `POST /v1/workspaces/:workspace_id/projects/:project_id/github/connect/complete` endpoint in `internal/api/router.go` accepts `installation_id` from the request body or `X-GitHub-Installation-ID` header without verifying the installation belongs to the caller's workspace. `CompleteGitHubConnection` in `internal/api/github_connect.go` rigorously binds `state` to the caller's tenant, workspace, and project, but checks only that the installation ID is positive before persisting it as the caller's connection. `ListInstallationRepositories` in `internal/connectors/github/repositories.go` invokes token creation through `internal/connectors/github/app.go` and `POST /app/installations/{installationId}/access_tokens`, using the application's JWT. An authenticated tenant who starts a legitimate connection can supply another customer's non-secret installation ID to read the victim organization's private repository inventory, content, and metadata or drive posture scans, provided identrail's GitHub App is installed there. The default-off V2 `CompleteGitHubConnector` path shares the installation-ownership gap and additionally matches pending `state` without rechecking caller scope. This issue is fixed in version 1.0.2.","summary":"identrail's GitHub connect endpoint accepts any GitHub App installation ID without checking it belongs to the caller's workspace. An authenticated tenant can supply another customer's installation ID to read that organization's private repository inventory and content, provided identrail's GitHub App is installed there.","severity":"high","cvss":8.5,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["github-app","identrail","multi-tenant","package","self-hosted"],"not_affected_if":["github-app-not-installed-in-other-orgs","single-tenant-deployment","version-1.0.2-or-later"],"how_to_check":"- Check the identrail version in use; versions before `1.0.2` are affected.\n- Look for the route `POST /v1/workspaces/:workspace_id/projects/:project_id/github/connect/complete` in `internal/api/router.go` of your deployment.\n- Confirm whether the default-off V2 `CompleteGitHubConnector` path is enabled.","fix":"- Upgrade identrail to `1.0.2`.\n- Review GitHub connection records for installation IDs bound to workspaces that do not own them, and remove any found.\n- Rotate GitHub App credentials if unexplained cross-tenant connections are found.","status":"open","published_at":"2026-10-28T14:17:05+00:00","first_seen_at":"2026-10-28T14:33:23+00:00","triaged_at":"2026-10-28T14:34:21+00:00","updated_at":"2026-10-28T14:34:21+00:00","category":"package","confidence":0.8,"triage":{"at":"2026-10-28T14:34:21Z","model":"claude-haiku-5-5","output":{"fix":"- Upgrade identrail to `1.0.2`.\n- Review GitHub connection records for installation IDs bound to workspaces that do not own them, and remove any found.\n- Rotate GitHub App credentials if unexplained cross-tenant connections are found.","reach":"internet","title":"identrail: GitHub connect flow lets a tenant read other orgs' repositories","impact":"high","summary":"identrail's GitHub connect endpoint accepts any GitHub App installation ID without checking it belongs to the caller's workspace. An authenticated tenant can supply another customer's installation ID to read that organization's private repository inventory and content, provided identrail's GitHub App is installed there.","category":"package","nicknames":[],"who_cares":["identrail","self-hosted","github-app","multi-tenant"],"confidence":0.8,"needs_auth":"yes","worst_case":"Attacker reads another organization's private repositories and metadata via identrail","analyst_note":"","how_to_check":"- Check the identrail version in use; versions before `1.0.2` are affected.\n- Look for the route `POST /v1/workspaces/:workspace_id/projects/:project_id/github/connect/complete` in `internal/api/router.go` of your deployment.\n- Confirm whether the default-off V2 `CompleteGitHubConnector` path is enabled.","needs_analyst":false,"not_affected_if":["version-1.0.2-or-later","single-tenant-deployment","github-app-not-installed-in-other-orgs"],"who_is_affected":"Teams running identrail in a multi-tenant setup where several workspaces or customers share one instance and the identrail GitHub App is installed in their GitHub organizations. Any authenticated tenant who can start a GitHub connection can reach another tenant's installation. Single-tenant deployments with no untrusted users are less exposed.","user_interaction":"no","needs_special_setup":"no","severity_if_unknown":"high"},"cost_usd":0.000701,"input_tokens":3668,"output_tokens":668,"severity_before":"high"},"analyst_status":null,"analyst_note":null,"search":"'-2026':13A,16A '-59185':14A,17A '/access_tokens':171C '/app/installations':169C '/v1/workspaces':96C '1.0.2':90C,247C 'accept':34B,104C 'addit':233C 'anoth':54B,187C 'app':20B,37B,73B,215C 'applic':174C 'authent':50B,178C 'aw':84C 'belong':43B,122C 'bind':132C 'bodi':110C 'caller':46B,125C,136C,156C,239C 'check':41B,143C 'completegithubconnect':128C 'completegithubconnector':224C 'connect':3A,32B,158C,184C 'content':68B,204C 'creation':164C 'custom':55B,188C 'cve':12A,15A 'default':93C,221C 'default-off':220C 'default-on':92C 'drive':208C 'endpoint':33B,101C 'fix':244C 'flow':4A 'gap':231C 'github':2A,19B,31B,36B,72B,114C,214C 'github-app':18B 'github/oidc':85C 'header':117C 'host':28B 'id':39B,58B,106C,116C,148C,194C 'id/github/connect/complete':100C 'id/projects':98C 'ident':80C 'identrail':1A,21B,29B,70B,76C,212C 'instal':38B,57B,75B,105C,115C,121C,147C,193C,217C,229C 'installation-ownership':228C 'installationid':170C 'internal/api/github_connect.go':130C 'internal/api/router.go':103C 'internal/connectors/github/app.go':166C 'internal/connectors/github/repositories.go':161C 'inventori':66B,203C 'invok':162C 'issu':242C 'jwt':176C 'kubernet':87C 'legitim':183C 'let':5A 'listinstallationrepositori':159C 'machin':79C 'match':234C 'metadata':206C 'multi':23B 'multi-ten':22B 'non':191C 'non-secret':190C 'org':10A 'organ':62B,199C 'ownership':230C 'packag':25B 'path':225C 'pend':235C 'persist':152C 'platform':82C 'posit':150C 'post':95C,168C 'postur':209C 'prior':88C 'privat':64B,201C 'project':99C,141C 'provid':69B,211C 'read':8A,60B,196C 'recheck':238C 'repositori':11A,65B,202C 'request':109C 'rigor':131C 'scan':210C 'scope':240C 'secret':192C 'secur':81C 'self':27B 'self-host':26B 'share':226C 'start':181C 'state':133C,236C 'suppli':53B,186C 'tenant':7A,24B,51B,138C,179C 'token':163C 'use':172C 'v2':223C 'verifi':119C 'version':246C 'victim':198C 'without':40B,118C,237C 'workspac':48B,97C,127C,139C 'x':113C 'x-github-installation-id':112C","nicknames":[],"mitigations":[],"who_affected":"Teams running identrail in a multi-tenant setup where several workspaces or customers share one instance and the identrail GitHub App is installed in their GitHub organizations. Any authenticated tenant who can start a GitHub connection can reach another tenant's installation. Single-tenant deployments with no untrusted users are less exposed.","tier":"B","verified":{},"analyst_revisit_at":null,"first_public_at":"2026-10-28T14:17:05+00:00","kev":null,"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:L/A:N","cvss_by":"security-advisories@github.com","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-59185","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-59185","severity":null,"published_at":"2026-10-28T14:17:05+00:00","modified_at":"2026-10-28T14:17:05+00:00","first_seen_at":"2026-10-28T14:33:23+00:00","fetched_at":"2026-10-28T14:33:23+00:00","note":null}],"documents":[],"notice":"Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai"}