TLP:CLEAR

GitLab CDN Xmrig distribution campaign

Weekly-cadence delivery of unmodified Xmrig static builds via GitLab's release CDN, targeting internet-exposed Android Debug Bridge (ADB) services

Published 2026-06-24 Source Distributed SSH/Telnet Honeypot Fleet Confidence HIGH Classification Cryptomining / Legitimate-CDN Distribution Abuse
MEDIUM SEVERITY ACTIVE
12
samples captured
4
architectures
3
deployment waves
5/12
samples VT-flagged as miner

Executive summary

A blocklist can't touch gitlab.com, and this attacker knew it. Instead of standing up their own C2 infrastructure, they pointed victims at GitLab's own release CDN and let a public repository do the hosting, one unmodified Xmrig build at a time, on a schedule regular enough to set a clock by.

Over a 14-day window, sensors observed an attacker using GitLab's release CDN as a malware distribution channel for Xmrig cryptominer binaries. The attacker (34.67.58.31, a Google Cloud IP, AS396982) downloads multi-arch Xmrig static builds from gitlab.com/Kanedias/xmrig-static — a public GitLab repository that maintains pre-compiled Xmrig binaries. By using the /permalink/latest/ URL path, the attacker always receives the newest build without hardcoding version numbers or maintaining their own distribution infrastructure.

This pattern represents an emerging class of supply-chain-adjacent threats where attackers weaponize legitimate software distribution platforms. Traditional IP blocklists and domain blocklists cannot block gitlab.com without disrupting legitimate development workflows. The binaries appear to be genuine upstream Xmrig static builds — fetched directly over HTTPS from GitLab's own CDN, with no evidence of attacker tampering in the delivery path. That does not make them invisible to AV: once VirusTotal indexes a build, most of these releases are flagged by roughly 40-60% of engines under generic miner/PUA signatures (see Sample inventory). Indexing lags days behind each weekly build, though, and the weekly hash rotation means a fresh release still enjoys a detection-free window right after publication — so defenders need behavioral indicators (mining pool, wallet, process name) rather than a file-hash blocklist alone.

Threat actor profile

AttributeAssessment
Attacker IP34.67.58.31 — cloud-hosting provider (Google Cloud, AS396982)
Distribution channelGitLab Releases CDN (gitlab.com)
RepositoryKanedias/xmrig-static — public Xmrig static-builds repo
URL pattern/permalink/latest/downloads/xmrig-<arch>-static
IntentCryptomining — Xmrig deployment via an unauthenticated ADB (Android Debug Bridge) service, port 5555, not SSH
SophisticationMedium — uses legitimate infrastructure to evade blocklists
CadenceWeekly, ~09:40 UTC (3 waves: Jun 10, Jun 17, Jun 24)
First observed2026-06-10
Last observed2026-06-24 (active)

Post-publication update (queried 2026-07-03): the same source IP and ADB delivery script produced a fourth wave on 2026-07-01 ~09:45 UTC (aarch64, x86_64, and armv7 samples confirmed; no i686 sample was captured that round). This confirms the weekly cadence continued beyond the 3-wave window this report otherwise covers; the tables and IOCs below are scoped to waves 1-3 (2026-06-10 through 2026-06-24) as originally published.

Infrastructure analysis

  ┌──────────────────────────────────────────────────────────────────┐
  │  GitLab CDN as malware distribution channel                      │
  └──────────────────────────────────────────────────────────────────┘

  Attacker 34.67.58.31 (Google Cloud)
       │
       │  ADB (Android Debug Bridge, port 5555) shell session → execute
       │  download command
       ▼
  gitlab.com/Kanedias/xmrig-static/-/releases/permalink/latest/downloads/
       │
       ├── xmrig-x86_64-static   (9.8 MB)  → /tmp/xmrig
       ├── xmrig-i686-static     (10.9 MB) → /tmp/xmrig
       ├── xmrig-aarch64-static  (8.8 MB)  → /tmp/xmrig
       └── xmrig-armv7-static    (6.1 MB)  → /tmp/xmrig

  Why this matters:
  • gitlab.com cannot be blocklisted without impacting development workflows
  • /permalink/latest/ → always gets newest build, no version pinning
  • Binaries are authentic Xmrig — not modified — so hash-based detection rotates weekly
  • The loader picks ONE architecture per victim from the target's reported ABI
    (getprop ro.product.cpu.abilist* / uname -m) rather than dropping all four

