
Evolution of Web3 in Cloud Supply Chain Attacks
Unit 42 analysis of how supply chain malware uses Web3 for command and control, in three phases: EtherHiding (smart contract state), TxDataHiding (transaction calldata across TRON, Aptos and BSC) and NullReceiver (C2 IPv4 decoded from a zero-value transaction's recipient address). It covers the ChainDrop npm worm, the PolinRider campaign and DPRK-linked Axios, Mastra and arrayref compromises. It ends with detection and CI/CD policy guidance.
What it is
Unit 42 describes how supply chain malware resolves command-and-control (C2) through public blockchains, so no domain or IP is hard-coded in the package. The page names three techniques: EtherHiding, TxDataHiding and NullReceiver. It ties them to the ChainDrop npm worm, the PolinRider campaign, and DPRK-linked compromises of Axios, Mastra AI and Rust's arrayref. The stated target is cloud credentials on developer machines and CI/CD runners.
How it works
- EtherHiding: the loader makes read-only
eth_callJSON-RPC requests to a hard-coded smart contract and reads C2 domains from its state variables. The contract address appears in the request as"to": "0x...", so one address can be flagged and blocked. - TxDataHiding: encrypted C2 payloads sit in the raw input data (calldata) of ordinary transactions, often sent to router contracts or burn addresses. The loader reads them with
eth_getTransactionByHashor calldata parsing and decrypts in memory. PolinRider variants fall back across TRON, Aptos and BSC, so a blocked chain is replaced by a new transaction on another. - NullReceiver: the loader queries an actor-controlled wallet for its latest zero-value transaction and takes the C2 IPv4 from the 20-byte recipient address. It reads the address, checks an ASCII validation marker, converts the leading 4 bytes to decimal, and connects out. There is no contract, no calldata and no domain string to inspect.
PolinRider combines these in a hybrid design. Zero-data transfers serve as a backup if the primary RPC gateways or multi-chain lookups are blocked.
flowchart TD
A[Loader starts] --> B{RPC gateways and multi-chain lookups reachable?}
B -->|yes| C[Resolve C2 via contract or calldata]
B -->|no, blocked| D[NullReceiver: IPv4 from recipient address]
C --> E[Connect to C2]
D --> EPreconditions / Affected
- ChainDrop (Shai-Hulud family) infected over 400 npm packages, including keyv and cacheable-request. A
preinstallhook downloads a custom Bun runtime and runs an obfuscated harvester. It scans disk and the memory of running build processes for ephemeral cloud IAM keys, CI/CD worker tokens and short-lived OIDC federation keys. It then adds persistent task hooks that fire when a developer opens a project or starts an AI coding session. - PolinRider spans npm, Go modules and Packagist. Loaders hide in repository config files, web resources and IDE workspace automation, so they do not depend on install scripts.
- NullReceiver was seen in the front-end packages bianira-ui and fluid-type-ui.
- DPRK actor (Alluring Pisces, also called Sapphire Sleet or Midnight Neptune):
- Axios: the lead maintainer was compromised and a backdoored dependency, plain-crypto-js, was injected. The payload ran in build pipelines to steal cloud tokens and target macOS code-signing certificates.
- Mastra AI: poisoned npm packages used build hooks to scrape environment variables and cloud keys.
- arrayref: the crate on crates.io used Rust's compilation hook to run a second-stage payload.
- Unit 42 links the three through matching C2 beacon behaviour, SSL configuration and clustered VPS ranges.
What to do
The page gives guidance, not queries or commands.
- Decide whether blockchain traffic is ever legitimate for your organization. If not, any outbound blockchain interaction is a high-confidence anomaly and can be blocked.
- Inspect at process level on developer workstations and CI/CD runners. Alert when runtimes, scripting engines or compilers, which are not crypto tools, query public blockchain gateways.
- Apply automated policy on CI/CD runners and version control to flag unauthorized changes to repository config files, hidden script injections in package manifests, and unverified package lifecycle hooks before build execution.
- Do not rely on static IoC blocklists. The page says they are insufficient for these techniques.
Caveats
- Blocking a single contract address only helps against EtherHiding. The later phases remove that indicator.
- Stolen credentials can bypass MFA "if other controls are not in place".
- The page offers no IoCs, detection rules or RPC endpoint lists. It points to other write-ups, including Unit 42's ChainDrop and Axios pieces, for that detail.
Organisations named here
- Alluring Pisces
- bianira-ui
- EtherHiding
- fluid-type-ui
- NullReceiver
- plain-crypto-js
- Shai-Hulud
- T1195.002
- TxDataHiding
Technologies named here
- npm packages
- Bun runtime
- Go modules
- Packagist
- crates.io
- axios
- Cloud environments
- npm
- Bun
- TRON
- Go
- mastra
- arrayref
- keyv
- cacheable-request
- 2026 Unit 42 Global Incident Response Report
- AI-driven behavioral analytics
- Amazon Threat Intelligence
- bianira-ui and fluid-type-ui (front-end dependencies)
- Blockchain networks used for C2: Ethereum, TRON, Aptos, Binance Smart Chain (BSC)
- Developer IDE workspaces and AI coding sessions
- Developer workstations and CI/CD runners
- Endpoint protection and network security controls
- JSON-RPC (eth_call, eth_getTransactionByHash)
- macOS code-signing certificates (targeted in the Axios compromise)
- Mastra AI npm packages
Techniques named here
- EtherHiding
- Maintainer account compromise
- Cross-Chain Transaction Data Hiding, TxDataHiding (Phase 2)
- Hybrid Web3 C2 architecture
- Memory scraping of build processes
- Persistence via task hooks and workspace automation
- Preinstall script hook abuse
- Rust build hook abuse
- Zero-Data Address Resolution, NullReceiver (Phase 3)
Threat actors named here
- ChainDrop npm worm
- Shai-Hulud
- NullReceiver
- Axios compromise
- ChainDrop
- PolinRider
- DPRK
- Sapphire Sleet
- Alluring Pisces (aka Sapphire Sleet or Midnight Neptune; North Korea-affiliated state-sponsored actor)
- Mastra AI campaign (poisoned npm packages)
- PolinRider campaign (DPRK-affiliated; spans npm, Go modules and Packagist; variants also called ChainVeil and ViteVenom in a cited OpenSourceMalware report)
- Rust arrayref compromise (poisoned crate on crates.io)
Related in Supply Chain


