/

CVE-2026-59185

Severity:

HIGH RISK

(8.5)

IDOR (CWE-639) in identrail GitHub App Connection API

CVE-2026-59185

Deferred

Vulnerability type

Category:

Broken Object-Level Authorization

CWE:

CWE-639, CWE-862

Impact:

Cross-Tenant Data Exposure

Severity:

HIGH RISK

(8.5)

CVSS version:

3.1

Catch this CVE while code is being written

Detect vulnerable code directly in pull requests, so CVEs are fixed before merge.

Summary

identrail does not verify that a supplied GitHub installation ID belongs to the requesting workspace before associating it with a project. An authenticated tenant that can initiate a GitHub connection may use another customer's non-secret installation ID to access private repository inventories, content, metadata, or posture-scan data when the shared GitHub App is installed there.

identrail does not verify that a supplied GitHub installation ID belongs to the requesting workspace before associating it with a project. An authenticated tenant that can initiate a GitHub connection may use another customer's non-secret installation ID to access private repository inventories, content, metadata, or posture-scan data when the shared GitHub App is installed there.

Affected context

The issue affects identrail GitHub connection workflows where an installation ID is accepted from a request body or HTTP header. The vulnerable behavior is present when the GitHub App is installed in multiple customer organizations and the service persists or uses an installation ID without confirming ownership by the caller's tenant, workspace, or project. The related V2 connector path also requires careful scope validation when matching pending connection state.

The issue affects identrail GitHub connection workflows where an installation ID is accepted from a request body or HTTP header. The vulnerable behavior is present when the GitHub App is installed in multiple customer organizations and the service persists or uses an installation ID without confirming ownership by the caller's tenant, workspace, or project. The related V2 connector path also requires careful scope validation when matching pending connection state.

Exploit preconditions

  • Attack surface: Authenticated GitHub connection completion endpoints
  • Required access: A valid identrail tenant account capable of initiating a legitimate GitHub connection
  • Trigger point: Submission of a GitHub installation ID during connection completion
  • Target condition: The installation ID belongs to another customer's organization and identrail's GitHub App is installed there
  • Why exploitation is possible: The service checks that the identifier is positive but does not verify that it is owned by the caller's tenant, workspace, or project before requesting installation credentials
  • Attack surface: Authenticated GitHub connection completion endpoints
  • Required access: A valid identrail tenant account capable of initiating a legitimate GitHub connection
  • Trigger point: Submission of a GitHub installation ID during connection completion
  • Target condition: The installation ID belongs to another customer's organization and identrail's GitHub App is installed there
  • Why exploitation is possible: The service checks that the identifier is positive but does not verify that it is owned by the caller's tenant, workspace, or project before requesting installation credentials

Why this happens

The underlying bug is a missing object-level authorization check. Although the connection state is bound to the caller's tenant, workspace, and project in the primary flow, the GitHub installation object supplied by the caller is not independently authorized against that scope. The service therefore treats a caller-controlled identifier as trusted and uses the application's GitHub credentials to access the referenced installation. This maps primarily to CWE-639: Authorization Bypass Through User-Controlled Key and also reflects CWE-862: Missing Authorization.

The underlying bug is a missing object-level authorization check. Although the connection state is bound to the caller's tenant, workspace, and project in the primary flow, the GitHub installation object supplied by the caller is not independently authorized against that scope. The service therefore treats a caller-controlled identifier as trusted and uses the application's GitHub credentials to access the referenced installation. This maps primarily to CWE-639: Authorization Bypass Through User-Controlled Key and also reflects CWE-862: Missing Authorization.

Potential impact

  • An attacker may enumerate private repositories belonging to another customer
  • Repository content and metadata could be exposed across tenant boundaries
  • Unauthorized posture scans could be initiated against a victim organization
  • Sensitive organizational structure and source-code information could be disclosed
  • Cross-tenant trust boundaries could be weakened through unauthorized connector persistence
  • An attacker may enumerate private repositories belonging to another customer
  • Repository content and metadata could be exposed across tenant boundaries
  • Unauthorized posture scans could be initiated against a victim organization
  • Sensitive organizational structure and source-code information could be disclosed
  • Cross-tenant trust boundaries could be weakened through unauthorized connector persistence

