Active campaignGitHub ActionsPrivate repos and GHESNothing to patch

Has the Gheist campaign stolen secrets from my GitHub repositories, and what should I do?

Gheist uses stolen GitHub tokens with write access to push a ci-sync branch whose workflow prints every Actions secret into the run log, then downloads the log and deletes the run within a minute of it finishing. It works on private repositories and GitHub Enterprise Server. There is nothing to patch: look for ci-sync branches, rotate every secret those repositories could read and revoke the tokens.

At a Glance

Based on security researchers' analysis of the campaign as reported on 26 October 2026, and on GitHub's own changelog and documentation. Last updated 26 October 2026, 10:40 GMT.

28 Jul

GitHub starts holding potentially malicious workflow runs for approval, on public github.com repositories only.

15 Sep

Security researchers begin tracking ci-sync branches that dump secrets into workflow logs.

19 Oct

Around this date a new job appears that hunts for credentials on self-hosted runners. It is buggy and no successful run has been reported.

Now

Still active as of 24 October. Search for ci-sync branches, rotate secrets and revoke the tokens behind them.

How the attack works

  • The attacker uses a stolen GitHub token with write access. Researchers traced tokens to infostealer malware logs and to earlier supply chain leaks such as the March compromise of the Trivy vulnerability scanner.
  • It pushes a branch named ci-sync- plus six characters, with a single unsigned commit, ci: sync config, that adds .github/workflows/sync-check.yml under the token owner's name.
  • The workflow prints the job environment and every secret the repository can read, encoded in base32 so log masking does not catch it. One version runs a job per deployment environment, so environment secrets, often production ones, are printed too.
  • The workflow sets an empty permissions block. That limits the built-in GITHUB_TOKEN but does not stop it reading secrets.
  • The tool downloads the log through the GitHub API and deletes the run within a minute of it finishing. Its API requests carry a user agent containing gheist. There is no attacker server and no outbound connection to block.
  • In enterprise organisations the tool cycled through tokens from several users and automation accounts within minutes and cloned private repositories.

What to Do in the Next 24 Hours

Proactive on the left. Reactive on the right. Tick both tracks.

Proactive: Make a Stolen Token Less Useful

There is nothing to patch. The goal is to find exposure fast and limit what any one token can reach.

Free Detection Pack

Built by the CybaVerse threat hunt team. Check repositories and self-hosted runners you or your clients run for signs of this campaign. Everything is read-only.

Verdicts

  • CLEANNo indicators found in what the checker could see.
  • INDICATORS FOUNDA ci-sync branch, sync-check workflow, known hash, held run or runner artefact was found. Start the reactive steps.
  • UNKNOWNThe check was incomplete, for example no access to a repository, rate limiting or an unreadable folder.
  • ERRORBad usage, a missing or rejected token, a network failure or a missing tool.

Exit codes

CodeMeaning
0CLEAN
1INDICATORS FOUND
2UNKNOWN, nothing found
3ERROR

MSPs and internal IT teams can use the exit code in RMM, CI or scheduled jobs to flag organisations and runners at scale. A finding outranks an unknown, and an unknown outranks clean.

Know the limits

  • The KQL has not been run against a live tenant, and the GitHub audit log field names in the KQL and Sigma are unverified. Validate table and field names in your own environment before relying on any result.
  • A deleted branch or run is invisible to the GitHub API, so CLEAN does not prove a repository was never hit. Use the audit log hunts as well.
  • The cloud hunts only see ci-sync branches when your OIDC trust allows branch-based subjects. Environment-based subjects need a wider review.
  • The pack contains the indicator strings, so it will match itself if you scan it.

Reactive: How to Hunt

Gheist leaves consistent traces in branches, audit logs, cloud logs and runners. CybaOps can run these hunts across your estate or your clients'.

Indicators of compromise

Three of the four workflow hashes were independently reproduced by rebuilding the published workflow text. The hash for the self-hosted runner version is as reported and has not been independently verified. The list is not exhaustive, because versions that list deployment environments differ per repository, so rely on the branch name, file, commit message and user agent first.

