Security Guides

About 4,800 GitHub Accounts Abused With Apparently Stolen Tokens, CI Secrets and Cloud Credentials Stolen (November 2026): What Repository Owners Should Do Today

About 4,800 GitHub accounts were used with apparently stolen tokens to target repositories and steal CI and cloud credentials. Figures by firm, what to check.

Published 2026-11-14 Updated 2026-11-14 Last verified 2026-11-14 18 min read
On this page

For: people and organizations who develop or manage repositories on GitHub, and anyone who uses GitHub Actions or cloud credentials (including OIDC federation). This article is based on public posts by the security firms that investigated and on a notice from a related provider. It does not cover attack steps.

続報待ち:この記事は公式発表に合わせて更新します

Who is affected

people and organizations who develop or manage repositories on GitHub, and anyone who uses GitHub Actions or cloud credentials (including OIDC federation).

Confirmed so farSee the table ↓
  • About 4,800 accounts abused
  • Probe pull requests to 61,764 repositories
  • Repositories with malicious changes
3 more
  • Malicious code ran and credentials were sent out
  • Theft of secrets and cloud credentials
  • Contamination of published packages

Listed as possibly affected

  • Cloud-side persistence (settings that survive rotation)
Not yet confirmed
  • Final number of affected accounts and repositories (the investigating firms count differently)
  • How the tokens were first stolen (not established for the campaign as a whole, apart from the cloud provider's case)
  • An official GitHub statement (not stated as of the November 14 check)
2 more
  • Relationship to a separate October campaign by the same actor (Firms A and C do not assert a single actor)
  • Completion of the cloud provider's token revocation (the provider added that it stopped partway)
What to do nowSee the steps ↓
  1. Check for pull requests, branches and Actions runs you do not recognize
  2. Revoke the compromised account's tokens, authorizations and sessions
  3. If malicious changes may have run, rotate every secret and cloud permission that repository could read
3 more
  1. Check the cloud side for changes that survive a rotation
  2. Inventory your tokens and third-party apps
  3. Check that your own apps do not expose the version-control folder
Last checked
as of November 14, 2026
Follow-up plans and what we checked

The investigating firms' posts were all published on November 12 and read as subject to revision. As of November 14, the GitHub blog, changelog and status history showed no entry about this.

What repository owners and developers should do today

1

Check for pull requests, branches and Actions runs you do not recognize

In every repository your account can write to (including organizations where you are a collaborator), check these three things since November 10. According to Firm A, of 61,839 probe pull requests, 10,431 went to repositories the account does not own, reached through collaborator or organization access.

  • Pull requests that neither you nor a teammate opened. Even if the title looks harmless (such as a docs update), the same pattern across many repositories is a warning sign
  • Short-lived branches you do not recognize, or signs that branches were created and deleted
  • Actions run history with runs you do not recognize or gaps in run numbers. Firms A and C write that the attacker deletes runs and logs within about a minute, so a gap in numbering is a clue. Check the organization audit log as well

If you find any of these, continue below. Firm A writes that an account with a probe pull request should be treated as compromised even if the later stage did not run.

2

Revoke the compromised account's tokens, authorizations and sessions

This order follows the guidance of Firms B and C.

  • Revoke personal access tokens, authorizations to third-party apps (OAuth apps and GitHub apps), SSH keys and active sessions, then recreate only what you need
  • Enable two-factor authentication. A token that is already stolen works without it, so revoking the token comes first (our view)
  • Close the probe pull request and delete branches you do not recognize. Before deleting, record which account they were created under
3

If malicious changes may have run, rotate every secret and cloud permission that repository could read

Firms A and B write that if the malicious change ran, every secret and cloud role available to that workflow should be treated as stolen.

  • Reissue Actions secrets and variables (repository, environment and organization level), publishing tokens (including for packages) and deploy keys, and invalidate the old ones
  • If you use OIDC to reach a cloud account, include that cloud permission (next step)
  • If you built a repository that may have received a malicious change on a development machine, rotate the credentials that machine could read too (SSH keys, cloud credentials, package-publishing tokens and so on). Firms B and C report changes that run at package install time
  • If you published packages since November 10, check that the published versions do not contain the malicious change; if they do, withdraw them and republish from a clean state
4

Check the cloud side for changes that survive a rotation

As changes that survive a secret rotation, Firm A lists rewriting an AWS role trust policy and adding Azure federated credentials (Firm B also notes AWS access keys left behind). Check these two areas in both audit logs and current settings.

  • AWS: newly created access keys, and changes to role trust policies (has trust widened to unintended accounts or conditions)
  • Azure (Entra ID): federated credentials added to applications that point back to a repository

Separately, as a check for privilege escalation with stolen credentials, also look at Google Cloud (unusual service-account use or token-issuing calls) and Vault or Kubernetes (GitHub OIDC logins you do not recognize).

Even if you find nothing, check whether your OIDC trust conditions are narrowed to the repository, branch and environment (see "What to review" below).

5

Inventory your tokens and third-party apps

In your GitHub settings, list the following and remove what is unneeded or unfamiliar.

  • Personal access tokens: delete unused ones; for the rest, limit repositories, permissions and lifetime
  • OAuth apps and GitHub apps you authorized, including those connected for hosting or CI deployment. Remove authorization for any you no longer use
  • SSH keys and deploy keys: remove unused keys and keys without an owner
  • Permissions of bot and automation accounts: check for any that can bypass protected-branch rules

According to the cloud provider's notice, reconnection is required for that provider's app. If you use it, follow the provider's instructions.

6

Check that your own apps do not expose the version-control folder

The same provider explains that some apps deployed through GitHub published the whole build directory, so a token left there could be retrieved. Check that your app's public URL does not serve the contents of the version-control folder (.git). If it does, exclude it from the image, redeploy, and rotate any credentials it contained. Also check whether your deployment platform uses a similar mechanism.

The following is based on public posts by security firms A, B and C (all published November 12, 2026) and a notice from one cloud provider (learned the night of November 12, addendum on November 13). These are the parties' and investigators' own accounts and have not been confirmed by GitHub. Times are UTC unless stated.

  1. Nov 10, about 12:45

    According to Firm A, the attacker began operating, with stolen tokens, in the repositories each token could write to. In each repository it first sent a probe pull request, then made a malicious change, reverted it in about a minute, and deleted the run and logs. Firm B also counts the first malicious change at 12:46.
  2. Nov 11, 15:00

    End of the window for the 61,839 probe pull requests counted by Firm A.
  3. Nov 12, 04:36

    End of the window for the 8,093 public repositories with malicious changes counted by Firm B.
  4. Nov 12, 07:40

    Time at which Firm C counted more than 63,000 probe pull requests. Firms A, B and C published their posts the same day.
  5. Nov 12, 22:00 (time zone not stated)

    One cloud provider posted a notice saying it had learned (on November 12; no time given) that tokens issued to its GitHub app had been used by an unauthorized party on customer repositories (the provider's notice).
  6. Nov 13, 15:54

    The provider added that revocation of all user tokens stopped partway and that GitHub is investigating (the provider's notice).

Valid stolen token

A probe pull request tests whether it can write

↓

Malicious change

Collects CI secrets and cloud credentials and sends them out

↓

Covering tracks

Reverts the change, deletes runs and logs; settings may remain in the cloud

Flow per repository, based on the investigating firms' and the provider's accounts.
4,837
Accounts that sent probe pull requests (Firm A). Firm B counts 4,833
61,764
Repositories that received probe pull requests (Firm A). Probe only; whether changes followed is separate
1,835+
Repositories where the malicious code appears to have run and sent credentials out (Firm A; possibly a floor)
8,093
Public repositories that received malicious changes (Firm B). Not the number where it ran

Figures by source (do not add them together)

Source (role)What was countedFigureNote
Firm A (first to report)Accounts that sent / repositories that received probe pull requests4,837 accounts / 61,764 repositoriesAbout 92% are still open (the denominator is the 10,431 PRs sent to repositories the account does not own)
Firm ARepositories where the malicious code ran and credentials were sent outAt least 1,835 (1,806 elsewhere)Two figures within the post; it says the number may be a floor
Firm AAccounts that can publish packagesAt least 50Publishing rights on npm, Go, PyPI, Packagist and crates, as understood
Firm BPublic repositories with malicious changes (Nov 10 12:46 to Nov 12 04:36)8,093Not the number where it ran. The breakdown sums to 8,096; the difference is not explained
Firm BProbe pull requests61,879 PRs / 4,833 accounts / 61,734 repositoriesNot included in the 8,093
Firm CProbe pull requests (as of Nov 12, 07:40)More than 63,000About 90% open. 173 of them (19 accounts) came through tokens issued to one cloud provider's GitHub app
Cloud provider (its own notice)Probe pull requests found in affected customers' accountsMore than 250Says a small number of customers were affected

Firm B writes that its figures come from GitHub search, which covers only default branches of public repositories, so the true total is likely higher.

What was published (from the investigating firms' and the provider's posts)
What was stolen
GitHub Actions secrets and variables, workflow tokens, cloud credentials (AWS, Azure, Google Cloud), and developer and AI-service credentials (Firm A)
Cause (the investigators' account)
Abuse of valid stolen tokens, not a flaw in GitHub Actions (Firm C). The commits appear under the real users' names, unsigned, which points to stolen tokens (Firm B's inference)
How the tokens were obtained
Not established for the campaign as a whole. For the portion that came through the cloud provider's app, Firm C also says it could not establish how the tokens were obtained and has no evidence of a breach of the provider's infrastructure
The cloud provider's account
Its infrastructure was not breached. In GitHub-based deploys, a token was left in a configuration file in the build directory, and some apps published the whole directory, so it could be retrieved. A small number of customers were affected and contacted individually. It began revoking every user token issued to the app and changed the deploy process. It says deploys through its command-line tool, its API tokens and running apps are not affected
Impact on packages
Firm B examined 218 npm, Go and Packagist packages whose source repositories received malicious changes. Malicious versions existed in three packages (one Packagist, two Go), five versions in total in its list; it found no others. PyPI and others were not checked. Firm A also sees the attacker's goal as CI secrets, with package contamination a side effect of automated publishing
Relation to a separate October campaign
Firm A says accounts hit by an October campaign were more likely to be hit in this one, but assesses them as separate operations by different actors. Firm C also says the overlap does not show a single actor (stolen tokens are shared and sold)
Official GitHub statement
Not stated (blog, changelog and status history checked on November 14, 2026)

What is known and what is not

State as of November 14, 2026. We will update the status column when there is news.

ItemWhat was publishedStatus
About 4,800 accounts abusedValid stolen tokens used to send probe pull requestsConfirmed (Firms A and B)
Probe pull requests to 61,764 repositoriesA different number from whether changes followedConfirmed (Firm A; Firm B counts 61,734)
Repositories with malicious changes8,093 public repositoriesConfirmed (Firm B; public repositories and default branches only)
Malicious code ran and credentials were sent outAt least 1,835 repositoriesConfirmed (Firm A; also gives 1,806)
Theft of secrets and cloud credentialsIn repositories where it ranConfirmed (Firms A and B)
Cloud-side persistence (settings that survive rotation)Rewriting of an AWS role trust policy and addition of Azure federated credentials (Firm A); Firm B also notes AWS access keys left behindPossible (Firms A and B)
Exploitation of a GitHub Actions flawNot usedNot included (Firm C)
Contamination of published packagesThree packages (one Packagist, two Go), five versions in total (others not found)Confirmed (Firm B; PyPI and others not checked)
Breach of the cloud provider's infrastructureNo evidence (Firm C); the provider denies a breachNot confirmed (Firm C, the provider)
How tokens were first stolenExplained for part of the cloud provider's app tokens; unknown overallUnder investigation
Link to a separate October campaignFirm A sees separate operations; Firm C does not assert oneUnder investigation
Official GitHub statementNone foundNot stated
A confirmed list of affected organizationsNot publishedNot stated

How to read this: the figures count different things and have moved in two days

Firm A's 1,835 is an estimate of runs, Firm B's 8,093 is public repositories with malicious changes, and Firm C's 63,000 is probe pull requests. They are not the same thing. Many repositories that only received a probe pull request may not have had changes or theft. However, according to Firm A, an account that sent a probe pull request should be treated as compromised even if no change followed.

What can happen when valid stolen tokens are used

The following is general and does not mean these things happened here. What the investigating firms report happened is in "What happened" above.

If a token is valid, the attacker can write as a legitimate user. There is no weakness in a GitHub feature to exploit, and a software update does not stop it. If an account with write access can modify a CI workflow, the secrets and cloud permissions that workflow can read are targeted together. If OIDC trust to a cloud account is loose (any branch or workflow can enter), temporary credentials can be issued even without a stored secret. If your account is a collaborator in another organization, the damage extends beyond what you own.

What to review in CI and cloud permissions

This section is not an assessment of the affected parties. Based on the investigators' reports, it focuses on what to check in your own setup as this site's view.

1

Do not hold tokens broadly or for long

Here valid stolen tokens were used. Limit personal access tokens to specific repositories and permissions, give them short lifetimes, and delete them when no longer used (use the fine-grained type). Authorize third-party apps only for the scope they need (our view).

2

Narrow workflow permissions and the conditions for entering the cloud

Make the default workflow permission read-only and grant write only where needed. Narrow cloud OIDC trust to the repository, branch and environment so that not every workflow can enter. Putting approvers on environment secrets means a rewritten workflow cannot simply read production secrets (our view).

3

Fix branch protection with required reviews

Firm A writes that the code includes a mechanism meant to get past branch protection. Do not rely on check names alone: require approving reviews from code owners and allow no exceptions for bot accounts (our view).

4

Detect run-number gaps and cloud configuration changes

In this case runs and logs were deleted and gaps in numbering were the clue. Keep the organization audit log, and set alerts for workflow changes and for cloud access-key creation, trust-policy changes and added identity federation. Firm C also recommends limiting outbound traffic from CI to an allowlist.

5

Do not keep secrets in the repository

Apart from CI secrets, credentials in code history are taken along with a stolen token of anyone who can read them. For catching them before commit, see Stopping secrets before commit with gitleaks; for the order of revocation, see 540,000 credentials exposed on GitHub are still valid.

Sources (public records)

The facts in this article come from the public information below. GitHub has no official statement on this (checked November 14). Attack step details are not covered.

  • GitHub, "Changelog" and "Security" (official blog and changelog; no entry on this; checked November 14) — github.blog / github.blog
  • GitHub Status (official incident history; no entry on this; checked November 14) — githubstatus.com
  • One cloud provider's notice, "Security: GitHub tokens exposed by apps deployed from GitHub" (official community forum; learned November 12, addendum November 13; checked November 14) — community.fly.io
  • Firm A (security firm; first to report), "wfx-loot campaign pushes CI secret stealer to tens of thousands of repositories" (November 12, 2026; checked November 14) — aikido.dev
  • Firm B (security firm), "wfx: GitHub Actions Credential Stealer Hits 8,000 Repos" (November 12, 2026; checked November 14) — safedep.io
  • Firm C (security firm), "WFX Phantom: The GitHub Actions Secret Stealer That Deletes Its Tracks" (November 12, 2026; checked November 14) — stepsecurity.io
  • Press: BleepingComputer, "Hackers compromise 4,800 GitHub accounts to steal cloud credentials" (checked in November; coverage of Firm A's post) — bleepingcomputer.com

Update history

2026-11-14: First version. Based on the public posts of three security firms (all November 12) and one cloud provider's notice. GitHub has no official statement. Where press reports differ, each party's original post is treated as the primary source. We will update when more is published.

Latest breaking reports

All breaking reports →

FAQ

QWhat happened?
A

According to several security firms that investigated, starting around November 10, 2026, about 4,800 GitHub accounts were used with valid stolen tokens to send probe pull requests to repositories those accounts could write to. In some repositories malicious changes were made, and GitHub Actions secrets and cloud credentials were reportedly stolen.

QIs it a GitHub bug or a GitHub Actions vulnerability?
A

Firm C writes that the attacker does not exploit a GitHub Actions flaw and uses valid tokens belonging to developer and bot accounts. Firm B also says the pattern points to stolen tokens. How the tokens were stolen is not established for the campaign as a whole. GitHub has no official statement on this as of the November 14 check (not stated).

QAm I affected?
A

Check the repositories you can write to, including those of organizations where you are a collaborator, for pull requests, branches and Actions runs you do not recognize. Firms A, B and C advise treating any account that sent even one probe pull request as compromised. If you find nothing, still review the tokens and third-party app authorizations on your GitHub account.

QWhat do numbers like 1,835 and 8,093 count?
A

They count different things by source. Firm A's 1,835 is repositories where the malicious code appears to have run and sent credentials out (it gives 1,806 elsewhere and says the figure may be a floor). Firm B's 8,093 is public repositories that received malicious changes, not where it ran. Repositories that only received a probe pull request are in neither number. Do not add them together.

QIf the malicious code ran, is rotating secrets enough?
A

It may not be. Firms A and B report that things can be created on the cloud side that survive a secret rotation (extra access keys, rewritten role trust settings, added identity federation). If execution is suspected, revoke secrets and also review cloud permission settings and audit logs.

QI heard a cloud provider's GitHub app tokens were used. Was that provider breached?
A

Firm C traced 173 probe pull requests (19 accounts) to tokens issued to one cloud provider's GitHub app. It could not establish how the tokens were obtained and found no evidence of a breach of the provider's infrastructure. The provider itself says its infrastructure was not breached, that its GitHub-based deploy process left a token in the build directory, that some apps exposed that directory publicly, and that it has begun revoking every user token issued to the app. This site does not name the provider.