{"id":"CVE-2026-59185","state":"PUBLISHED","title":"identrail: Cross-tenant GitHub installation binding without ownership verification","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.","publishedAt":"2026-10-28T13:15:53.456Z","updatedAt":"2026-10-28T16:07:10.634Z","severity":{"score":8.5,"label":"High","version":"3.1","vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:L/A:N","source":"GitHub_M"},"assigner":"GitHub_M","products":["identrail identrail"],"affected":[{"vendor":"identrail","product":"identrail","versions":[{"version":"< 1.0.2","status":"affected"}]}],"references":["https://github.com/identrail/identrail/security/advisories/GHSA-cp3j-m783-3ph5","https://github.com/identrail/identrail/commit/835e40517509d6ef5405c27fbf14f579bedff0e7","https://github.com/identrail/identrail/releases/tag/v1.0.2"],"weaknesses":["CWE-639","CWE-862"],"ingestedAt":"2026-10-29T20:12:32.778Z","source":{"repository":"CVEProject/cvelistV5","path":"cves/2026/59xxx/CVE-2026-59185.json","commit":"556c9d3a8cd17e218bb8e452ba7cd619a384ff47"},"raw":{"dataType":"CVE_RECORD","dataVersion":"5.2","cveMetadata":{"cveId":"CVE-2026-59185","state":"PUBLISHED","datePublished":"2026-10-28T13:15:53.456Z","dateUpdated":"2026-10-28T16:07:10.634Z","assignerShortName":"GitHub_M","assignerOrgId":"a0819718-46f1-4df5-94e2-005712e83aaa","dateReserved":"2026-07-02T19:53:48.830Z"},"containers":{"cna":{"title":"identrail: Cross-tenant GitHub installation binding without ownership verification","descriptions":[{"lang":"en","value":"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."}],"affected":[{"vendor":"identrail","product":"identrail","versions":[{"version":"< 1.0.2","status":"affected"}]}],"references":[{"url":"https://github.com/identrail/identrail/security/advisories/GHSA-cp3j-m783-3ph5","name":"https://github.com/identrail/identrail/security/advisories/GHSA-cp3j-m783-3ph5","tags":["x_refsource_CONFIRM"]},{"url":"https://github.com/identrail/identrail/commit/835e40517509d6ef5405c27fbf14f579bedff0e7","name":"https://github.com/identrail/identrail/commit/835e40517509d6ef5405c27fbf14f579bedff0e7","tags":["x_refsource_MISC"]},{"url":"https://github.com/identrail/identrail/releases/tag/v1.0.2","name":"https://github.com/identrail/identrail/releases/tag/v1.0.2","tags":["x_refsource_MISC"]}],"metrics":[{"cvssV3_1":{"attackComplexity":"LOW","attackVector":"NETWORK","availabilityImpact":"NONE","baseScore":8.5,"baseSeverity":"HIGH","confidentialityImpact":"HIGH","integrityImpact":"LOW","privilegesRequired":"LOW","scope":"CHANGED","userInteraction":"NONE","vectorString":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:L/A:N","version":"3.1"}}],"problemTypes":[{"descriptions":[{"cweId":"CWE-639","lang":"en","description":"CWE-639: Authorization Bypass Through User-Controlled Key","type":"CWE"}]},{"descriptions":[{"cweId":"CWE-862","lang":"en","description":"CWE-862: Missing Authorization","type":"CWE"}]}],"providerMetadata":{"shortName":"GitHub_M","orgId":"a0819718-46f1-4df5-94e2-005712e83aaa","dateUpdated":"2026-10-28T13:15:53.456Z"},"source":{"advisory":"GHSA-cp3j-m783-3ph5","discovery":"UNKNOWN"}},"adp":[{"title":"CISA ADP Vulnrichment","metrics":[{"other":{"type":"ssvc","content":{"timestamp":"2026-10-28T14:37:16.463171Z","id":"CVE-2026-59185","options":[{"Exploitation":"none"},{"Automatable":"no"},{"Technical Impact":"partial"}],"role":"CISA Coordinator","version":"2.0.3"}}}],"providerMetadata":{"shortName":"CISA-ADP","orgId":"134c704f-9b21-4f2e-91b3-4a467353bcc0","dateUpdated":"2026-10-28T16:07:10.634Z"}}]}}}