Sample inventory

Wave 3 — 2026-06-24 (latest)

SHA256ArchitectureSizeURL
dceaabef812f5600...ELF 64-bit x86-649,832,024 Bxmrig-x86_64-static
8a4c02ac5b951196...ELF 32-bit i38610,944,948 Bxmrig-i686-static
4868c7dce2245d3a...ELF 64-bit AArch648,836,112 Bxmrig-aarch64-static
3d9ae2e3cadbba2b...ELF 32-bit ARMv76,086,388 Bxmrig-armv7-static

Wave 2 — 2026-06-17

SHA256ArchitectureSize
1a0b0bb859fe6686...ELF 64-bit x86-649,832,024 B
45ab548ec8a93f49...ELF 32-bit i38610,944,948 B
1eb849549df06ff4...ELF 64-bit AArch648,836,112 B
ca90747aec191150...ELF 32-bit ARMv76,086,388 B

Wave 1 — 2026-06-10

SHA256ArchitectureSize
c3cedc9a4d761e9a...ELF 64-bit x86-649,832,024 B
4e261d31521afdc0...ELF 32-bit i38610,940,852 B
69b36a4cd1a95119...ELF 64-bit AArch648,836,112 B
60847567bce85f20...ELF 32-bit ARMv76,086,388 B

Note: Binary sizes are identical across all three waves for x86_64, aarch64, and armv7. Only i686 differs: wave 1's build is 10,940,852 B, exactly 4 KB smaller than the 10,944,948 B i686 build shipped in waves 2 and 3, indicating a build-system change between the wave 1 and wave 2 releases. SHA256 hashes differ across all waves because the repository publishes a new build weekly, and the /permalink/latest/ URL resolves to whatever is newest at fetch time.

VirusTotal analysis

Wave 3 (2026-06-24) samples are not yet indexed by VirusTotal as of this writing (2026-07-03). Three of the four Wave 1 (2026-06-10) samples are also still unindexed — the exception is the aarch64 build (69b36a4c...), now flagged by 37 of 63 engines. Wave 2 (2026-06-17) samples were already flagged when first checked on 2026-06-23 and remain flagged on a live recheck: all four Wave 2 hashes are currently detected by roughly 25-37 of 52-64 VirusTotal engines — ca90747a... (armv7): 33/61, popular threat name miner.xmrig/abminer; 45ab548e... (i686): 33/59, miner.bitcoinmi/r002c0dfc26; 1a0b0bb8... (x86_64): 37/64, miner.xmrig/bitcoinmi; 1eb84954... (aarch64): 25/52, miner.r002c0dfb26/xmrig. Detections are generic miner/PUA signatures (Application.Linux.Miner, ELF:Miner-EQ, Multi.Cryptominer.Xmrig) rather than a named custom-malware family, which is consistent with these being genuine, unmodified Xmrig builds — but not consistent with an assumption that unmodified builds evade AV entirely. Xmrig is open-source miner software with both legitimate and malicious use cases, and most AV vendors flag it generically once a build is indexed, regardless of whether that specific binary was tampered with. The practical takeaway for defenders is unchanged: file-hash IOCs from this campaign have a short shelf life, both because the repository ships a new signed build every week and because VirusTotal indexing itself lags days behind each release.

Behavioral significance

The threat is not in the binary itself (Xmrig is well-documented) but in the distribution method. Using GitLab's release CDN provides several advantages to the attacker:

MITRE ATT&CK mapping

