SecurityThreats & vulnerabilitiesNote

4,837 hijacked GitHub accounts probed 61,764 repos; at least 1,806 ran a secret stealer

Aikido’s count of the wfx-loot campaign of 10 and 11 November: how a stolen GitHub login became stolen CI secrets and cloud keys, what to check, and the settings that shut the door.

Illustration: The TechBag Journal

From 12:45 UTC on 10 November (6:15pm IST), 4,837 hijacked GitHub accounts opened pull requests in 61,764 repositories they could write to, each titled “docs: dependency audit notes”. The pull request was only a test of access. In at least 1,806 of those repositories a credential stealer then ran inside GitHub Actions, the service that runs a project’s build and deployment jobs, and the attacker reverted the change within a minute and deleted the run and its log, according to Aikido Security, which tracks the campaign as wfx-loot.1 Of the probe pull requests, 92% were still open when Aikido published on 12 November, which it reads as a sign that most owners had not noticed. About 50 of the hijacked accounts can publish packages to npm, PyPI, Go, crates or Packagist.1

4,837

hijacked GitHub accounts opened probe pull requests

Aikido

61,764

repositories probed, 10,431 of them through collaborator or organisation access

Aikido

1,806+

repositories where the stealer ran

Aikido

92%

of the probe pull requests still open on 12 November

Aikido

01The pull request knocks; a push does the stealing

The theft does not come through the pull request. A stolen token that can write to a repository can also add or change the workflow files that GitHub Actions runs, and GitHub’s own guidance says “any user with write access to your repository has read access to all secrets configured in your repository.”3 Aikido saw three ways in: about 1,500 lines added to an existing workflow, a new workflow file on a throwaway branch, or an npm “postinstall” hook that runs a script on any install.1

A stolen token with write access was enough to run the stealer and erase the evidence

The four steps of the wfx-loot campaign in each repository, from 10 November 2026

  1. 01

    Probe

    A “docs: dependency audit notes” pull request from a wfx-docs branch confirms write access.
  2. 02

    Push

    Commits such as “ci: refresh build cache” plant the same 1,500-line shell script in a workflow or install hook.
  3. 03

    Run

    The workflow runs with the repository’s secrets, tokens and cloud roles, and sends what it collects to the attacker’s server.
  4. 04

    Erase

    The commit is reverted and the run and its log deleted. A missing run number is often the only trace.

Source: Aikido Security, write-up of 12 November 2026 · as of 13 November 2026

The script collects Actions secrets, the workflow’s own GitHub token, cloud credentials, AI service keys and key files. It then uses GitHub’s sign-in tokens for clouds (OIDC) to open cloud sessions, and tries to stay in: it posts fake “passed” results under the names of a repository’s required checks, rewrites an AWS role to trust any account, and adds a federated credential to Azure applications that outlives every rotated secret.1 Aikido found the payload carried into two published packages through automated release jobs, but reads the aim as CI secrets, not spreading through packages.1

Aikido does not say how the accounts’ credentials were stolen. Accounts hit by an October campaign were “significantly more likely than baseline” to be hit again, though it assesses the two as distinct campaigns.1 BleepingComputer reported that some of the hijacked accounts belonged to Fortune 100 companies, the US General Services Administration, the French government, Nextcloud and WebdriverIO; it did not say what was taken from them.2

02What to check, and the settings that shut the door

Look for a wfx-docs branch, the probe pull request and gaps in workflow run numbers after 10 November. If the payload ran, Aikido’s advice is to treat every secret and cloud role available to that repository’s workflows as compromised.1 GitHub’s documentation offers four controls that each break one step:

  • Environment secrets with required reviewers. They are “only available to workflow jobs that reference the environment”, and a job “cannot access environment secrets until one of the required reviewers approves it.”4
  • Cloud roles that trust one environment or branch. The cloud checks the OIDC token’s subject against the role’s conditions, such as environment:prod or refs/heads/main, so a token minted on a throwaway branch does not match.5
  • A named source for each required check. Branch protection can require a check from one app; “if the status is set by any other person or integration, merging won’t be allowed.”6
  • A read-only default for the workflow token, raised only for the jobs that need more.3

Sources

  1. Aikido Security: wfx-loot campaign pushes CI secret stealer to tens of thousands of repositories — 12 November 2026
  2. BleepingComputer: Hackers compromise 4,800 GitHub accounts to steal cloud credentials — 12 November 2026
  3. GitHub Docs: Secure use reference (GitHub Actions) — undated page, read 13 November 2026
  4. GitHub Docs: Deployments and environments — undated page, read 13 November 2026
  5. GitHub Docs: OpenID Connect — undated page, read 13 November 2026
  6. GitHub Docs: About protected branches — undated page, read 13 November 2026

Disclosure. TechBag is a software reseller: it earns when companies buy through it, including from vendors named here. The analysis is TechBag’s own; no vendor paid for or saw this piece before publication. Facts are labelled reported, TechBag count or our view.