General mitigation guidance

Mitigation generally centers on enforcing object-level authorization at every boundary where external identifiers are accepted or used.

Common defensive patterns include:

  • Resolve GitHub installation ownership server-side rather than trusting request-supplied identifiers
  • Bind installation records to the authenticated tenant, workspace, and project before persistence or token creation
  • Revalidate caller scope when consuming pending connection state, including connector-specific flows
  • Prefer opaque, server-managed connection references over externally supplied provider identifiers
  • Apply least privilege to GitHub App permissions and limit repository access where practical
  • Record authorization decisions and reject ambiguous or cross-tenant installation mappings by default

Mitigation generally centers on enforcing object-level authorization at every boundary where external identifiers are accepted or used.

Common defensive patterns include:

  • Resolve GitHub installation ownership server-side rather than trusting request-supplied identifiers
  • Bind installation records to the authenticated tenant, workspace, and project before persistence or token creation
  • Revalidate caller scope when consuming pending connection state, including connector-specific flows
  • Prefer opaque, server-managed connection references over externally supplied provider identifiers
  • Apply least privilege to GitHub App permissions and limit repository access where practical
  • Record authorization decisions and reject ambiguous or cross-tenant installation mappings by default

How teams detect issues like this

Organizations can look for this class of issue through:

  • Static analysis and code review rules for request-controlled identifiers passed to provider APIs
  • Review of authorization checks before persistence, token creation, and repository enumeration
  • Tests that attempt to use installation identifiers from a different tenant, workspace, or project
  • API policy checks requiring tenant and resource ownership validation for every connector operation
  • Audit-log correlation between connection requests, installation IDs, token creation, and repository access
  • Automated security review tools that flag missing object-level authorization and insecure direct object references

Organizations can look for this class of issue through:

  • Static analysis and code review rules for request-controlled identifiers passed to provider APIs
  • Review of authorization checks before persistence, token creation, and repository enumeration
  • Tests that attempt to use installation identifiers from a different tenant, workspace, or project
  • API policy checks requiring tenant and resource ownership validation for every connector operation
  • Audit-log correlation between connection requests, installation IDs, token creation, and repository access
  • Automated security review tools that flag missing object-level authorization and insecure direct object references

Sources

SourceLink
github.comgithub.com/identrail/identrail/commit/835e40517509d6ef5405c27fbf14f579bedff0e7
github.comgithub.com/identrail/identrail/releases/tag/v1.0.2
github.comgithub.com/identrail/identrail/security/advisories/GHSA-cp3j-m783-3ph5

Frequently asked

questions

Yes, within the application's authenticated API surface. Exploitation does not require access to the victim's GitHub credentials, but it does require an identrail account that can initiate the relevant connection workflow.

The attacker needs authenticated access to a tenant and a non-secret GitHub installation ID associated with another organization where identrail's GitHub App is installed.

Treat installation IDs as untrusted references and verify their ownership against the authenticated tenant, workspace, and project before storing them, creating provider tokens, or accessing repositories.

Enforce centralized object-level authorization, test cross-tenant identifier substitution, use server-managed resource mappings, and monitor provider API activity for unexpected tenant-to-installation relationships.

Yes, within the application's authenticated API surface. Exploitation does not require access to the victim's GitHub credentials, but it does require an identrail account that can initiate the relevant connection workflow.

The attacker needs authenticated access to a tenant and a non-secret GitHub installation ID associated with another organization where identrail's GitHub App is installed.

Treat installation IDs as untrusted references and verify their ownership against the authenticated tenant, workspace, and project before storing them, creating provider tokens, or accessing repositories.

Enforce centralized object-level authorization, test cross-tenant identifier substitution, use server-managed resource mappings, and monitor provider API activity for unexpected tenant-to-installation relationships.

Find out what's already
exploitable in your codebase.