IDTechniqueEvidence
T1133External Remote ServicesInitial access via an unauthenticated, internet-exposed ADB (Android Debug Bridge) service on port 5555
T1496Resource HijackingXmrig cryptominer deployment for Monero (XMR) mining — observed pool fr-zephyr.miningocean.org:5432, worker vipminer
T1105Ingress Tool TransferDownloads from gitlab.com Releases CDN
T1071.001Web ProtocolsHTTPS downloads from GitLab (port 443)
T1584.006Compromise Infrastructure: Web ServicesAbuse of legitimate GitLab release pipeline as distribution channel
T1106Native APIXmrig uses native CPU instructions for mining (AES-NI, AVX2)

Campaign timeline

DateEvent
2026-06-10 ~09:36 UTCWave 1: 4 multi-arch samples downloaded from GitLab. First observation of this campaign.
2026-06-17 ~09:40 UTCWave 2: 4 samples with updated hashes (new weekly build published). Identical sizes.
2026-06-24 ~09:43 UTCWave 3: 4 samples with updated hashes again. Campaign continues weekly cadence.
2026-07-01 ~09:45 UTCPost-publication: Wave 4 observed (aarch64, x86_64, armv7; no i686 captured). Not included in this report's tables/IOCs — noted here for continuity.

The ~09:40 UTC timing across all observed waves suggests a scheduled task (cron) on the attacker's system. The consistent 7-day interval (Jun 10 → 17 → 24 → Jul 1) confirms weekly automation.

Indicators of compromise

Network — IPs

34.67.58.31 — attacker source IP (Google Cloud, AS396982)

Network — URLs

https://gitlab.com/Kanedias/xmrig-static/-/releases/permalink/latest/downloads/xmrig-x86_64-static
https://gitlab.com/Kanedias/xmrig-static/-/releases/permalink/latest/downloads/xmrig-i686-static
https://gitlab.com/Kanedias/xmrig-static/-/releases/permalink/latest/downloads/xmrig-aarch64-static
https://gitlab.com/Kanedias/xmrig-static/-/releases/permalink/latest/downloads/xmrig-armv7-static

Network — mining pool

fr-zephyr.miningocean.org:5432 — MoneroOcean pool endpoint (TLS, algo rx/0, --donate-level 1)

Monero wallet

ZEPHsCw1tg5hx8drn1DMTicFLLBMmRu7uR31wTr7jRxDAS8Kdow2WJfegvyc35i6NBgapzuAqCrue2JsUNGvmVG2EWswMn9BfAb — worker/password "vipminer"

File — SHA256 hashes (Wave 3 — 2026-06-24)

dceaabef812f5600a31ecc645626b51a44bd7f7a682d0ae2d7bac8a5d110f1bc — xmrig-x86_64-static (9,832,024 B)
8a4c02ac5b951196fb9c21b21707a4e62dc67d277de598f130808147c4f59f37 — xmrig-i686-static (10,944,948 B)
4868c7dce2245d3ad0410493c38beb9344685703c593d7dd4228f445c8676af2 — xmrig-aarch64-static (8,836,112 B)
3d9ae2e3cadbba2b695098a04b36eff540c1f9dcdc00f72408cde95b42614ec1 — xmrig-armv7-static (6,086,388 B)

File — SHA256 hashes (Wave 2 — 2026-06-17)

1a0b0bb859fe66683d6063dfa66c271c89b645040fc70028eaa48e8dcaa31270 — xmrig-x86_64-static (9,832,024 B)
45ab548ec8a93f4951539717dd2fa669547f3423945d69afd43dadefee4058c5 — xmrig-i686-static (10,944,948 B)
1eb849549df06ff466c03e5b7232bb990d113cf485b0bf40d0cb2d36f3368235 — xmrig-aarch64-static (8,836,112 B)
ca90747aec191150225292bdcbc2f8dc84a2d5b8b5b1b2e150dce1df057fe682 — xmrig-armv7-static (6,086,388 B)

File — SHA256 hashes (Wave 1 — 2026-06-10)