TypeIndicator
Branch name^ci-sync-[0-9a-z]{6}$, with a single commit that only adds .github/workflows/sync-check.yml
CommitMessage ci: sync config, unsigned, carrying the token owner's name
Workflow contenttoJSON(secrets) }}' | base32 -w 120
GitHub audit logUser agent containing gheist (the full value has not been published); runs on ci-sync branches deleted within a minute of finishing
Cloud logsOIDC role assumptions whose subject contains ci-sync-
Self-hosted runnersFiles .gdmp_pat, .gdmp_patg and .gdmp_sweep on the runner
Job logsHeader ===== gdmp-pivot: written to the job log by the self-hosted runner job (a log line, not a file)
Workflow blob SHAf3da2b8b357dcda02fd455d314be2a95007516a6 (Plain workflow, reproduced)
Workflow blob SHAd09535857a741bbb976bdc084a9a021713133291 (Timeout version, reproduced)
Workflow blob SHA1dc5af9cce950aad1eb1546ecce8565b117540c4 (Separator version, reproduced)
Workflow blob SHAc665b778b2d822453293003e7ca0bbb2cb08e39d (Version with the self-hosted runner job, reported but not independently verified)

If you find a ci-sync branch

  • Rotate every repository, organisation and environment secret the repository could read. Rotation is the only thing that ends the exposure.
  • Revoke the tokens that pushed the ci-sync commits and check their owners' devices for infostealer malware.
  • Treat any self-hosted runner that ran a ci-sync job as compromised, along with its cloud instance role. Rebuild it rather than cleaning it.
  • Do not approve held sync-check runs and do not run code from ci-sync branches.
  • Review cloud activity in the hours after the run. In affected enterprise organisations, cloud credentials from the same organisation were used to enumerate AWS Secrets Manager hours later. The research does not say where those credentials came from or who used them, so check every secrets store the exposed credentials could reach.
  • Keep the evidence. Deleting the branch or the run does not undo the exposure, so export audit log entries first.

Gheist FAQ

Short answers based on public reporting and GitHub guidance as of 26 October 2026.

Is Gheist a GitHub vulnerability?

No. There is no software flaw and nothing to patch. Gheist abuses stolen tokens that already have write access, and GitHub documents that any user with write access to a repository can read all of the secrets configured in it. The fix is to rotate exposed secrets, revoke the stolen tokens and reduce what a single token can reach.

Are private repositories and GitHub Enterprise Server affected?

Yes. Since 28 July 2026 GitHub holds potentially malicious workflow runs for approval, but only on public repositories on github.com. GitHub Enterprise Server does not add this protection, and private repositories are not covered, so in those environments the workflow runs and the secrets are exposed.

Does deleting the ci-sync branch or the workflow run fix it?

No. The secrets were exposed the moment the workflow printed them, and the attacker downloads the log as soon as the run finishes. Deleting the branch or the run removes evidence but not the exposure. Rotate every secret the repository could read and revoke the token that pushed the branch.

Why does GitHub log masking not hide the secrets?

The workflow encodes every secret in base32 before printing it. GitHub's own guidance says that because a secret can be transformed in many ways, automatic redaction is not guaranteed, so encoded values can appear in the log in readable form.

Where do the stolen tokens come from?

Security researchers traced them to infostealer malware logs and to tokens exposed in earlier software supply chain attacks, such as the March compromise of the Trivy vulnerability scanner. Check the devices of every developer whose token pushed a ci-sync branch.

What should MSPs and internal IT teams do first?

Search every GitHub organisation you or your clients run for branches matching ci-sync- followed by six characters. Where you find one, rotate the secrets that repository could read, revoke the token that pushed it and check its owner's device. Give priority to people and automation accounts with write access across many repositories or clients.

Detect and Remediate GitHub Token Abuse Across Your Estate

CybaOps monitors your endpoints, cloud accounts and developer platforms, whether that's your own business or your clients'. UK-based analysts monitor alerts 24/7, run these threat hunts and act on pre-approved response actions, and CybaOps drives remediation through to a verified fix, so proactive checks and reactive response happen in one place.