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 ↓
- Check for pull requests, branches and Actions runs you do not recognize
- Revoke the compromised account's tokens, authorizations and sessions
- If malicious changes may have run, rotate every secret and cloud permission that repository could read
3 more
- Check the cloud side for changes that survive a rotation
- Inventory your tokens and third-party apps
- Check that your own apps do not expose the version-control folder
- Where to verify (source)All sources ↓
- GitHub, "Changelog" and "Security" (official blog and changelog; no entry on this; checked November 14)
- 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
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.
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
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
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).
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.
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.
What happened (from the investigating firms and the related provider)
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.
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.Nov 11, 15:00
End of the window for the 61,839 probe pull requests counted by Firm A.Nov 12, 04:36
End of the window for the 8,093 public repositories with malicious changes counted by Firm B.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.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).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
Figures by source (do not add them together)
| Source (role) | What was counted | Figure | Note |
|---|---|---|---|
| Firm A (first to report) | Accounts that sent / repositories that received probe pull requests | 4,837 accounts / 61,764 repositories | About 92% are still open (the denominator is the 10,431 PRs sent to repositories the account does not own) |
| Firm A | Repositories where the malicious code ran and credentials were sent out | At least 1,835 (1,806 elsewhere) | Two figures within the post; it says the number may be a floor |
| Firm A | Accounts that can publish packages | At least 50 | Publishing rights on npm, Go, PyPI, Packagist and crates, as understood |
| Firm B | Public repositories with malicious changes (Nov 10 12:46 to Nov 12 04:36) | 8,093 | Not the number where it ran. The breakdown sums to 8,096; the difference is not explained |
| Firm B | Probe pull requests | 61,879 PRs / 4,833 accounts / 61,734 repositories | Not included in the 8,093 |
| Firm C | Probe pull requests (as of Nov 12, 07:40) | More than 63,000 | About 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' accounts | More than 250 | Says 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 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.
| Item | What was published | Status |
|---|---|---|
| About 4,800 accounts abused | Valid stolen tokens used to send probe pull requests | Confirmed (Firms A and B) |
| Probe pull requests to 61,764 repositories | A different number from whether changes followed | Confirmed (Firm A; Firm B counts 61,734) |
| Repositories with malicious changes | 8,093 public repositories | Confirmed (Firm B; public repositories and default branches only) |
| Malicious code ran and credentials were sent out | At least 1,835 repositories | Confirmed (Firm A; also gives 1,806) |
| Theft of secrets and cloud credentials | In repositories where it ran | Confirmed (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 behind | Possible (Firms A and B) |
| Exploitation of a GitHub Actions flaw | Not used | Not included (Firm C) |
| Contamination of published packages | Three 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 infrastructure | No evidence (Firm C); the provider denies a breach | Not confirmed (Firm C, the provider) |
| How tokens were first stolen | Explained for part of the cloud provider's app tokens; unknown overall | Under investigation |
| Link to a separate October campaign | Firm A sees separate operations; Firm C does not assert one | Under investigation |
| Official GitHub statement | None found | Not stated |
| A confirmed list of affected organizations | Not published | Not 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.
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).
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).
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).
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.
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.
Read next
- Published credentials that stay valid because they are not revoked: 540,000 credentials exposed on GitHub are still valid
- Another case where GitHub-based development was targeted: The TanStack and Nx supply chain attack
- Order of revocation and package-borne damage: Defending against npm supply chain attacks
- Protecting your account: GitHub two-factor authentication / Environment variables and API keys basics
- Incidents that happen with legitimate credentials: 2026 breaches happen with legitimate credentials
- Other 2026 incidents: Data breaches and cyberattacks of 2026