Hunt: Gheist in your GitHub org: ci-sync-xxxxxx branches, runs deleted within a minute, the "gheist" user agent, and cloud role assumptions from attacker branches
- Branches: names matching
^ci-sync-[0-9a-z]{6}$whose only change adds.github/workflows/sync-check.ymlwith commit messageci: sync config. The commit is unsigned and authored as the token owner. - Audit log: workflow runs on
ci-sync-*branches deleted within about a minute of finishing, and any request with user agentgheist. Also watch for many repos cloned by one token minutes before the branch appears. - No GitHub logs? Use the cloud: if workflows use OIDC, search AWS CloudTrail (or GCP/Azure equivalents) for role assumptions or token exchanges whose subject contains
ci-sync-. That proves Actions ran on an attacker branch. - Self-hosted runners: files
.gdmp_pat,.gdmp_patg,.gdmp_sweepand the stringgdmp-pivotin job logs. If found, treat the host and its instance role as compromised. - Workflow content:
toJSON(secrets) }}' | base32 -w 120, and from Oct 19 the separator outputLAFA====. Workflow blob SHAs includef3da2b8b357dcda02fd455d314be2a95007516a6(plain) andd09535857a741bbb976bdc084a9a021713133291(timeout variant).
Harden: require reviewers on environments that hold production secrets, scope OIDC trust to protected branches or environments, swap personal access tokens for GitHub Apps or short-lived fine-grained tokens, and run self-hosted runners as ephemeral hosts without the Docker socket or open metadata access. Don't approve held sync-check runs.
Sources: Wiz Research: Gheist, attempted scaled abuse of stolen GitHub tokens stumbles (Oct 25)