A Popular Solana Bot on GitHub Was a Wallet Thief: Supply Chain Attack Analysis
Background
On July 2, 2025, a victim contacted the SlowMist Security Team for help analyzing why their wallet assets had been stolen. The trigger: the day before, they had used an open-source project hosted on GitHub — zldp2002/solana-pumpfun-bot — and shortly after, their crypto was gone.
We got to work immediately.
Sample Identification
Visiting the GitHub repo, its Star and Fork counts looked respectable enough. But every directory showed commits concentrated within a three-week window — a clear red flag. A legitimate project would show a more natural update cadence.

The project is Node.js-based. Our first step was to examine its dependencies. One immediately stood out: crypto-layout-utils.

Digging deeper, we found this package had already been removed from the npm registry. The version specified in package.json didn’t appear in npm’s version history at all. We flagged it as suspicious — and by then it was no longer downloadable from the official npm source.
This raised the obvious question: how did the victim even get this malicious dependency?

Dependency Hijacking
Digging further into the project, we found the smoking gun in package-lock.json: the attacker had replaced crypto-layout-utils’s download URL with a GitHub Releases link.

The substituted URL:
https://github.com/sjaduwhv/testing-dev-log/releases/download/1.3.1/crypto-layout-utils-1.3.1.tgz
We downloaded the tarball. The code inside was heavily obfuscated using jsjiami.com.v7, making analysis significantly harder.

Exfiltration Payload
After deobfuscating, we confirmed this was a malicious npm package. The attacker had implemented logic inside crypto-layout-utils-1.3.1 to scan the victim’s filesystem — hunting for wallets, private keys, or mnemonic phrases — and upload anything matching to their server githubshadow.xyz.

The package’s file-scanning logic:

The upload logic for files containing private keys:

Attacker Profile
We continued mapping out the operation. The repo owner zldp2002 appeared to control a network of GitHub accounts, used to fork the malicious project, inflate Star and Fork counts, and widen distribution.

We also identified multiple forks with similar malicious behavior, some using a different package: bs58-encrypt-utils-1.0.3.

The earliest malicious package, bs58-encrypt-utils, was created on June 12, 2025 — suggesting the campaign had been running since then. After npm took it down, the attacker pivoted to the package-lock.json resolved-field hijack with crypto-layout-utils — an evolution from publishing directly on the registry to smuggling the payload through lockfile tampering.
Additionally, using our on-chain AML and tracking tool MistTrack, we traced one attacker address laundering stolen funds through the instant exchange FixedFloat.

Attack & Defense
From the attacker’s perspective, this was a well-orchestrated operation:
- Trust hijacking: Exploiting GitHub’s social trust by batch-forking and padding metrics to create an illusion of legitimacy
- Supply chain poisoning: Avoiding npm’s scanning by never publishing to the registry — instead hijacking the
resolvedfield inpackage-lock.json, a tiny change easy to miss during code review - Code obfuscation: Using the commercial obfuscator jsjiami.com.v7 to slow down static analysis (it didn’t stop us, but it raises the cost for defenders)
- Asset laundering: Routing funds through FixedFloat and similar non-KYC instant exchanges
From the defensive side, there are clear detection signals:
- A
resolvedfield inpackage-lock.jsonpointing to anything other than the npm registry is a strong indicator - Project maintainers controlling a cluster of suspicious GitHub accounts — identifiable through commit timing, naming patterns, and avatar consistency
- Dependency packages with creation dates and download counts that don’t match — malicious packages often have near-zero downloads despite appearing across multiple projects
My Assessment
This is a textbook consistency gap attack. The attacker exploited two gaps simultaneously: the gap between developers’ trust in GitHub social metrics (Stars/Forks) and a project’s actual security posture, and the gap between developers’ assumption that package-lock.json is auto-generated-and-therefore-trustworthy and the reality that the resolved field can be arbitrarily overwritten.
Two specific gaps:
- The “more Stars = safer” perception gap. Stars and Forks can be scripted in bulk. But when developers see high Star counts, they instinctively lower their guard.
- The “lockfile = auto-generated = trusted” assumption gap.
package-lock.jsonis produced bynpm install— it looks like machine output. Most people never check theresolvedfield.
A few practical takeaways:
For developers:
- Before running any open-source project that touches wallets or private keys, at least glance at
package-lock.jsonforresolvedfields pointing outside the npm registry - Debug unfamiliar projects in an isolated sandbox with no sensitive data
- Stars are not a security metric
For users:
- If you suspect your keys have been leaked, don’t hesitate — create a new wallet and move remaining assets immediately
- Wallet private keys and mnemonic phrases should never live in any directory accessible to Node.js scripts
Malicious Dependency Information
Malicious GitHub repositories (29):
2723799947qq2022/solana-pumpfun-bot2kwkkk/solana-pumpfun-bot790659193qqch/solana-pumpfun-bot7arlystar/solana-pumpfun-bot918715c83/solana-pumpfun-botAmirhBeigi7zch6f/solana-pumpfun-botasmaamohamed0264/solana-pumpfun-botbog-us/solana-pumpfun-botedparker89/solana-pumpfun-botii4272/solana-pumpfun-botijtye/solana-pumpfun-botiwanjunaids/solana-pumpfun-botjanmalece/solana-pumpfun-botkay2x4/solana-pumpfun-botlan666as2dfur/solana-pumpfun-botloveccat/solana-pumpfun-botlukgria/solana-pumpfun-botmdemetrial26rvk9w/solana-pumpfun-botoumengwas/solana-pumpfun-botpangxingwaxg/solana-pumpfun-botRain-Rave5/solana-pumpfun-botwc64561673347375/solana-pumpfun-botwj6942/solana-pumpfun-botxnaotutu77765/solana-pumpfun-botyvagSirKt/solana-pumpfun-botVictorVelea/solana-copy-botMorning-Star213/Solana-pumpfun-botwarp-zara/solana-trading-botharshith-eth/quant-bot
Malicious npm packages:
crypto-layout-utilsbs58-encrypt-utils
Malicious package download URL:
https://github.com/sjaduwhv/testing-dev-log/releases/download/1.3.1/crypto-layout-utils-1.3.1.tgz
C2 exfiltration server:
githubshadow[.]xyz