Gheist Turns Stolen GitHub Tokens Into a Secret-Dumping Service: 13,500+ 'ci-sync' Branches Print CI Secrets in Base32 — Private Repos and Self-Hosted Runners Hit

High · 2026-11-07 · By H.A

Gheist Turns Stolen GitHub Tokens Into a Secret-Dumping Service: 13,500+ 'ci-sync' Branches Print CI Secrets in Base32 — Private Repos and Self-Hosted Runners Hit

An automated campaign called Gheist uses stolen GitHub tokens to push sync-check workflows that leak every Actions secret through base32-encoded logs, then deletes the runs, across more than 850 compromised accounts.

Overview

Researchers have documented Gheist, an automated campaign that turns stolen GitHub tokens into a secret-dumping service. For every repository a stolen token can reach, the tool pushes a throwaway branch containing a workflow called sync-check. When the push triggers GitHub Actions, the workflow prints all available secrets into its own log in base32, the operator downloads that log through the GitHub API, and the run is deleted seconds later.

The campaign has been tracked since 15 September 2026. More than 13,500 planted branches across more than 850 compromised accounts have been recovered, from personal projects to private enterprise repositories. Activity was still ongoing and evolving as of 24 October.

The Campaign

The mechanics are simple and abuse only legitimate platform features:

Three design details make it effective:

Why Public Repositories Mostly Escaped

Since 28 July 2026 GitHub holds potentially malicious workflow runs in public repositories until a collaborator approves them. Every public Gheist run that researchers examined stayed at action_required — the control worked and the payload never ran. The hold does not apply to private repositories or GitHub Enterprise Server. There, audit logs showed ci-sync-* runs completing and being deleted by the gheist user agent, and cloud logs showed organisation workflows assuming AWS roles from those branches. In one enterprise case, cloud credentials from the same organisation were used hours later to enumerate AWS Secrets Manager.

Timeline

Tradecraft

The self-hosted runner job is the most dangerous addition. Logging each stage under a gdmp-pivot header, it collects host details and crontab; recursively searches for 31 token formats (including AI provider keys), private keys, .env files, Terraform state and shell history; dumps process environment variables; mounts the host root filesystem through the Docker socket; queries cloud metadata for AWS instance-role credentials; and grabs runner credential files and the Kubernetes service account token. Researchers noted bugs — a wrong runner key path, a broken regex, no working GCP or Azure token collection — but the intent is full host takeover.

The tokens themselves came from infostealer logs and tokens exposed in earlier supply-chain compromises. The same accounts also appear in other campaigns, which suggests stolen GitHub credentials are being traded and reused by several actors. The tool is distinct from the earlier GhostAction campaign. No attribution has been made.

Indicators of Compromise

Detection

List remote branches matching the pattern across your organisation's clones:

git ls-remote --heads origin | grep -E 'refs/heads/ci-sync-[0-9a-z]{6}$'

Recommended Actions

  1. Rotate every secret (repository, organisation and environment) reachable from an affected repository. Deleting the branch or run does not undo the exposure.
  2. Revoke the tokens that pushed the commits and check their owners' machines for infostealers.
  3. Treat any self-hosted runner that executed a ci-sync branch — and its instance role — as compromised; rebuild it.
  4. Never approve held sync-check runs or execute code from ci-sync branches.
  5. Require reviewers on environments holding production secrets, and scope OIDC trust policies to protected branches or environments.
  6. Replace classic personal access tokens with GitHub Apps or short-lived fine-grained tokens.
  7. Run self-hosted runners as ephemeral hosts without Docker socket access or unrestricted metadata access.

Analyst Assessment

Gheist shows how far a stolen developer token now reaches: one credential becomes every secret in every repository that token can push to, extracted through GitHub's own API with nothing to block at the network edge. The approval hold for public repositories proved its value; private and Enterprise Server repositories lack that safety net and are where the damage occurred. We rate this High. Organisations should hunt for the branch pattern today and assume that any secret exposed to an affected workflow is already in the attacker's hands.

REEF SENTINEL