c3cedc9a4d761e9a96207ae93b92d5ca75ed304fecbedfdefa8a2d95b5b77997 — xmrig-x86_64-static (9,832,024 B)
4e261d31521afdc024c687c3c8282d5e51270f1c5b8501c54fd268ee6fa3383d — xmrig-i686-static (10,940,852 B)
69b36a4cd1a95119e80e1463a67248d8b75ab6eb28c1c83b54cb353cbb37bee7 — xmrig-aarch64-static (8,836,112 B)
60847567bce85f203a343930b52f2413e1e526d3b07f1c3b4d57e4556585c669 — xmrig-armv7-static (6,086,388 B)

Behavioral indicators

Weekly download from gitlab.com/Kanedias/xmrig-static at ~09:40 UTC
Loader auto-selects 1 of 4 target architectures (x86_64, i686, aarch64, armv7) per victim based on the reported ABI — not a simultaneous 4-arch drop
Downloads via HTTPS (port 443) — encrypted, bypasses plaintext content inspection
Initial access via an unauthenticated ADB (Android Debug Bridge) shell on port 5555, not SSH
Recon marker string echoed by the loader before download: [ADB_INFO];<abi>;<cpu_count>;<mem>;<root_yes_no>

Detection signatures

Suricata — GitLab Xmrig distribution

# NOTE: the downloads observed in this campaign are HTTPS (port 443). The
# URI-path variant below only fires where Suricata has visibility into
# decrypted HTTP (e.g. behind a TLS-interception/SSL-bump proxy). Without
# TLS interception, use the SNI-only variant -- it is lower fidelity
# (matches all gitlab.com TLS traffic, not just this download path).

# Variant 1 -- SNI-only, works on encrypted traffic as observed in this campaign
alert tls $HOME_NET any -> $EXTERNAL_NET 443 (
  msg:"cowrAI GitLab CDN traffic (possible Xmrig static-build download, SNI-only)";
  flow:to_server,established;
  tls.sni; content:"gitlab.com";
  classtype:trojan-activity; sid:9003030001; rev:2;
)

# Variant 2 -- URI-path match, requires decrypted HTTP visibility
alert http $HOME_NET any -> $EXTERNAL_NET 443 (
  msg:"cowrAI GitLab CDN Xmrig static-build download (decrypted HTTP)";
  flow:to_server,established;
  http.host; content:"gitlab.com";
  http.uri; content:"Kanedias/xmrig-static";
  content:"permalink/latest"; distance:0;
  content:"xmrig-"; distance:0;
  content:"-static"; distance:0;
  classtype:trojan-activity; sid:9003030002; rev:1;
)

YARA — Xmrig static build identifier

rule Xmrig_Static_Build_From_GitLab {
  meta:
    description = "Xmrig static build distributed via GitLab CDN"
    author = "cowrAI"
    date = "2026-06-24"
  strings:
    $xmrig1 = "xmrig" ascii nocase
    $xmrig2 = "Donate to support the project" ascii
    $xmrig3 = "RANDOMX" ascii
    $build1 = "Kanedias/xmrig-static" ascii
  condition:
    ($xmrig1 and $xmrig2 and $xmrig3) or $build1
}

eBPF / Falco — Xmrig process detection

- rule: Xmrig Process Running (GitLab CDN campaign)
  desc: Detect xmrig matching this campaign's observed launch pattern.
        Binary is left named "xmrig" (not renamed) and invoked with a
        MoneroOcean-style pool/worker.
  condition: proc.name = "xmrig" or \
             (proc.cmdline contains "xmrig" and proc.cmdline contains "--donate-level") or \
             proc.cmdline contains "fr-zephyr.miningocean.org" or \
             proc.cmdline contains "-p vipminer"
  output: "Xmrig miner detected (pid=%proc.pid name=%proc.name cmdline=%proc.cmdline)"
  priority: WARNING

Collection methodology

Data collected by a distributed honeypot fleet running SSH, Telnet, and protocol-specific lures. This campaign was captured specifically via the fleet's ADB (Android Debug Bridge, port 5555) lure, not SSH. Post-authentication commands were captured at the application layer, including the URLs used to download malware binaries. Downloaded files were automatically hashed and archived for analysis. The GitLab distribution pattern was identified by correlating download URLs across multiple sensors (3 distinct honeypots observed the recon/download sequence in Wave 1 alone) and confirming the weekly cadence.