Your RSA-2048 keys break in 2030. Find every one of them before attackers do.
Home/Blog/Malicious npm and PyPI Packages Impersonate Aerodrome Finance and Ethereum Vault Connector to Steal Developer Credentials
Threat ResearchAugust 11, 20269 min read

Malicious npm and PyPI Packages Impersonate Aerodrome Finance and Ethereum Vault Connector to Steal Developer Credentials

8 npm and PyPI packages impersonate Aerodrome Finance and Euler's Ethereum Vault Connector, then steal .npmrc and SSH keys via webhook.site.

O
O3 Security Team
Malicious npm and PyPI Packages Impersonate Aerodrome Finance and Ethereum Vault Connector to Steal Developer Credentials
Key takeaways
  • Eight packages across npm (6) and PyPI (2) namesquat real, established DeFi protocols: Aerodrome Finance (the principal DEX on Base, capturing over 60% of the network's DEX volume), Euler Finance's Ethereum Vault Connector, Camelot AMM v2, and a generic 'boring-vault' name. All were published at version 1.0.0 with an identical install-time credential harvester.
  • Every package shares the exact same C2 endpoint: webhook.site/326b0891-2093-4800-a4c1-686ce3e07b09, plus TCP callbacks to 178.63.67.106:443 and 178.63.67.153:443. An identical C2 across eight unrelated-sounding package names is strong evidence of a single actor running one campaign, not eight coincidences.
  • The payload doesn't stop at .npmrc. It reads .npmrc, .gitconfig, environment variables, and enumerates SSH, Foundry, Hardhat, and gcloud directories, a target list built specifically for Web3 developers, not generic credential theft.
  • A separate, unrelated package, @telekom-ods/react-ui-kit 2.6.9, namesquats Deutsche Telekom's real @telekom npm scope and reads /etc/passwd and /etc/shadow, exfiltrating via an out-of-band application security testing (OAST) callback instead of webhook.site. Different C2, different payload, different cluster.
  • O3 Security filed both clusters to the OSSF malicious-packages database on August 11, 2026 (github.com/ossf/malicious-packages/pull/1437). No other vendor report on these exact package names was found as of publication.

Say you're building a lending app on Base and you need a vault primitive. You search npm for 'ethereum vault connector,' the exact name of a real, audited piece of DeFi infrastructure from Euler Finance. A package called ethereum-vault-connector shows up. It's MIT licensed. Its description reads like real docs. The name is exactly what you typed. You install it. In the background, before your code ever runs, it reads your .npmrc, your .gitconfig, your SSH keys, and your Foundry and Hardhat config folders. Then it sends all of it to a webhook.site URL.

That's the attack ChainRadar caught on August 11, 2026. Eight packages across npm and PyPI, each named after a real DeFi protocol or a plausible-sounding crypto infra term, all running an identical credential-stealing install hook. This isn't spray-and-pray malware naming. It's targeted brand impersonation, aimed at developers who are already integrating with the protocols being spoofed. That's exactly the audience least likely to question the package name.

Key takeaway

This report covers two separate, unrelated clusters. Cluster 1 (8 packages, npm + PyPI) namesquats DeFi protocols and steals developer credentials via a shared webhook.site endpoint. Cluster 2 (1 npm package, @telekom-ods/react-ui-kit) reads /etc/shadow and exfiltrates via a different mechanism entirely. We are not claiming they're the same actor. Treat them as two incidents.

Why these specific names were chosen

Aerodrome Finance is not obscure. It's the top DEX on Base, built by the Velodrome team. It handles over 60% of all DEX trading volume on that network. It's also a proven attack target already. In November 2025, attackers hijacked Aerodrome and Velodrome's DNS. An insider at their domain registrar helped them do it. Users got redirected to a fake copy of the real site. Aerodrome and Velodrome's own report puts the damage at about $700,000, the amount users signed away on the phishing pages before the attack was stopped. That incident had nothing to do with npm. But it shows attackers already see Aerodrome as worth faking. Developers who build on it are a known, valuable target.

Ethereum Vault Connector (EVC) is the other anchor name. It's a real, open-source tool built by Euler Finance. It lets ERC-4626 and other vaults on Ethereum use each other as collateral. Lending protocols, stablecoins, and margin trading apps are all built on top of it. Its own site says it has been through two security reviews, four audits, and formal verification, with named partners including yAudit, Certora, and Trail of Bits. A developer building vault infrastructure who searches 'ethereum vault connector' would expect to find the real thing. They'd find the malicious package instead.

Malicious packageWhat it impersonatesWhy the name is credible
ethereum-vault-connectorEuler Finance's Ethereum Vault Connector (evc.wtf)Exact name match for an audited, widely-referenced DeFi primitive
@aerodrome-finance/contractsAerodrome Finance, the principal DEX on BaseScoped exactly like a real protocol would publish its own contracts package
@aerodrome-finance/slipstreamAerodrome's Slipstream concentrated-liquidity AMMMatches Aerodrome's actual product naming
camelot-ammv2-coreCamelot, an established Arbitrum AMMGeneric-sounding core/periphery split matches real AMM package conventions
camelot-ammv2-peripheryCamelot AMM v2 periphery (router/library)Same pattern as above
boring-vaultGeneric vault-primitive naming used across multiple real DeFi projectsPlausible enough to pass a casual name check
dlmm (PyPI)Dynamic liquidity market maker tooling, a real DeFi mechanismCommon shorthand developers search for directly
dlmm-sdk (PyPI)SDK naming convention matching real DLMM tooling packagesLooks like an official SDK counterpart to the above
The DeFi namesquat cluster: what's being impersonated
Static SCA sees a freshly published package whose name matches a protocol the developer is already integrating with. Name-based reputation heuristics have nothing to flag: the name isn't a typo, it's a direct match to something real.
O3 Security Research

One template, eight packages, one C2

All six npm packages were published at version 1.0.0. All are MIT licensed. Each has a description written to sound like real docs, things like 'Aerodrome Slipstream AMM contracts and ABIs' or 'Boring Vault contracts.' Every one carries the same preinstall and postinstall script: node index.js || true. That isn't six independent authors landing on the same idea. That's one build template, stamped onto eight package.json files, published in a single burst.

package.json scripts block (identical across all 6 npm packages)
"scripts": {
  "preinstall": "node index.js || true",
  "postinstall": "node index.js || true"
}

The strongest clue isn't the naming pattern. It's the command-and-control endpoint. O3 Security's disclosure to the OSSF malicious-packages database confirms all eight packages send stolen data to the exact same webhook.site URL, plus the same pair of callback IPs. Identical infrastructure across eight unrelated-sounding names, on two different package registries, doesn't happen by accident.

TypeIndicatorNotes
C2 (HTTPS)webhook.site/326b0891-2093-4800-a4c1-686ce3e07b09Identical across all 8 packages; webhook.site is a legitimate service, so this domain is allowlisted almost everywhere
TCP callback178.63.67.106:443Shared across the cluster
TCP callback178.63.67.153:443Shared across the cluster
File read~/.npmrcCan contain registry auth tokens for private/scoped packages
File read~/.gitconfigCan expose linked credential helpers and identity data
Directory enumeration~/.ssh, Foundry config, Hardhat config, gcloud configA target list built specifically for blockchain and cloud-infra developers
Env accessFull process environmentStandard first step for harvesting API keys and tokens left in shell env
Confirmed indicators of compromise, DeFi namesquat cluster
Watch out

.npmrc can hold registry auth tokens with publish rights to your org's private packages. If a token like that leaves your machine, the blast radius isn't just this one project, it's every package that token can push to.

PackageEcosystemMalicious versionExfil targetC2
ethereum-vault-connectornpm1.0.0.npmrc, .gitconfig, env, SSH/Foundry/Hardhat/gcloud dirswebhook.site/326b0891-...e07b09
@aerodrome-finance/contractsnpm1.0.0Same as aboveSame C2
@aerodrome-finance/slipstreamnpm1.0.0Same as aboveSame C2
boring-vaultnpm1.0.0Same as aboveSame C2
camelot-ammv2-corenpm1.0.0Same as aboveSame C2
camelot-ammv2-peripherynpm1.0.0Same as aboveSame C2
dlmmPyPI1.0.0Same pattern, same C2Same C2
dlmm-sdkPyPI1.0.0Same pattern, same C2Same C2
Vulnerable package table, DeFi namesquat cluster

Why webhook.site as C2 is the smart part

webhook.site is a real service. Developers use it every day to inspect HTTP requests while debugging. That's exactly why it works as C2. A domain-reputation or allowlist tool has no reason to block it. It isn't a bulletproof host or a fresh lookalike domain. It's a well-known SaaS tool with a long, clean history. The malicious traffic doesn't look like malware traffic. It looks like a developer testing a webhook.

  • Domain-reputation filters see a trusted, long-established domain and let the request through.
  • SIEM rules that allowlist common developer SaaS tools (webhook testers, logging endpoints, CI callback URLs) miss it by design.
  • The unique path (the UUID after webhook.site/) is what actually routes stolen data to the attacker, and that part is invisible to anything that only inspects the domain.

A separate cluster: @telekom-ods/react-ui-kit

The same sweep also caught @telekom-ods/react-ui-kit at version 2.6.9. The name is a near-match for Deutsche Telekom's real npm scope, @telekom, home of the company's Scale design system. But the behavior is different in every way that matters. This package doesn't read .npmrc or post to webhook.site. It reads /etc/passwd and /etc/shadow instead: the local user list and, on a misconfigured or root-running system, the hashed password file. It then sends the results out through an OAST (out-of-band application security testing) callback domain.

PackageEcosystemMalicious versionFiles readC2
@telekom-ods/react-ui-kitnpm2.6.9/etc/passwd, /etc/hosts, /etc/shadowd9t83osijf9n1gb62e4gxfioysijywqww.oast.me
Vulnerable package, telekom-ods cluster
Note

We are treating this as a distinct incident, not a third data point for the DeFi cluster's narrative. Different C2 infrastructure, different exfil mechanism (OAST callback vs. direct webhook POST), different target files, and no naming overlap with the DeFi packages. The only thing the two clusters share is being caught the same day.

Here's how an OAST domain works: it encodes a unique subdomain per victim. Any DNS lookup or HTTP hit against that subdomain confirms the code ran, even with no direct network access allowed. DNS resolution alone can leak the confirmation. Reading /etc/shadow needs elevated privileges to actually pull hashes on a properly locked-down system. That suggests one of two things. Either this payload is opportunistic, aimed at misconfigured CI runners and containers that run as root, or it just tries the read regardless, to see what comes back.

Attribution: unattributed

We checked this against known campaign families: Shai-Hulud, Miasma, TeamPCP, and others. No match. The install-hook mechanism here is a plain preinstall/postinstall npm script, not a .pth injection or a worm-style spreading step. The shared webhook.site C2 and the DeFi-brand namesquat pattern don't line up with any campaign we could verify against a primary source. So we're not naming this cluster. If you've seen IOC or infrastructure overlap with a tracked campaign, we'd want to know.

Detection and response

If any of the listed packages appear in a lockfile, package.json, or requirements.txt, treat the machine as compromised. The preinstall/postinstall hook runs automatically on npm install, before you'd ever import or run the package's code.

Check for the affected packages
# npm projects: search lockfiles and node_modules for the malicious names
grep -RE '"(ethereum-vault-connector|@aerodrome-finance/contracts|@aerodrome-finance/slipstream|boring-vault|camelot-ammv2-core|camelot-ammv2-periphery|@telekom-ods/react-ui-kit)"' package.json package-lock.json yarn.lock pnpm-lock.yaml 2>/dev/null

# PyPI projects: check installed packages and requirements files
pip freeze | grep -E '^(dlmm|dlmm-sdk)=='
grep -E '^(dlmm|dlmm-sdk)' requirements*.txt 2>/dev/null

# Confirm exact malicious version if a match is found
npm ls ethereum-vault-connector boring-vault camelot-ammv2-core camelot-ammv2-periphery 2>/dev/null
npm ls @aerodrome-finance/contracts @aerodrome-finance/slipstream @telekom-ods/react-ui-kit 2>/dev/null
  1. Run the grep/pip commands above across every repo and CI cache on machines used for DeFi/Web3 or Telekom-adjacent frontend development.
  2. If a match is found, rotate everything readable from .npmrc: npm/registry auth tokens, and any org-scoped publish tokens tied to that machine's identity.
  3. Rotate git-linked credentials referenced in .gitconfig, including any stored credential helper tokens.
  4. Rotate SSH keys that were present in ~/.ssh at the time of install, and revoke the corresponding public keys from GitHub, GitLab, and any servers that trusted them.
  5. Rotate Foundry, Hardhat, and gcloud credentials/config if those directories exist on the affected machine, since the payload specifically enumerates them.
  6. For @telekom-ods/react-ui-kit, audit whether the process had root or elevated privileges (CI runner, container running as root) and, if so, treat any credentials or hashes in /etc/shadow as potentially exposed and rotate local account passwords.
  7. Remove the malicious package version, pin dependencies going forward, and add the package names above to an internal denylist or private registry block.
  8. Add an egress monitoring rule for outbound traffic to webhook.site immediately following an npm/pip install step in CI, since legitimate build steps rarely need it.

Why this evades most scanning stacks

None of the individual techniques here are exotic. What makes this cluster effective is that each layer of a typical AppSec stack has a specific, predictable reason to let it through.

LayerWhat it checksWhy this attack passes
Typosquat / name-similarity detectionEdit-distance or fuzzy match against popular package namesThese aren't typos of existing packages, they're exact-match impersonations of protocol names that have no prior npm package to squat against
Static SCA / dependency scanningKnown-vulnerability and known-malware databasesFreshly published packages with no CVE and no prior malware history; the payload is a plain, undisguised preinstall script, not an obfuscated binary, so there's nothing novel for a signature to catch, only unfamiliarity
Network allowlisting / domain reputationBlocklists of known-bad or newly registered domainswebhook.site is a legitimate, long-standing developer tool. It has no reason to be on a blocklist
Developer sniff-testDoes the package name and description look legitimate?The names match real, audited DeFi infrastructure the developer is actually trying to integrate with. This is the layer the attacker specifically engineered around
Evasion by detection layer
By the numbers

The one control this attack has no answer for is runtime behavioral analysis: a sandbox that actually installs the package and watches what the preinstall/postinstall hook does. Every layer above it can be satisfied by a plausible name and a clean-looking manifest. None of them execute the code.

This maps to MITRE ATT&CK T1195.002 (Compromise Software Supply Chain) for the distribution vector and T1552.001 (Unsecured Credentials: Credentials In Files) for the .npmrc/.gitconfig theft. If you're building detection rules off this report, alert on preinstall/postinstall scripts making outbound HTTP requests during CI dependency installs, not just on known-bad package names, since name-based rules will always trail the next namesquat by however long it takes someone to notice.

Frequently asked questions

What packages are affected by this npm and PyPI supply chain attack?

+
Eight packages carry the DeFi namesquat credential harvester: ethereum-vault-connector, @aerodrome-finance/contracts, @aerodrome-finance/slipstream, boring-vault, camelot-ammv2-core, and camelot-ammv2-periphery on npm, plus dlmm and dlmm-sdk on PyPI, all at version 1.0.0. A separate package, @telekom-ods/react-ui-kit 2.6.9 on npm, is a different, unrelated cluster.

How does the malicious package steal my credentials?

+
The npm packages run a preinstall and postinstall script (node index.js) that executes automatically during npm install, before you import or run any code. It reads ~/.npmrc, ~/.gitconfig, environment variables, and enumerates SSH, Foundry, Hardhat, and gcloud config directories, then sends the data to a webhook.site URL over HTTPS.

Why did the attacker choose Aerodrome Finance and Ethereum Vault Connector as names?

+
Both are real, established DeFi projects. Aerodrome Finance is the principal DEX on Base, capturing over 60% of the network's DEX trading volume, and was already targeted in a November 2025 DNS-hijacking phishing attack. Ethereum Vault Connector is an audited Euler Finance primitive used across lending protocols. Using exact-match names for real, actively-integrated infrastructure makes the packages far more likely to pass a developer's sniff-test than a generic or misspelled name would.

Is @telekom-ods/react-ui-kit part of the same campaign as the DeFi packages?

+
No, based on current evidence it is not. It uses a different exfiltration mechanism (an OAST callback domain instead of webhook.site), targets different files (/etc/passwd and /etc/shadow instead of .npmrc and .gitconfig), and has no infrastructure overlap with the DeFi cluster. Treat it as a separate incident detected the same day.

Is this attack attributed to a known threat actor or campaign?

+
No. We checked the TTPs against known campaign families and found no match to a verified, named campaign. This cluster is currently unattributed. We chose not to assign it a name since the attribution isn't confirmed.

What should I do if I installed one of these packages?

+
Treat the machine as compromised. Rotate any npm/registry tokens that were in .npmrc, any credentials referenced in .gitconfig, SSH keys present in ~/.ssh at install time, and Foundry/Hardhat/gcloud credentials if those directories exist locally. Remove the package and check CI logs for the same package names across other pipelines.

See your full attack chain.
Code, build, runtime. One platform.