D1337: Cryptomining in Other People's GitHub Actions
The mining workflow, planting commits, payout indicators and the distinction between discovery and current proof.
Cristian Chiriac
- Published:
- 2 November 2026
- Version:
- 1.0
- Last observed:
- 30 October 2026
- Dataset frozen:
- 1 November 2026
- Collection cut-off:
- 31 October 2026, 17:59 UTC
- Tracked items rechecked:
- 1 November 2026, 18:23 UTC
- Time zone
- All dates UTC.
Contents
A GitHub Actions workflow is configured to download XMRig and mine to one payout wallet.
The research in 30 seconds
- What I found
- A GitHub Actions workflow is configured to download XMRig and mine to one payout wallet.
- What this adds
- The research identifies the workflow cluster, its signing identity and the shared payout configuration in unrelated developer accounts.
- Verified scope
- 55 repositories under 28 accounts carry the configuration in the 30 October proof pass.
- What remains unknown
- Workflow runs, earnings and the way access to each account was obtained remain unverified.
The numbers, with their boundaries
Current count
55
Current proof-pass repositories
30 Oct 2026 · UTC
- Counts:
- 28 accounts; miner configuration present at the pinned default-branch commit.
Earlier snapshot or subset
58
Earlier discovery repositories
29 Oct 2026 · UTC
- Counts:
- 31 accounts; three repositories no longer matched at the next proof pass. Earlier findings below retain that date.
On 30 October 2026, 55 repositories under 28 accounts still carried the D1337 mining configuration at their pinned default-branch commit. The earlier discovery set, checked on 29 October, contained 58 repositories under 31 accounts.
The workflow named "CI Build" is configured to download XMRig every six hours and mine for 345 minutes, paying into one wallet and labeling each worker with the repository owner's name. These are configured actions; workflow runs were not checked.
- Thirty of the accounts are old, unrelated developer accounts. The thirty-first is a bot account created on 7 February 2026, whose identity, "D1337 Bot", signs many of the planting commits.
- All 58 repositories were still public on 29 October 2026. On 30 October, 55 of them still had the miner configuration at their current commit; in 3 it was no longer found.
- I found no public report of this cluster, its wallet or its bot identity.
Nothing was executed, and I did not contact the mining pool. The workflow files were read through GitHub code search. Owners are treated as victims and are not named.
Where this stands (1 November 2026)
#The proven set was closed on 1 November 2026 with what had been found up to 31 October 2026, 17:59 UTC; repositories found after that are tracked separately and are not in these figures. The full proof pass at pinned commits ran on 30–31 October. On 1 November 2026, 18:23 UTC a read-only GitHub API recheck covered the 162 repositories, 73 accounts and 12 issues that are tracked one by one (operator repositories, Shai-Hulud accounts, phishing issues), not the whole set.
- Frozen: 55 repositories under 28 accounts proven by the workflow file; three more carry the cluster's commits but not the file at the pinned commit.
- State: all 58 repositories public on 1 November, none with a commit since 29 October.
Key findings
#Scope and method
#Expand technical detail · complete record
| Data source | What was collected | Scope | Date (UTC) | Coverage limit |
|---|---|---|---|---|
| GitHub code search | Files containing the payout wallet | 92 hits → 45 repositories, 22 owners | 29 Oct 2026 | Default branches, indexed files only |
| GitHub code search | Files containing "D1337" | 94 hits → 8 relevant | 29 Oct 2026 | Mostly name collisions; not used as a size |
| GitHub commit search | Author and committer "D1337 Bot" | about 52 commits in 52 repositories | 29 Oct 2026 | Client-set dates |
| Repository metadata | Public, archived, disabled state and last push | 58 core repositories | 29 Oct 2026, 07:38 | Actions run history not read |
How it was found
#While triaging general malware found by code search, a workflow that downloads a miner stood out. I pivoted on its payout wallet with code search, and on the author name of its commits with commit search.
At a glance
#| Set | Repositories | Accounts | Definition |
|---|---|---|---|
| Wallet in a file | 45 | 22 | Code search for the payout address |
| "D1337 Bot" commits | 52 | — | 51 third-party repositories plus the bot's own |
| …in the core | 24 | — | Mining commit messages, or the wallet as well |
| …"Initial commit" only | 28 | 28 | No wallet found; not counted as mining |
| Core set | 58 | 31 | Wallet set ∪ mining-commit set; includes the bot's own repository |
| Still public on 29 Oct 2026 | 58 of 58 | — | One archived; none disabled |
| Miner proven at a pinned commit, 30 Oct 2026 | 55 | 28 | Workflow file read at the current commit; 3 no longer show it |
92 code-search hits for the wallet address, 29 October 2026, by file name.
Table view
| Item | Value | Note |
|---|---|---|
| ci.yml | 54 | |
| build.yml | 30 | |
| m.yml | 4 | |
| mine.yml | 2 | |
| README | 2 |
How the workflow mines
#- 01TriggerEvery push, and a schedule of 0 */6 * * * (four times a day)
- 02DownloadT1105XMRig 6.21.0 from the official XMRig release page
- 03MineT1496.001RandomX on rx.unmineable[.]com:3333 with TLS, for up to 350 minutes, just under the six-hour job limit
- 04PayoutUSDT:0x74B56f2…9fC9.d1337_<owner>, so each victim's share is visible to the operator
Because the binary is the genuine XMRig release, a file-hash check will not catch it. The configuration does.
How the accounts were used
#| Identity | Where it appears | Commit messages |
|---|---|---|
"D1337 Bot" bot@d1337[.]ai (client time zone +07:00) |
Third-party repositories | "Initial commit - Add mining workflow" (30), "Configure CI/CD pipeline", "Update worker configuration", "Add mining workflow", "Initial commit" |
| The bot's GitHub account (noreply, time zone −04:00) | Only its own repository | Unrelated product and website commits |
"CI Build" ci@build[.]dev |
One variant | — |
- Many repositories have generic names such as
ci-pipeline,build-pipeline-<number>,deploy-pipelineortest-runner, created inside the victims' accounts. - 34 of the 58 core repositories have no "D1337 Bot" commit. They are in the core because they contain the wallet, so their workflows were committed by other identities at dates I do not have.
- On 23 May 2026, between 02:59 and 03:16 UTC, fourteen core repositories were pushed, thirteen of them belonging to one owner. That looks like a second planting round under another identity.
A separate account with four repositories mines to a different wallet through the same pool. It also owns six of the core repositories, so its role is unresolved.
ATT&CK mapping
#Expand technical detail · complete record
| Technique | Name | Tactic | Evidence |
|---|---|---|---|
| T1078 | Valid Accounts | Initial Access | Commits by an unrelated identity in 30 owners' accounts (inferred use of their credentials) |
| T1105 | Ingress Tool Transfer | Command and Control | The workflow downloads XMRig 6.21.0 at run time |
| T1496.001 | Compute Hijacking | Impact | GitHub-hosted runners mine RandomX for up to 350 minutes per run |
Evidence register
#Expand technical detail · complete record
Workflow files containing the pool, the payout address and the per-owner worker name, read through code search.
Source: GitHub code search · Collected 29 October 2026
About 52 commits in 52 repositories, author and committer "D1337 Bot", dated 15–20 April 2026 on third-party repositories.
Source: GitHub commit search · Collected 29 October 2026
Public, archived and disabled state and last-push times of the 58 core repositories; owner creation dates and repository counts.
Source: GitHub GraphQL and REST metadata · Collected 29 October 2026
Confidence and alternative explanations
#| Inference | Confidence | Alternative explanation | Why it is less likely |
|---|---|---|---|
| Owners' tokens or accounts were misused | Moderate | One operator owns all 30 accounts | Accounts from 2013–2025 with unrelated, normal histories |
| The miner actually ran | Unknown | Workflows never triggered, or were disabled | Run history was not read |
| "D1337" links to other projects of that name | No link | — | Only name collisions were found |
Timeline
#The bot account is created
Earliest platform activity in the cluster
First "D1337 Bot" planting commits (commit dates)
Continue until 20 April 2026
Fourteen core repositories pushed in 17 minutes
02:59–03:16 UTC, thirteen of one owner
58 of 58 public
Three core repositories were pushed again between 14 and 19 October 2026.
Data notes and reconciliation
#Expand technical detail · complete record
| Item | Values seen | Explanation |
|---|---|---|
| "58 repositories" vs "52 repositories" | Different sets | 58 is the core (wallet or mining commits); 52 is every repository with a "D1337 Bot" commit |
| 31 owners | 30 + 1 | Includes the bot's own account |
| Commit date range | 15 Apr – 18 May 2026 | 18 May comes from the bot's own product commits; planting commits end on 20 April |
| 345 vs 350 minutes | Both | Mining time argument versus job timeout |
Defensive checks
#- Look for repositories you did not create, especially names like
ci-pipelineorbuild-pipeline-123. - Grep every workflow for
xmrig,unmineable,randomxandstratum. - Revoke personal access tokens and OAuth or app tokens, and review your account's security log.
- Require signed commits or push rules, so unexpected identities stand out or are blocked.
- GitHub disables scheduled workflows in public repositories after 60 days without activity, so many of these schedules are probably off already. A single push re-arms the miner.
Indicators
#Expand technical detail · complete record
| Type | Value | Context | Copy | |
|---|---|---|---|---|
| domain | rx.unmineable[.]com | Mining pool, port 3333 (a public pool, not attacker-owned) Confidence: Confirmed malicious | ||
| other | USDT:0x74B56f2C379996fedabF53D36aeE73c5E5129fC9 | Payout address; worker d1337_<owner> Confidence: Confirmed malicious | ||
| bot@d1337[.]ai | Commit identity "D1337 Bot" Confidence: Confirmed malicious | |||
| ci@build[.]dev | Commit identity "CI Build" Confidence: High-confidence suspicious |
Commit messages: Initial commit - Add mining workflow, Configure CI/CD pipeline,
Update worker configuration. Workflow traits: name CI Build, cron 0 */6 * * *,
timeout-minutes: 350, download of xmrig-6.21.0.
| Type | Value | Context | Copy | |
|---|---|---|---|---|
| other | r31d1337-bot | GitHub user created 2026-02-07, live on 2 November 2026. Bot account; owns Make-it-into-money, one of the 58 repositories reported for the mining workflow, and the planting commits are signed "D1337 Bot" bot@d1337[.]ai Confidence: High-confidence suspicious |
What was already public
#Expand technical detail · complete record
Sources were read on or before 29 October 2026. Each one also links to its Internet Archive record, which lists the captures that exist, in case the original moves or changes.
Mining on GitHub Actions is an old problem; this instance is not.
- GitHub, Terms for Additional Products and Features (Actions must not be used for cryptomining): https://docs.github.com/en/site-policy/github-terms/github-terms-for-additional-products-and-features (Internet Archive lookup)
- GitHub, Acceptable Use Policies: https://docs.github.com/en/site-policy/acceptable-use-policies/github-acceptable-use-policies (Internet Archive lookup)
- GitHub blog, 2021, abuse through fork pull requests: https://github.blog/open-source/maintainers/github-actions-update-helping-maintainers-combat-bad-actors/ (Internet Archive lookup)
- Trend Micro, 2022, miners on Actions runners: https://www.trendmicro.com/en_us/research/22/g/unpacking-cloud-based-cryptocurrency-miners-that-abuse-github-ac.html (Internet Archive lookup)
- Sysdig, PURPLEURCHIN: https://www.sysdig.com/blog/massive-cryptomining-operation-github-actions (Internet Archive lookup)
Not found in the public sources I checked, as of 29 October 2026: this cluster, its wallet, its bot identity and its worker naming. Earlier public cases used pull requests from forks, or accounts the attackers owned. Here the miner runs inside many unrelated developers' accounts.
Limitations
#- Whether the workflows ran, and what was earned, was not checked.
- Planting identity and dates are unknown for 34 of the 58 repositories.
- Code search sees default branches only, so the counts are a floor.
- How the accounts were accessed is not established.
Investigation context
#This article is part of the GitHub threat investigation. Counts are a snapshot, not evidence that the code ran on a victim's machine. The shared methodology and proof rules explain inclusion, exclusions and the independent re-check.
Claims, evidence and limits
| Claim | Assessment | Evidence | Limit |
|---|---|---|---|
| A mining workflow in 58 repositories under 31 accounts | Confidence: Confirmed malicious | E-D1-CODE | Not stated in the finding |
| One bot identity plants the workflow in other people's accounts | Confidence: Confirmed malicious | E-D1-COMMITS | Not stated in the finding |
| The owners are likely compromised, not complicit | Confidence: Under investigation | E-D1-COMMITS, E-D1-STATE | Not stated in the finding |
Terms used on this page
- pinned commit
- A specific commit, identified by its hash, at which a repository was read. Every counted repository was proven at the default-branch commit recorded in the proof pass, so a later change to the repository does not change what was proven.
- default branch
- The branch a repository shows by default. Counts are taken on default branches only; infected non-default branches were recorded separately and are not counted.
- proof pass
- The 30–31 October 2026 re-read of every candidate at a pinned commit under fixed inclusion rules, followed by an independent re-read of a random sample of 555 repositories through a different API.
All terms: glossary.
Corrections & discussion
Found an error, or have evidence that supports or contradicts a finding? Send a correction. Name the section and what you observed.