openhound-github 0.9.0__tar.gz → 0.10.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {openhound_github-0.9.0 → openhound_github-0.10.0}/PKG-INFO +1 -1
- openhound_github-0.10.0/descriptions/edges/GH_CanAccessSecret.md +30 -0
- openhound_github-0.10.0/descriptions/edges/GH_CanInterceptJob.md +24 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/nodes/GH_EnterpriseRunner.md +4 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/nodes/GH_OrgRunner.md +4 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/nodes/GH_RepoRunner.md +4 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/nodes/GH_WorkflowJob.md +9 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/README.md +26 -14
- openhound_github-0.10.0/extension/saved_searches/self-hosted-runners-can-intercept-broad-token-jobs.json +5 -0
- openhound_github-0.10.0/extension/saved_searches/shared-self-hosted-runners-can-intercept-secret-bearing-jobs.json +5 -0
- openhound_github-0.10.0/extension/saved_searches/workflow-jobs-interceptable-by-self-hosted-runners.json +5 -0
- openhound_github-0.10.0/extension/saved_searches/workflow-jobs-with-id-token-write-on-self-hosted-runners.json +5 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/schema.json +10 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/kinds/edges.py +2 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/lookup.py +83 -12
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/runner.py +5 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/workflow_job.py +151 -62
- openhound_github-0.10.0/src/openhound_github/models/workflow_reference.py +58 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/workflow_step.py +27 -60
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/transforms.py +21 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_lookup.py +22 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_runner_models.py +56 -9
- openhound_github-0.10.0/tests/test_workflow_interception_path.py +264 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_workflow_model.py +200 -0
- openhound_github-0.9.0/extension/saved_searches/workflow-jobs-with-id-token-write-on-self-hosted-runners.json +0 -5
- {openhound_github-0.9.0 → openhound_github-0.10.0}/.github/CODE_OF_CONDUCT.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/.github/CONTRIBUTING.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/.github/GOVERNANCE.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/.github/GitHub-COC-Header.png +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/.github/GitHub-CONTRIB-Header.png +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/.github/GitHub-GOV-Header.png +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/.github/GitHub-Header.png +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/.github/GitHub-LIC-Header.png +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/.github/GitHub-SEC-Header.png +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/.github/SECURITY.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/.github/SO-Dark.svg +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/.github/SO-FOSS-Dark.svg +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/.github/SO-FOSS-Light.svg +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/.github/SO-Light.svg +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/.github/workflows/publish.yml +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/.github/workflows/release-on-merge.yml +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/.github/workflows/validate-branch.yml +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/.gitignore +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/.gitmodules +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/.pre-commit-config.yaml +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/LICENSE.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/README.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_AddAssignee.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_AddCollaborator.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_AddLabel.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_AddMember.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_AdminTo.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_ApprovesDeploymentTo.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_AssignedTo.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_BypassBranchProtection.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_BypassPullRequestAllowances.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_CallsWorkflow.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_CanAccess.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_CanAssumeIdentity.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_CanCreateBranch.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_CanCreateEnvironment.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_CanCreateInternalRepositories.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_CanCreatePrivateRepositories.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_CanCreatePublicRepositories.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_CanCreateRepositories.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_CanCreateRepositoryWithRunnerAccess.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_CanDeployToEnvironment.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_CanEditEnvironment.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_CanEditProtection.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_CanPwnRequest.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_CanReadSecret.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_CanReadSecretScanningAlert.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_CanUseRunner.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_CanWriteBranch.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_CloseDiscussion.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_CloseIssue.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_ClosePullRequest.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_Contains.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_ConvertIssuesToDiscussions.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_CreateDiscussionCategory.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_CreateEnterpriseOrganizations.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_CreateRepository.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_CreateSoloMergeQueueEntry.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_CreateTag.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_CreateTeam.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_DeleteAlertsCodeScanning.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_DeleteDiscussion.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_DeleteDiscussionComment.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_DeleteIssue.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_DeleteTag.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_DependsOn.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_DeploysTo.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_EditCategoryOnDiscussion.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_EditDiscussionCategory.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_EditDiscussionComment.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_EditEnterpriseCustomPropertiesForOrganizations.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_EditRepoAnnouncementBanners.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_EditRepoCustomPropertiesValues.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_EditRepoMetadata.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_EditRepoProtections.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_HasBaseRole.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_HasExternalIdentity.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_HasMember.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_HasPersonalAccessToken.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_HasPersonalAccessTokenRequest.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_HasRole.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_HasRunner.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_HasSamlIdentityProvider.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_HasSecret.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_HasVariable.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_InheritedFrom.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_InstalledAs.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_InviteMember.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_IsEligibleFor.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_JumpMergeQueue.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_ManageDeployKeys.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_ManageDiscussionBadges.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_ManageEnterpriseAdmins.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_ManageEnterpriseIdentityProvider.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_ManageEnterpriseMembers.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_ManageEnterpriseOrganizationAdmins.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_ManageEnterpriseOrganizations.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_ManageEnterpriseReferrals.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_ManageEnterpriseTeams.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_ManageOrganizationWebhooks.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_ManageRepoSecurityProducts.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_ManageSecurityProducts.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_ManageSettingsMergeTypes.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_ManageSettingsPages.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_ManageSettingsProjects.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_ManageSettingsWiki.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_ManageTopics.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_ManageWebhooks.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_MapsToUser.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_MarkAsDuplicate.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_MatchesEnvironmentPolicy.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_MemberOf.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_OrgBypassCodeScanningDismissalRequests.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_OrgBypassSecretScanningClosureRequests.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_OrgReviewAndManageSecretScanningBypassRequests.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_OrgReviewAndManageSecretScanningClosureRequests.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_Owns.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_ProtectedBy.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_PushProtectedBranch.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_ReadCodeScanning.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_ReadEnterpriseAuditLog.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_ReadEnterpriseDomainVerification.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_ReadEnterpriseMembers.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_ReadEnterpriseOrgProjects.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_ReadEnterpriseOrganizationAdmin.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_ReadOrganizationActionsUsageMetrics.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_ReadOrganizationCustomOrgRole.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_ReadOrganizationCustomRepoRole.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_ReadRepoContents.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_RemoveAssignee.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_RemoveLabel.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_ReopenDiscussion.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_ReopenIssue.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_ReopenPullRequest.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_RequestPrReview.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_ResolveDependabotAlerts.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_ResolveSecretScanningAlerts.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_RestrictionsCanPush.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_RunOrgMigration.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_RunsOn.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_SetEnterpriseInteractionLimits.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_SetInteractionLimits.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_SetIssueType.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_SetMilestone.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_SetSocialPreview.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_SyncedTo.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_ToggleDiscussionAnswer.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_ToggleDiscussionCommentMinimize.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_TransferRepository.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_UsesSecret.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_UsesVariable.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_ValidToken.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_ViewDependabotAlerts.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_ViewEnterpriseActionsUsageMetrics.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_ViewEnterpriseBilling.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_ViewEnterpriseSecretScanningAlerts.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_ViewSecretScanningAlerts.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_WriteCodeScanning.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_WriteEnterpriseActionsPolicies.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_WriteEnterpriseBilling.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_WriteEnterprisePersonalAccessTokenPolicies.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_WriteEnterpriseSso.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_WriteEnterpriseTeamMembers.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_WriteOrganizationActionsSecrets.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_WriteOrganizationActionsSettings.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_WriteOrganizationActionsVariables.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_WriteOrganizationCustomOrgRole.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_WriteOrganizationCustomRepoRole.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_WriteOrganizationNetworkConfigurations.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_WriteRepoContents.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/edges/GH_WriteRepoPullRequests.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/nodes/GH_App.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/nodes/GH_AppInstallation.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/nodes/GH_Branch.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/nodes/GH_BranchProtectionRule.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/nodes/GH_Enterprise.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/nodes/GH_EnterpriseManagedUser.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/nodes/GH_EnterpriseRole.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/nodes/GH_EnterpriseRunnerGroup.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/nodes/GH_EnterpriseTeam.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/nodes/GH_Environment.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/nodes/GH_EnvironmentBranchPolicy.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/nodes/GH_EnvironmentSecret.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/nodes/GH_EnvironmentVariable.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/nodes/GH_ExternalIdentity.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/nodes/GH_OrgRole.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/nodes/GH_OrgRunnerGroup.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/nodes/GH_OrgSecret.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/nodes/GH_OrgVariable.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/nodes/GH_Organization.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/nodes/GH_PersonalAccessToken.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/nodes/GH_PersonalAccessTokenRequest.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/nodes/GH_RepoRole.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/nodes/GH_RepoSecret.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/nodes/GH_RepoVariable.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/nodes/GH_Repository.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/nodes/GH_Runner.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/nodes/GH_RunnerGroup.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/nodes/GH_SamlIdentityProvider.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/nodes/GH_Secret.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/nodes/GH_SecretScanningAlert.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/nodes/GH_Team.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/nodes/GH_TeamRole.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/nodes/GH_User.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/nodes/GH_Variable.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/nodes/GH_Workflow.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/nodes/GH_WorkflowStep.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/docs/og-docs.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/privilege_zone_rules/t0-all-repo-admin-role.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/privilege_zone_rules/t0-app-installations-all-repos.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/privilege_zone_rules/t0-apps-all-repos.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/privilege_zone_rules/t0-enterprise-owners-role.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/privilege_zone_rules/t0-external-identities-owners.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/privilege_zone_rules/t0-organizations.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/privilege_zone_rules/t0-owner-users.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/privilege_zone_rules/t0-owners-role.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/privilege_zone_rules/t0-pats-all-repos.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/privilege_zone_rules/t0-privilege-escalation-roles.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/privilege_zone_rules/t0-privilege-escalation-users.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/privilege_zone_rules/t0-saml-identity-providers.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/actions-sha-pinning-not-required.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/active-leaked-secrets.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/advanced-security-disabled-new-repos.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/all-actions-allowed.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/app-installations-all-repos.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/branch-protection-admins-not-enforced.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/branch-protection-deletions-allowed.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/branch-protection-force-pushes.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/branch-protection-no-code-owner-reviews.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/branch-protection-no-pr-reviews.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/branch-protection-no-status-checks.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/branch-protection-self-approval.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/branch-protection-stale-reviews.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/bypass-pr-requirements.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/dangerous-branch-perms.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/default-repository-permissions.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/demo-sso-to-cloud-round-trip.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/dependabot-alerts-disabled-new-repos.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/dependabot-updates-disabled-new-repos.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/dependency-graph-disabled-new-repos.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/environments-admin-bypass.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/expired-pats.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/external-identities-without-scim.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/github-to-azure-identity.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/global-repo-perms.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/hybrid-identities.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/members-can-change-repo-visibility.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/members-can-create-pages.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/members-can-create-public-repos.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/members-can-delete-repos.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/members-can-fork-private-repos.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/members-can-invite-outside-collaborators.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/org-owners.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/orgs-without-2fa.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/pats-all-repo-access.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/pending-pat-requests.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/private-repos-forking-allowed.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/privileged-custom-org-roles.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/privileged-hybrid-identities.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/public-repos.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/push-protection-disabled-new-repos.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/push-to-protected-branches.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/repos-secret-scanning-disabled.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/repos-vulnerable-to-workflow-secret-exfil.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/repository-workflows.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/saml-configuration.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/secret-scanning-alerts.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/secret-scanning-disabled-new-repos.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/secrets-reachable-by-user.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/team-membership-admin.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/team-structure.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/unprotected-branches.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/unprotected-default-branch-with-workflow.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/unprotected-default-branches.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/web-commit-signoff-not-required.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/workflow-jobs-with-broad-token-write-permissions.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/workflow-jobs-with-id-token-write.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/extension/saved_searches/workflow-jobs-with-observed-oidc-auth-steps.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/justfile +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/pyproject.toml +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/scripts/generate_gh_description_docs.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/main.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/__init__.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/auth.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/extension.yaml +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/github_rest_client.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/github_retry.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/graph.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/graphql.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/helpers.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/kinds/nodes.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/main.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/__init__.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/actions_permission.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/app_installation.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/branch.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/branch_pr_bypass_allowance.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/branch_protection_rule.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/branch_push_allowance.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/enterprise.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/enterprise_admin.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/enterprise_helpers.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/enterprise_managed_user.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/enterprise_member.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/enterprise_organization.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/enterprise_role.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/enterprise_role_team.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/enterprise_role_user.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/enterprise_team.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/enterprise_team_member.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/enterprise_team_organization.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/enterprise_team_role.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/enterprise_user.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/env_secret.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/env_variable.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/environment.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/environment_branch_policy.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/external_identity.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/org.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/org_role.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/org_role_member.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/org_role_team.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/org_secret.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/org_variable.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/personal_access_token.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/personal_access_token_access.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/personal_access_token_request.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/projected_enterprise_team.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/repo_role_assignment.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/repository.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/repository_role.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/repository_secret.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/repository_variable.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/saml_assertion_consumer_service.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/saml_helpers.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/saml_issuer.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/saml_provider.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/saml_service_provider.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/scim_user.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/secret_scanning_alert.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/team.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/team_member.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/team_role.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/user.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/models/workflow.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/resources/__init__.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/resources/enterprise.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/resources/organization.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/runner_ids.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/src/openhound_github/source.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_app_auth.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_branch_collection_gate.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_branch_protection_traversability.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_data/api/actions-permissions.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_data/api/actionsecrets.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_data/api/app.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_data/api/appinstalls.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_data/api/branch-policies.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_data/api/branch-prot-rules.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_data/api/branches.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_data/api/custom-roles.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_data/api/environments.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_data/api/org-pat-request.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_data/api/org-pat.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_data/api/org-role-teams.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_data/api/org-role-users.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_data/api/org-roles.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_data/api/org.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_data/api/pat-repositories.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_data/api/repo-collaborators.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_data/api/repo-teams.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_data/api/repositories.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_data/api/scimusers.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_data/api/secrets.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_data/api/secretscanningalert.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_data/api/selected-org-secrets.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_data/api/variables.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_data/api/workflows.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_description_docs.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_enterprise_capabilities.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_enterprise_organization.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_enterprise_resources.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_environment_model.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_environment_resources.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_environment_reviewer_lookup.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_error_resilience.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_github_app_retry.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_github_rest_client.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_github_retry.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_helpers.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_org_scim_resources.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_org_secret_models.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_repository_rulesets.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_runner_ids.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_runner_resources.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_saml_helpers.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_saml_models.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_scim_models.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_source_endpoints.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_source_org_canonicalization.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_team_external_groups.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_variable_models.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/tests/test_workflow_resources.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.0}/uv.lock +0 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# GH_CanAccessSecret
|
|
2
|
+
|
|
3
|
+
## General Information
|
|
4
|
+
|
|
5
|
+
The traversable GH_CanAccessSecret edge represents that a GitHub Actions workflow job execution context can access a statically referenced secret.
|
|
6
|
+
|
|
7
|
+
This edge is derived from the existing non-traversable GH_UsesSecret relationships on the job's contained steps and from job-level `env` declarations. It is intended for attack-path analysis from a compromised job execution context to the secrets that context can read.
|
|
8
|
+
|
|
9
|
+
The collector only emits this edge when one of the workflow job's modeled steps or the job's `env` block statically references the secret. The existence of a secret in the repository, organization, or environment scope alone is not enough. For this initial implementation, secrets passed through `jobs.<job_id>.secrets` to reusable workflows are retained as structural references but are not projected as runtime access for the caller job.
|
|
10
|
+
|
|
11
|
+
## Edge Schema
|
|
12
|
+
|
|
13
|
+
| Source | Destination | Traversable |
|
|
14
|
+
| --- | --- | --- |
|
|
15
|
+
| `GH_WorkflowJob` | `GH_EnvironmentSecret` | `true` |
|
|
16
|
+
| `GH_WorkflowJob` | `GH_OrgSecret` | `true` |
|
|
17
|
+
| `GH_WorkflowJob` | `GH_RepoSecret` | `true` |
|
|
18
|
+
|
|
19
|
+
## Diagram
|
|
20
|
+
|
|
21
|
+
```mermaid
|
|
22
|
+
graph LR
|
|
23
|
+
n0["GH_WorkflowJob"]
|
|
24
|
+
n1["GH_EnvironmentSecret"]
|
|
25
|
+
n2["GH_OrgSecret"]
|
|
26
|
+
n3["GH_RepoSecret"]
|
|
27
|
+
n0 -->|GH_CanAccessSecret| n1
|
|
28
|
+
n0 -->|GH_CanAccessSecret| n2
|
|
29
|
+
n0 -->|GH_CanAccessSecret| n3
|
|
30
|
+
```
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# GH_CanInterceptJob
|
|
2
|
+
|
|
3
|
+
## General Information
|
|
4
|
+
|
|
5
|
+
The traversable GH_CanInterceptJob edge represents that a self-hosted runner not explicitly marked ephemeral can intercept a GitHub Actions workflow job that GitHub could schedule on it.
|
|
6
|
+
|
|
7
|
+
This edge is derived from GH_RunsOn and is intended for attack-path analysis. It does not mean that the job has historically executed on the runner. It means that control of the runner may expose the future execution context of the job when the runner is not ephemeral.
|
|
8
|
+
|
|
9
|
+
The collector does not emit this edge for runners GitHub explicitly marks as ephemeral.
|
|
10
|
+
|
|
11
|
+
## Edge Schema
|
|
12
|
+
|
|
13
|
+
| Source | Destination | Traversable |
|
|
14
|
+
| --- | --- | --- |
|
|
15
|
+
| `GH_Runner` | `GH_WorkflowJob` | `true` |
|
|
16
|
+
|
|
17
|
+
## Diagram
|
|
18
|
+
|
|
19
|
+
```mermaid
|
|
20
|
+
graph LR
|
|
21
|
+
n0["GH_Runner"]
|
|
22
|
+
n1["GH_WorkflowJob"]
|
|
23
|
+
n0 -->|GH_CanInterceptJob| n1
|
|
24
|
+
```
|
{openhound_github-0.9.0 → openhound_github-0.10.0}/descriptions/nodes/GH_EnterpriseRunner.md
RENAMED
|
@@ -8,6 +8,8 @@ The node captures runner metadata such as operating system, status, busy state,
|
|
|
8
8
|
|
|
9
9
|
GH_RunsOn edges from GH_WorkflowJob nodes identify statically resolvable jobs that GitHub could schedule on this runner through the inherited enterprise runner-group topology. These edges do not indicate that the job has actually executed on the runner.
|
|
10
10
|
|
|
11
|
+
When the runner is not explicitly marked ephemeral, GH_CanInterceptJob edges identify workflow jobs whose future execution context may be exposed to an actor controlling the runner.
|
|
12
|
+
|
|
11
13
|
## Properties
|
|
12
14
|
|
|
13
15
|
| Property | Type | Description |
|
|
@@ -34,6 +36,7 @@ GH_RunsOn edges from GH_WorkflowJob nodes identify statically resolvable jobs th
|
|
|
34
36
|
| `query_group` | `string` | Query for group. |
|
|
35
37
|
| `query_repositories` | `string` | Query for repositories. |
|
|
36
38
|
| `query_jobs` | `string` | Query for workflow jobs that can be scheduled on the runner. |
|
|
39
|
+
| `query_interceptable_jobs` | `string` | Query for workflow jobs the runner can intercept. |
|
|
37
40
|
|
|
38
41
|
## Diagram
|
|
39
42
|
|
|
@@ -45,4 +48,5 @@ graph LR
|
|
|
45
48
|
n0 -.->|GH_Contains| n1
|
|
46
49
|
n0 -->|GH_HasRunner| n1
|
|
47
50
|
n2 -.->|GH_RunsOn| n1
|
|
51
|
+
n1 -->|GH_CanInterceptJob| n2
|
|
48
52
|
```
|
|
@@ -8,6 +8,8 @@ The node captures runner metadata such as operating system, status, busy state,
|
|
|
8
8
|
|
|
9
9
|
GH_RunsOn edges from GH_WorkflowJob nodes identify statically resolvable jobs that GitHub could schedule on this runner under the current runner-group access policy. These edges do not indicate that the job has actually executed on the runner.
|
|
10
10
|
|
|
11
|
+
When the runner is not explicitly marked ephemeral, GH_CanInterceptJob edges identify workflow jobs whose future execution context may be exposed to an actor controlling the runner.
|
|
12
|
+
|
|
11
13
|
## Properties
|
|
12
14
|
|
|
13
15
|
| Property | Type | Description |
|
|
@@ -34,6 +36,7 @@ GH_RunsOn edges from GH_WorkflowJob nodes identify statically resolvable jobs th
|
|
|
34
36
|
| `query_group` | `string` | Query for group. |
|
|
35
37
|
| `query_repositories` | `string` | Query for repositories. |
|
|
36
38
|
| `query_jobs` | `string` | Query for workflow jobs that can be scheduled on the runner. |
|
|
39
|
+
| `query_interceptable_jobs` | `string` | Query for workflow jobs the runner can intercept. |
|
|
37
40
|
|
|
38
41
|
## Diagram
|
|
39
42
|
|
|
@@ -45,4 +48,5 @@ graph LR
|
|
|
45
48
|
n0 -.->|GH_Contains| n1
|
|
46
49
|
n0 -->|GH_HasRunner| n1
|
|
47
50
|
n2 -.->|GH_RunsOn| n1
|
|
51
|
+
n1 -->|GH_CanInterceptJob| n2
|
|
48
52
|
```
|
|
@@ -8,6 +8,8 @@ The node captures runner metadata such as operating system, status, busy state,
|
|
|
8
8
|
|
|
9
9
|
GH_RunsOn edges from GH_WorkflowJob nodes identify statically resolvable jobs in the containing repository that GitHub could schedule on this runner. These edges do not indicate that the job has actually executed on the runner.
|
|
10
10
|
|
|
11
|
+
When the runner is not explicitly marked ephemeral, GH_CanInterceptJob edges identify workflow jobs whose future execution context may be exposed to an actor controlling the runner.
|
|
12
|
+
|
|
11
13
|
## Properties
|
|
12
14
|
|
|
13
15
|
| Property | Type | Description |
|
|
@@ -34,6 +36,7 @@ GH_RunsOn edges from GH_WorkflowJob nodes identify statically resolvable jobs in
|
|
|
34
36
|
| `query_group` | `string` | Query for group. |
|
|
35
37
|
| `query_repositories` | `string` | Query for repositories. |
|
|
36
38
|
| `query_jobs` | `string` | Query for workflow jobs that can be scheduled on the runner. |
|
|
39
|
+
| `query_interceptable_jobs` | `string` | Query for workflow jobs the runner can intercept. |
|
|
37
40
|
|
|
38
41
|
## Diagram
|
|
39
42
|
|
|
@@ -45,4 +48,5 @@ graph LR
|
|
|
45
48
|
n0 -.->|GH_CanUseRunner| n1
|
|
46
49
|
n0 -.->|GH_Contains| n1
|
|
47
50
|
n2 -.->|GH_RunsOn| n1
|
|
51
|
+
n1 -->|GH_CanInterceptJob| n2
|
|
48
52
|
```
|
|
@@ -8,6 +8,10 @@ When the job has a statically resolvable self-hosted `runs-on` selector, GH_Runs
|
|
|
8
8
|
|
|
9
9
|
When present, `job_permissions` captures the job-level `permissions` declaration from the workflow YAML. `effective_github_token_permissions` captures the calculated static `GITHUB_TOKEN` permissions after applying the repository default, workflow-level declaration, and job-level declaration.
|
|
10
10
|
|
|
11
|
+
GH_CanAccessSecret edges identify secrets statically referenced by the job's modeled steps or job-level `env` block that the job execution context can access. GH_CanInterceptJob edges from GH_Runner nodes not explicitly marked ephemeral identify jobs whose future execution context may be exposed if that runner is controlled.
|
|
12
|
+
|
|
13
|
+
When `runs_on_is_dynamic` is true, runner matching and interception status remain unresolved: the collector does not emit GH_CanInterceptJob edges for the job, so `query_interceptable_jobs` cannot match it and the absence of an edge must not be treated as evidence that the job is definitively non-interceptable.
|
|
14
|
+
|
|
11
15
|
## Properties
|
|
12
16
|
|
|
13
17
|
| Property | Type | Description |
|
|
@@ -37,6 +41,7 @@ When present, `job_permissions` captures the job-level `permissions` declaration
|
|
|
37
41
|
| `query_steps` | `string` | Query for workflow steps. |
|
|
38
42
|
| `query_references` | `string` | Query for workflow references (secrets and variables). |
|
|
39
43
|
| `query_runners` | `string` | Query for eligible self-hosted runners. |
|
|
44
|
+
| `query_accessible_secrets` | `string` | Query for secrets accessible to the job execution context. |
|
|
40
45
|
|
|
41
46
|
## Diagram
|
|
42
47
|
|
|
@@ -62,6 +67,10 @@ graph LR
|
|
|
62
67
|
n1 -.->|GH_UsesSecret| n7
|
|
63
68
|
n1 -.->|GH_UsesVariable| n8
|
|
64
69
|
n1 -.->|GH_RunsOn| n9
|
|
70
|
+
n1 -->|GH_CanAccessSecret| n3
|
|
71
|
+
n1 -->|GH_CanAccessSecret| n5
|
|
72
|
+
n1 -->|GH_CanAccessSecret| n7
|
|
73
|
+
n9 -->|GH_CanInterceptJob| n1
|
|
65
74
|
n1 -.->|GH_CallsWorkflow| n0
|
|
66
75
|
n1 -.->|GH_DependsOn| n1
|
|
67
76
|
n1 -.->|GH_Contains| n10
|
|
@@ -2,6 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
Pre-built Cypher queries for identifying security-relevant configurations across your GitHub organization. Each query is stored as an individual JSON file with `name`, `query`, and `description` fields, designed to be imported into BloodHound's saved queries feature.
|
|
4
4
|
|
|
5
|
+
## Runner Interception Analysis
|
|
6
|
+
|
|
7
|
+
Use the runner interception searches as a progression:
|
|
8
|
+
|
|
9
|
+
1. Start with `workflow-jobs-interceptable-by-self-hosted-runners.json` to inventory jobs whose future execution context may be exposed to collected self-hosted runners.
|
|
10
|
+
2. Prioritize `shared-self-hosted-runners-can-intercept-secret-bearing-jobs.json` because organization- and enterprise-scoped runners can create cross-repository blast radius.
|
|
11
|
+
3. Use `self-hosted-runners-can-intercept-broad-token-jobs.json` and `workflow-jobs-with-id-token-write-on-self-hosted-runners.json` to find interceptable jobs with high-impact GITHUB_TOKEN or OIDC permissions.
|
|
12
|
+
4. For a specific finding, follow `GH_RunsOn`, `GH_CanUseRunner`, `GH_CanAccessSecret`, and the workflow/job/step nodes to verify why the runner is eligible and what the job can access.
|
|
13
|
+
|
|
5
14
|
## Severity Levels
|
|
6
15
|
|
|
7
16
|
| Indicator | Severity | Description |
|
|
@@ -80,24 +89,27 @@ Pre-built Cypher queries for identifying security-relevant configurations across
|
|
|
80
89
|
| 40 | `org-roles-bypass-security-scanning.json` | Org Roles That Can Bypass Security Scanning | Finds organization roles with permissions to bypass or manage security scanning dismissals. These roles can suppress secret scanning and code scanning findings. |
|
|
81
90
|
| 41 | `github-to-azure-identity.json` | GitHub-to-Azure Identity Assumptions | Finds GitHub entities (repositories, branches, environments) that can assume Azure identities via OIDC federation. Verify that each trust relationship is intentional and scoped appropriately. |
|
|
82
91
|
| 42 | `workflow-jobs-with-id-token-write.json` | Workflow Jobs with OIDC Token Permission | Returns workflow jobs whose effective GITHUB_TOKEN permissions include `id-token:write`. |
|
|
83
|
-
| 43 | `workflow-jobs-with-id-token-write-on-self-hosted-runners.json` | OIDC-Capable Workflow Jobs
|
|
92
|
+
| 43 | `workflow-jobs-with-id-token-write-on-self-hosted-runners.json` | OIDC-Capable Workflow Jobs Interceptable by Self-Hosted Runners | Returns OIDC-capable jobs whose execution context may be exposed to collected self-hosted runners. |
|
|
84
93
|
| 44 | `workflow-jobs-with-broad-token-write-permissions.json` | Workflow Jobs with Broad GITHUB_TOKEN Write Permissions | Returns jobs with effective write access to repository contents, Actions, or pull requests. |
|
|
85
94
|
| 45 | `workflow-jobs-with-observed-oidc-auth-steps.json` | Workflow Jobs with Observed OIDC Authentication Steps | Returns OIDC-capable jobs with descendant steps that show likely token consumption. |
|
|
95
|
+
| 46 | `workflow-jobs-interceptable-by-self-hosted-runners.json` | Workflow Jobs Interceptable by Self-Hosted Runners | Returns workflow jobs whose future execution context may be exposed to collected self-hosted runners. |
|
|
96
|
+
| 47 | `shared-self-hosted-runners-can-intercept-secret-bearing-jobs.json` | Shared Self-Hosted Runners Can Intercept Secret-Bearing Jobs | Returns shared organization- and enterprise-scoped runners that can intercept jobs with secret access. |
|
|
97
|
+
| 48 | `self-hosted-runners-can-intercept-broad-token-jobs.json` | Self-Hosted Runners Can Intercept Broad-Token Jobs | Returns self-hosted runners that can intercept jobs with high-impact GITHUB_TOKEN write permissions. |
|
|
86
98
|
|
|
87
99
|
### :white_circle: Low — Hygiene & Governance
|
|
88
100
|
|
|
89
101
|
| # | File | Name | Description |
|
|
90
102
|
|---|------|------|-------------|
|
|
91
|
-
|
|
|
92
|
-
|
|
|
93
|
-
|
|
|
94
|
-
|
|
|
95
|
-
|
|
|
96
|
-
|
|
|
97
|
-
|
|
|
98
|
-
|
|
|
99
|
-
|
|
|
100
|
-
|
|
|
101
|
-
|
|
|
102
|
-
|
|
|
103
|
-
|
|
|
103
|
+
| 49 | `environments-admin-bypass.json` | Environments Where Admins Can Bypass Protections | Finds deployment environments where administrators can bypass protection rules such as required reviewers and wait timers. Admins can deploy to these environments without any approval. |
|
|
104
|
+
| 50 | `app-installations-all-repos.json` | App Installations with Access to All Repositories | Finds GitHub App installations that have access to every repository in the organization. A compromised app credential would affect all repositories. |
|
|
105
|
+
| 51 | `users-without-external-identity.json` | GitHub Users Without External Identity Mapping | Finds GitHub users that are not linked to any external identity via SAML or SCIM. These users cannot be centrally offboarded through the identity provider and may retain access after employment ends. |
|
|
106
|
+
| 52 | `external-identities-without-scim.json` | External Identities Without SCIM Provisioning | Finds external identities that lack SCIM synchronization. Without SCIM, user deprovisioning in the identity provider will not automatically revoke GitHub access. |
|
|
107
|
+
| 53 | `org-owners.json` | Organization Owners | Returns all users who hold the organization owners role. |
|
|
108
|
+
| 54 | `privileged-custom-org-roles.json` | Privileged Custom Org Roles | Returns all custom organization roles that are privileged (i.e., have permissions that are not default). |
|
|
109
|
+
| 55 | `global-repo-perms.json` | Global Repo Permissions | Returns all users who hold a global repository permission role (i.e., roles that are not default). |
|
|
110
|
+
| 56 | `hybrid-identities.json` | External Identities | Returns all external identities (e.g., Azure or Okta users) that are associated with GitHub users. |
|
|
111
|
+
| 57 | `privileged-hybrid-identities.json` | Privileged Hybrid Identities | Returns all hybrid identities (e.g., Azure or Okta users) that are associated with GitHub users who hold the organization owners role. |
|
|
112
|
+
| 58 | `saml-configuration.json` | SAML Configuration Mapping | Finds SAML Identity Providers, their external identities, and mapped users. |
|
|
113
|
+
| 59 | `team-membership-admin.json` | Team Membership Admins | Returns all users who hold the maintainer role over a team, including team nesting. |
|
|
114
|
+
| 60 | `team-structure.json` | Team Structure | Returns the structure of teams within organizations, including team roles and their members. |
|
|
115
|
+
| 61 | `repository-workflows.json` | Repository Workflows | Returns all repository workflows. |
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "GitHub: Self-Hosted Runners Can Intercept Broad-Token Jobs",
|
|
3
|
+
"query": "MATCH p=(runner:GH_Runner)-[:GH_CanInterceptJob]->(job:GH_WorkflowJob)\nWHERE 'contents:write' IN job.effective_github_token_permissions\nOR 'actions:write' IN job.effective_github_token_permissions\nOR 'pull-requests:write' IN job.effective_github_token_permissions\nRETURN p\nLIMIT 1000",
|
|
4
|
+
"description": "Returns self-hosted runners that can intercept workflow jobs whose effective GITHUB_TOKEN has high-impact write permissions. These jobs can materially increase the blast radius of runner compromise."
|
|
5
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "GitHub: Shared Self-Hosted Runners Can Intercept Secret-Bearing Jobs",
|
|
3
|
+
"query": "MATCH p=(runner:GH_Runner)-[:GH_CanInterceptJob]->(job:GH_WorkflowJob)-[:GH_CanAccessSecret]->(secret:GH_Secret)\nWHERE runner:GH_OrgRunner\nOR runner:GH_EnterpriseRunner\nRETURN p\nLIMIT 1000",
|
|
4
|
+
"description": "Returns organization- and enterprise-scoped self-hosted runners that can intercept workflow jobs with statically resolvable secret access. Shared runners are especially important to review because compromise can expose execution contexts across multiple repositories."
|
|
5
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "GitHub: Workflow Jobs Interceptable by Self-Hosted Runners",
|
|
3
|
+
"query": "MATCH p=(runner:GH_Runner)-[:GH_CanInterceptJob]->(job:GH_WorkflowJob)\nRETURN p\nLIMIT 1000",
|
|
4
|
+
"description": "Returns workflow jobs whose future execution context may be exposed to an actor controlling a collected self-hosted runner that is not explicitly marked ephemeral."
|
|
5
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "GitHub: OIDC-Capable Workflow Jobs Interceptable by Self-Hosted Runners",
|
|
3
|
+
"query": "MATCH p=(runner:GH_Runner)-[:GH_CanInterceptJob]->(job:GH_WorkflowJob)\nWHERE 'id-token:write' IN job.effective_github_token_permissions\nRETURN p\nLIMIT 1000",
|
|
4
|
+
"description": "Returns OIDC-capable workflow jobs whose execution context may be exposed to an actor controlling a collected self-hosted runner that is not explicitly marked ephemeral. These jobs are especially important to review because runner compromise could expose short-lived cloud federation tokens."
|
|
5
|
+
}
|
|
@@ -1035,6 +1035,11 @@
|
|
|
1035
1035
|
"description": "[Workflow] Job can be scheduled on this self-hosted runner based on its static runs-on selector — GH_WorkflowJob → GH_Runner",
|
|
1036
1036
|
"is_traversable": false
|
|
1037
1037
|
},
|
|
1038
|
+
{
|
|
1039
|
+
"name": "GH_CanInterceptJob",
|
|
1040
|
+
"description": "[Computed] Persistent self-hosted runner can intercept a workflow job that may be scheduled on it — GH_Runner → GH_WorkflowJob",
|
|
1041
|
+
"is_traversable": true
|
|
1042
|
+
},
|
|
1038
1043
|
{
|
|
1039
1044
|
"name": "GH_HasMember",
|
|
1040
1045
|
"description": "Enterprise or organization has this user as a member",
|
|
@@ -1045,6 +1050,11 @@
|
|
|
1045
1050
|
"description": "[Workflow] Job or step references a secret by name — GH_WorkflowJob / GH_WorkflowStep → GH_RepoSecret / GH_OrgSecret / GH_EnvironmentSecret (scope match)",
|
|
1046
1051
|
"is_traversable": false
|
|
1047
1052
|
},
|
|
1053
|
+
{
|
|
1054
|
+
"name": "GH_CanAccessSecret",
|
|
1055
|
+
"description": "[Computed] Workflow job execution context can access a statically referenced secret — GH_WorkflowJob → GH_RepoSecret / GH_OrgSecret / GH_EnvironmentSecret",
|
|
1056
|
+
"is_traversable": true
|
|
1057
|
+
},
|
|
1048
1058
|
{
|
|
1049
1059
|
"name": "GH_UsesVariable",
|
|
1050
1060
|
"description": "[Workflow] Job or step references a variable by name — GH_WorkflowJob / GH_WorkflowStep → GH_RepoVariable / GH_OrgVariable / GH_EnvironmentVariable (scope match)",
|
|
@@ -19,6 +19,8 @@ MEMBER_OF = "GH_MemberOf"
|
|
|
19
19
|
CAN_ACCESS = "GH_CanAccess"
|
|
20
20
|
CAN_USE_RUNNER = "GH_CanUseRunner"
|
|
21
21
|
RUNS_ON = "GH_RunsOn"
|
|
22
|
+
CAN_INTERCEPT_JOB = "GH_CanInterceptJob"
|
|
23
|
+
CAN_ACCESS_SECRET = "GH_CanAccessSecret"
|
|
22
24
|
IS_ELIGIBLE_FOR = "GH_IsEligibleFor"
|
|
23
25
|
CAN_CREATE_REPOSITORY_WITH_RUNNER_ACCESS = "GH_CanCreateRepositoryWithRunnerAccess"
|
|
24
26
|
CAN_CREATE_BRANCH = "GH_CanCreateBranch"
|
|
@@ -218,13 +218,13 @@ class GithubLookup(LookupManager):
|
|
|
218
218
|
return True
|
|
219
219
|
|
|
220
220
|
@lru_cache
|
|
221
|
-
def
|
|
221
|
+
def _workflow_job_runner_matches(
|
|
222
222
|
self,
|
|
223
223
|
repository_node_id: str,
|
|
224
224
|
org_login: str,
|
|
225
225
|
group_name: str | None,
|
|
226
226
|
labels: tuple[str, ...],
|
|
227
|
-
) -> list[str]:
|
|
227
|
+
) -> list[tuple[str, bool | None]]:
|
|
228
228
|
"""Return accessible self-hosted runners matching a static runs-on selector."""
|
|
229
229
|
if not group_name and not labels:
|
|
230
230
|
return []
|
|
@@ -243,21 +243,23 @@ class GithubLookup(LookupManager):
|
|
|
243
243
|
|
|
244
244
|
repository_visibility, actions_enabled = repository
|
|
245
245
|
required_labels = {str(label).casefold() for label in labels}
|
|
246
|
-
|
|
246
|
+
matching_runners: list[tuple[str, bool | None]] = []
|
|
247
247
|
seen_runner_node_ids: set[str] = set()
|
|
248
248
|
|
|
249
|
-
def add_matching_runner(
|
|
249
|
+
def add_matching_runner(
|
|
250
|
+
node_id: str, raw_labels: Any, ephemeral: bool | None
|
|
251
|
+
) -> None:
|
|
250
252
|
if node_id in seen_runner_node_ids:
|
|
251
253
|
return
|
|
252
254
|
if not required_labels.issubset(self._runner_label_names(raw_labels)):
|
|
253
255
|
return
|
|
254
256
|
seen_runner_node_ids.add(node_id)
|
|
255
|
-
|
|
257
|
+
matching_runners.append((node_id, ephemeral))
|
|
256
258
|
|
|
257
259
|
if group_name is None:
|
|
258
|
-
for runner_id, raw_labels in self._find_all_objects(
|
|
260
|
+
for runner_id, raw_labels, ephemeral in self._find_all_objects(
|
|
259
261
|
f"""
|
|
260
|
-
SELECT id, labels
|
|
262
|
+
SELECT id, labels, ephemeral
|
|
261
263
|
FROM {self.schema}.repo_runners
|
|
262
264
|
WHERE repository_node_id = ?
|
|
263
265
|
""",
|
|
@@ -266,6 +268,7 @@ class GithubLookup(LookupManager):
|
|
|
266
268
|
add_matching_runner(
|
|
267
269
|
runner_node_id(repository_node_id, int(runner_id)),
|
|
268
270
|
raw_labels,
|
|
271
|
+
ephemeral,
|
|
269
272
|
)
|
|
270
273
|
|
|
271
274
|
if actions_enabled is not True:
|
|
@@ -329,9 +332,9 @@ class GithubLookup(LookupManager):
|
|
|
329
332
|
if not identity:
|
|
330
333
|
continue
|
|
331
334
|
enterprise_node_id, enterprise_runner_group_id = identity
|
|
332
|
-
for runner_id, raw_labels in self._find_all_objects(
|
|
335
|
+
for runner_id, raw_labels, ephemeral in self._find_all_objects(
|
|
333
336
|
f"""
|
|
334
|
-
SELECT r.id, r.labels
|
|
337
|
+
SELECT r.id, r.labels, r.ephemeral
|
|
335
338
|
FROM {self.schema}.enterprise_runner_group_memberships m
|
|
336
339
|
JOIN {self.schema}.enterprise_runners r
|
|
337
340
|
ON r.enterprise_node_id = m.enterprise_node_id
|
|
@@ -344,12 +347,13 @@ class GithubLookup(LookupManager):
|
|
|
344
347
|
add_matching_runner(
|
|
345
348
|
runner_node_id(enterprise_node_id, int(runner_id)),
|
|
346
349
|
raw_labels,
|
|
350
|
+
ephemeral,
|
|
347
351
|
)
|
|
348
352
|
continue
|
|
349
353
|
|
|
350
|
-
for runner_id, raw_labels in self._find_all_objects(
|
|
354
|
+
for runner_id, raw_labels, ephemeral in self._find_all_objects(
|
|
351
355
|
f"""
|
|
352
|
-
SELECT r.id, r.labels
|
|
356
|
+
SELECT r.id, r.labels, r.ephemeral
|
|
353
357
|
FROM {self.schema}.org_runner_group_memberships m
|
|
354
358
|
JOIN {self.schema}.org_runners r
|
|
355
359
|
ON r.org_login = m.org_login
|
|
@@ -362,9 +366,76 @@ class GithubLookup(LookupManager):
|
|
|
362
366
|
add_matching_runner(
|
|
363
367
|
runner_node_id(self.org_id_for_login(org_login), int(runner_id)),
|
|
364
368
|
raw_labels,
|
|
369
|
+
ephemeral,
|
|
365
370
|
)
|
|
366
371
|
|
|
367
|
-
return
|
|
372
|
+
return matching_runners
|
|
373
|
+
|
|
374
|
+
@lru_cache
|
|
375
|
+
def workflow_job_runner_node_ids(
|
|
376
|
+
self,
|
|
377
|
+
repository_node_id: str,
|
|
378
|
+
org_login: str,
|
|
379
|
+
group_name: str | None,
|
|
380
|
+
labels: tuple[str, ...],
|
|
381
|
+
) -> list[str]:
|
|
382
|
+
"""Return accessible self-hosted runner node IDs matching a static selector."""
|
|
383
|
+
return [
|
|
384
|
+
runner_node_id
|
|
385
|
+
for runner_node_id, _ephemeral in self._workflow_job_runner_matches(
|
|
386
|
+
repository_node_id,
|
|
387
|
+
org_login,
|
|
388
|
+
group_name,
|
|
389
|
+
labels,
|
|
390
|
+
)
|
|
391
|
+
]
|
|
392
|
+
|
|
393
|
+
@lru_cache
|
|
394
|
+
def workflow_job_interceptable_runner_node_ids(
|
|
395
|
+
self,
|
|
396
|
+
repository_node_id: str,
|
|
397
|
+
org_login: str,
|
|
398
|
+
group_name: str | None,
|
|
399
|
+
labels: tuple[str, ...],
|
|
400
|
+
) -> list[str]:
|
|
401
|
+
"""Return matching runner node IDs not explicitly marked ephemeral."""
|
|
402
|
+
return [
|
|
403
|
+
runner_node_id
|
|
404
|
+
for runner_node_id, ephemeral in self._workflow_job_runner_matches(
|
|
405
|
+
repository_node_id,
|
|
406
|
+
org_login,
|
|
407
|
+
group_name,
|
|
408
|
+
labels,
|
|
409
|
+
)
|
|
410
|
+
if ephemeral is not True
|
|
411
|
+
]
|
|
412
|
+
|
|
413
|
+
@lru_cache
|
|
414
|
+
def workflow_step_secret_reference_names(self, job_node_id: str) -> list[str]:
|
|
415
|
+
"""Return unique secret names statically referenced by steps in a job."""
|
|
416
|
+
names: list[str] = []
|
|
417
|
+
seen: set[str] = set()
|
|
418
|
+
for (raw_references,) in self._find_all_objects(
|
|
419
|
+
f"""
|
|
420
|
+
SELECT secret_references
|
|
421
|
+
FROM {self.schema}.workflow_steps
|
|
422
|
+
WHERE job_node_id = ?
|
|
423
|
+
""",
|
|
424
|
+
[job_node_id],
|
|
425
|
+
):
|
|
426
|
+
for reference in self._json_list(raw_references):
|
|
427
|
+
if not isinstance(reference, dict):
|
|
428
|
+
continue
|
|
429
|
+
name = reference.get("name")
|
|
430
|
+
if name is None:
|
|
431
|
+
continue
|
|
432
|
+
name = str(name)
|
|
433
|
+
key = name.casefold()
|
|
434
|
+
if key in seen:
|
|
435
|
+
continue
|
|
436
|
+
seen.add(key)
|
|
437
|
+
names.append(name)
|
|
438
|
+
return names
|
|
368
439
|
|
|
369
440
|
@lru_cache
|
|
370
441
|
def enterprise_idp_for_scope(
|
|
@@ -317,6 +317,7 @@ class GHRunnerProperties(GHNodeProperties):
|
|
|
317
317
|
query_group: Query for group.
|
|
318
318
|
query_repositories: Query for repositories.
|
|
319
319
|
query_jobs: Query for workflow jobs that can be scheduled on the runner.
|
|
320
|
+
query_interceptable_jobs: Query for workflow jobs the runner can intercept.
|
|
320
321
|
"""
|
|
321
322
|
|
|
322
323
|
scope: str | None = None
|
|
@@ -336,6 +337,7 @@ class GHRunnerProperties(GHNodeProperties):
|
|
|
336
337
|
query_group: str | None = None
|
|
337
338
|
query_repositories: str | None = None
|
|
338
339
|
query_jobs: str | None = None
|
|
340
|
+
query_interceptable_jobs: str | None = None
|
|
339
341
|
|
|
340
342
|
|
|
341
343
|
@app.asset(
|
|
@@ -387,6 +389,7 @@ class OrgRunner(BaseAsset):
|
|
|
387
389
|
query_group=f"MATCH p=(:GH_OrgRunnerGroup)-[:GH_HasRunner]->(:GH_OrgRunner {{node_id:'{rid}'}}) RETURN p",
|
|
388
390
|
query_repositories=f"MATCH p=(:GH_Repository)-[:GH_CanUseRunner]->(:GH_OrgRunnerGroup)-[:GH_HasRunner]->(:GH_OrgRunner {{node_id:'{rid}'}}) RETURN p",
|
|
389
391
|
query_jobs=f"MATCH p=(:GH_WorkflowJob)-[:GH_RunsOn]->(:GH_Runner {{node_id:'{rid}'}}) RETURN p",
|
|
392
|
+
query_interceptable_jobs=f"MATCH p=(:GH_Runner {{node_id:'{rid}'}})-[:GH_CanInterceptJob]->(:GH_WorkflowJob) RETURN p",
|
|
390
393
|
),
|
|
391
394
|
)
|
|
392
395
|
|
|
@@ -441,6 +444,7 @@ class EnterpriseRunner(BaseAsset):
|
|
|
441
444
|
query_group=f"MATCH p=(:GH_EnterpriseRunnerGroup)-[:GH_HasRunner]->(:GH_EnterpriseRunner {{node_id:'{rid}'}}) RETURN p",
|
|
442
445
|
query_repositories=f"MATCH p=(:GH_Repository)-[:GH_CanUseRunner]->(:GH_OrgRunnerGroup)-[:GH_InheritedFrom]->(:GH_EnterpriseRunnerGroup)-[:GH_HasRunner]->(:GH_EnterpriseRunner {{node_id:'{rid}'}}) RETURN p",
|
|
443
446
|
query_jobs=f"MATCH p=(:GH_WorkflowJob)-[:GH_RunsOn]->(:GH_Runner {{node_id:'{rid}'}}) RETURN p",
|
|
447
|
+
query_interceptable_jobs=f"MATCH p=(:GH_Runner {{node_id:'{rid}'}})-[:GH_CanInterceptJob]->(:GH_WorkflowJob) RETURN p",
|
|
444
448
|
),
|
|
445
449
|
)
|
|
446
450
|
|
|
@@ -878,6 +882,7 @@ class RepoRunner(BaseAsset):
|
|
|
878
882
|
environmentid=self.org_node_id,
|
|
879
883
|
query_repositories=f"MATCH p=(:GH_Repository {{node_id:'{self.repository_node_id}'}})-[:GH_CanUseRunner]->(:GH_RepoRunner {{node_id:'{rid}'}}) RETURN p",
|
|
880
884
|
query_jobs=f"MATCH p=(:GH_WorkflowJob)-[:GH_RunsOn]->(:GH_Runner {{node_id:'{rid}'}}) RETURN p",
|
|
885
|
+
query_interceptable_jobs=f"MATCH p=(:GH_Runner {{node_id:'{rid}'}})-[:GH_CanInterceptJob]->(:GH_WorkflowJob) RETURN p",
|
|
881
886
|
),
|
|
882
887
|
)
|
|
883
888
|
|