← Back to SOC feed Coverage →

GitHub User Grants Access and Other User Grants Access

kql MEDIUM Azure-Sentinel
T1098T1078
huntingmicrosoftofficial
This rule was pulled from an open-source repository and enriched with AI. Validate in a test environment before deploying to production.
View original rule at Azure-Sentinel →
Retrieved: 2026-04-24T09:00:00Z · Confidence: medium

Hunt Hypothesis

Accounts in GitHub that grant access to other accounts, which in turn grant access to additional accounts, may indicate lateral movement or unauthorized access by an adversary. SOC teams should proactively hunt for this behavior in Azure Sentinel to identify potential compromise and unauthorized privilege escalation in their GitHub environments.

KQL Query


GitHubAudit
| where ImpactedUser != ""
| where Action == "org.invite_member" or Action == "org.add_member" or Action == "team.add_member" or Action == "repo.add_member"
| distinct ImpactedUser, TimeGenerated, Actor
| project-rename firstUserAdded = ImpactedUser, firstEventTime = TimeGenerated, firstAdderUser = Actor
| join kind= innerunique (
  GitHubAudit
  | where ImpactedUser != ""
  | where Action == "org.invite_member" or Action == "org.add_member" or Action == "team.add_member" or Action == "repo.add_member"
  | distinct ImpactedUser, TimeGenerated, Actor
  | project-rename secondUserAdded = ImpactedUser, secondEventTime = TimeGenerated, secondAdderUser = Actor
) on $left.secondUserAdded == $right.firstUserAdded
| where secondEventTime between (firstEventTime .. (firstEventTime + 1h))

Analytic Rule Definition

id: f18c4dfb-4fa6-4a9d-9bd3-f7569d1d685a
name: GitHub User Grants Access and Other User Grants Access
description: |
  'This hunting query identifies Accounts in GitHub that have granted access to another account which then grants access to yet another account that may be a sign of compromise.'
requiredDataConnectors: []
tactics:
  - Persistence
  - PrivilegeEscalation 
relevantTechniques:
  - T1098
  - T1078
query: |

  GitHubAudit
  | where ImpactedUser != ""
  | where Action == "org.invite_member" or Action == "org.add_member" or Action == "team.add_member" or Action == "repo.add_member"
  | distinct ImpactedUser, TimeGenerated, Actor
  | project-rename firstUserAdded = ImpactedUser, firstEventTime = TimeGenerated, firstAdderUser = Actor
  | join kind= innerunique (
    GitHubAudit
    | where ImpactedUser != ""
    | where Action == "org.invite_member" or Action == "org.add_member" or Action == "team.add_member" or Action == "repo.add_member"
    | distinct ImpactedUser, TimeGenerated, Actor
    | project-rename secondUserAdded = ImpactedUser, secondEventTime = TimeGenerated, secondAdderUser = Actor
  ) on $left.secondUserAdded == $right.firstUserAdded
  | where secondEventTime between (firstEventTime .. (firstEventTime + 1h))

MITRE ATT&CK Context

References

False Positive Guidance

Original source: https://github.com/Azure/Azure-Sentinel/blob/main/Hunting Queries/GitHub/User Grant Access and Grants Other Access.yaml