GitHub Team Modified


Description

Detects when a team is modified in some way, such as adding a new team, deleting a team, modifying members, or a change in repository control.

Query · python

def rule(event):

    if not event.get("action").startswith("team"):
        return False
    return (
        event.get("action") == "team.add_member"
        or event.get("action") == "team.add_repository"
        or event.get("action") == "team.change_parent_team"
        or event.get("action") == "team.create"
        or event.get("action") == "team.destroy"
        or event.get("action") == "team.remove_member"
        or event.get("action") == "team.remove_repository"
    )


def title(event):
    team_name = event.get("team") if "team" in event else "<MISSING_TEAM>"
    return f"GitHub.Audit: [{team_name}] has been modified"
Raw source GitHub Team Modified · Panther Python
Esc
Published by panther-labs/panther-analysis ↗, licensed under Apache 2.0 ↗. Reproduced here unmodified.
AnalysisType: rule
Filename: github_team_modified.py
RuleID: "GitHub.Team.Modified"
DisplayName: "GitHub Team Modified"
Enabled: true
LogTypes:
  - GitHub.Audit
Tags:
  - GitHub
  - Initial Access:Supply Chain Compromise
Reports:
  MITRE ATT&CK:
    - TA0001:T1195
Reference: https://docs.github.com/en/organizations/organizing-members-into-teams
Severity: Info
Description: Detects when a team is modified in some way, such as adding a new team, deleting a team, modifying members, or a change in repository control.
Tests:
  - Name: GitHub - Team Deleted
    ExpectedResult: true
    Log:
      {
        "actor": "cat",
        "action": "team.destroy",
        "created_at": 1621305118553,
        "data": { "team": "my-org/my-team" },
        "org": "my-org",
        "p_log_type": "GitHub.Audit",
        "repo": "my-org/my-repo",
      }
  - Name: GitHub - Team Created
    ExpectedResult: true
    Log:
      {
        "actor": "cat",
        "action": "team.create",
        "created_at": 1621305118553,
        "data": { "team": "my-org/my-team" },
        "org": "my-org",
        "p_log_type": "GitHub.Audit",
        "repo": "my-org/my-repo",
      }
  - Name: GitHub - Team Add repository
    ExpectedResult: true
    Log:
      {
        "actor": "cat",
        "action": "team.add_repository",
        "created_at": 1621305118553,
        "data": { "team": "my-org/my-team" },
        "org": "my-org",
        "p_log_type": "GitHub.Audit",
        "repo": "my-org/my-repo",
      }


# ------ paired body: github_team_modified.py ------

def rule(event):

    if not event.get("action").startswith("team"):
        return False
    return (
        event.get("action") == "team.add_member"
        or event.get("action") == "team.add_repository"
        or event.get("action") == "team.change_parent_team"
        or event.get("action") == "team.create"
        or event.get("action") == "team.destroy"
        or event.get("action") == "team.remove_member"
        or event.get("action") == "team.remove_repository"
    )


def title(event):
    team_name = event.get("team") if "team" in event else "<MISSING_TEAM>"
    return f"GitHub.Audit: [{team_name}] has been modified"

Detection rules belong to the projects that publish them and remain under their own licenses. This site indexes and links to them; it claims no rights in them.