Skip to main content
Meet us at Black Hat USA 2026— Las Vegas, August 1–6Book a Meeting
Mallory
Back to malware
MalwareRansomwareUsed by 2 actorsExploits 3 CVEs

CanisterWorm

CanisterWorm is a self-propagating npm supply-chain worm associated with the TeamPCP threat actor. Reporting describes it as a four-stage worm that uses stolen npm publish tokens to resolve the token owner via the npm API, enumerate all packages the compromised identity can publish, increment patch versions, inject malicious code, and republish trojanized releases at high speed, in some cases compromising 28 packages in under 60 seconds and in broader reporting affecting 47 to 66+ packages. The campaign weaponized legitimate publisher accounts rather than typosquatted packages and spread through npm and developer workflows at scale.

Observed behavior includes harvesting npm credentials from project .npmrc files, the user ~/.npmrc, /etc/npmrc, environment variables such as NPM_TOKEN and NPM_TOKENS, and npm configuration output. The malware has been described as dropping a Python backdoor and establishing Linux persistence through a user-level systemd service named pgmon, installed at ~/.config/systemd/user/pgmon.service and executed from a hidden directory under ~/.local/share/pgmon/. It stores retrieved payloads in /tmp/pglog and tracks execution state in /tmp/.pg_state.

For command and control, CanisterWorm has been reported to poll the Internet Computer Protocol canister endpoint tdtqy-oyaaa-aaaae-af2dq-cai.raw.icp0.io, which returns a plain-text URL for a second-stage payload. Multiple sources describe this ICP canister usage as a dead-drop resolver or decentralized C2 mechanism.

CanisterWorm was observed as a follow-on activity after the Aqua Security Trivy compromise, with TeamPCP using stolen publish tokens from that incident to expand into the npm ecosystem. It is also linked in reporting to attacks on Kubernetes environments and to a conditional destructive capability targeting Iranian systems: earlier payloads reportedly checked for Iran timezone or Farsi language settings and, on a match, attempted to wipe Kubernetes clusters node by node or destroy the local machine if no cluster was found. Some reporting states that on devices in other regions, the malware instead installs a CanisterWorm backdoor.

High-confidence indicators and artifacts mentioned in the content include the ICP endpoint tdtqy-oyaaa-aaaae-af2dq-cai.raw.icp0.io, persistence artifact ~/.config/systemd/user/pgmon.service, execution path under ~/.local/share/pgmon/, and temporary files /tmp/pglog and /tmp/.pg_state.

Share:
For your environment

Hunt this family in your stack

Mallory pivots from this family to the IOCs, detections, and named campaigns that touch your stack, and pages you when something new lands.

EXPLOITED CVES

Vulnerabilities exploited

3 CVEs Mallory has correlated with this family across public research and vendor advisories. Each row links to the full Mallory page for that vulnerability.

3 CVES
CVE-2026-33634Trivy supply chain compromise via malicious release and retagged GitHub ActionsExploited in the wild

Subsequently, the threat actors weaponized the stolen credentials to compromise npm packages and push a self-propagating worm named CanisterWorm.

via the hacker newsthehackernews.com
CVE-2025-55182React2Shell RCE in React Server Components Flight Protocol

Aikido Security - TeamPCP deploys CanisterWorm on NPM ... CanisterWorm — Self-propagating worm using ICP Canister for C2 ... File System Indicators /tmp/pglog (CanisterWorm payload drop path) | Who is TeamPCP? ... Known TTPs ... Notable CVEs CVE-2025-29927, CVE-2025-55182 (React2Shell)

via opensourcemalware blogopensourcemalware.com
CVE-2025-29927Next.js middleware authorization bypass via x-middleware-subrequest header

Aikido Security - TeamPCP deploys CanisterWorm on NPM ... CanisterWorm — Self-propagating worm using ICP Canister for C2 ... File System Indicators /tmp/pglog (CanisterWorm payload drop path)

via opensourcemalware blogopensourcemalware.com
THREAT ACTORS

Groups observed using it

2 distinct threat actors attributed by public researchers. Open in Mallory to see the full evidence chain and overlapping campaigns.

View more details
TeamPCP

Wiz Research continues to track TeamPCP activity following the initial Trivy compromise. The threat actor has expanded operations to the npm ecosystem via a worm ("CanisterWorm") leveraging stolen publish tokens.

via wiz blogwiz.io
TeamPCP

Automated propagation via worming across software dependencies (T1210 / T1105). Deploying self-propagating malware (e.g., CanisterWorm) to spread through npm and developer workflows at scale

via sophos threat researchsophos.com
MITRE ATT&CK

Techniques & procedures

26 distinct techniques documented for this family, organized by ATT&CK tactic.

Initial Access

3 techniques
T1078Valid AccountsEvidence6

Each phase of the campaign was funded by credentials stolen in the previous one. The compromised aqua-bot token enabled injection into additional Aqua repositories. Harvested npm publish tokens fueled CanisterWorm... Stolen PyPI tokens enabled the LiteLLM compromise. Stolen Checkmarx CI credentials enabled the pivot...

T1195Supply Chain CompromiseEvidence10

TeamPCP used the residual access on March 19 to push a malicious v0.69.4 tag to the Trivy repository... The commits fetched malicious Go source files from the typosquatted C2 domain scan.aquasecurtiy[.]org and fed them into the build pipeline, turning Trivy’s own release process into a malware distribution channel.

T1195.001Compromise Software Dependencies and Development ToolsEvidence4

Researchers also found TeamPCP expand its operations to infect the npm ecosystem via a never-before-seen worm, called CanisterWorm, leveraging stolen publish tokens from the initial Trivy compromise.

Execution

3 techniques
T1059.006PythonEvidence1

The postinstall logic drops and launches a Python backdoor, then sets up persistence on Linux via a user-level systemd service named pgmon.

T1072Software Deployment ToolsEvidence1

MITRE ATT&CK Mapping Technique ID Implementation Software Deployment Tools T1072 npm publish / PyPI upload abused as lateral movement and propagation

T1574Hijack Execution FlowEvidence1

Once attackers obtain a valid npm publishing token or equivalent CI/CD access, they replace legitimate package contents with a malicious build that looks benign in version history but contains an extra postinstall hook. This hook runs automatically during npm install, so developers are infected simply by resolving dependencies, with no additional execution step.

Persistence

3 techniques
T1078Valid AccountsEvidence6

Each phase of the campaign was funded by credentials stolen in the previous one. The compromised aqua-bot token enabled injection into additional Aqua repositories. Harvested npm publish tokens fueled CanisterWorm... Stolen PyPI tokens enabled the LiteLLM compromise. Stolen Checkmarx CI credentials enabled the pivot...

T1543.002Systemd ServiceEvidence1

The postinstall logic drops and launches a Python backdoor, then sets up persistence on Linux via a user-level systemd service named pgmon, installed under ~/.config/systemd/user/pgmon.service.

T1546Event Triggered ExecutionEvidence1

MITRE ATT&CK Mapping Technique ID Implementation Event Triggered Execution T1546 GitHub Actions workflows triggered by push/discussion; IDE task hooks

Privilege Escalation

3 techniques
T1078Valid AccountsEvidence6

Each phase of the campaign was funded by credentials stolen in the previous one. The compromised aqua-bot token enabled injection into additional Aqua repositories. Harvested npm publish tokens fueled CanisterWorm... Stolen PyPI tokens enabled the LiteLLM compromise. Stolen Checkmarx CI credentials enabled the pivot...

T1543.002Systemd ServiceEvidence1

The postinstall logic drops and launches a Python backdoor, then sets up persistence on Linux via a user-level systemd service named pgmon, installed under ~/.config/systemd/user/pgmon.service.

T1546Event Triggered ExecutionEvidence1

MITRE ATT&CK Mapping Technique ID Implementation Event Triggered Execution T1546 GitHub Actions workflows triggered by push/discussion; IDE task hooks

Stealth

3 techniques
T1027Obfuscated Files or InformationEvidence1

MITRE ATT&CK Mapping Technique ID Implementation Obfuscated Files / Information T1027 AES-256-GCM encrypted payload constants; JS obfuscation; scramble()

T1078Valid AccountsEvidence6

Each phase of the campaign was funded by credentials stolen in the previous one. The compromised aqua-bot token enabled injection into additional Aqua repositories. Harvested npm publish tokens fueled CanisterWorm... Stolen PyPI tokens enabled the LiteLLM compromise. Stolen Checkmarx CI credentials enabled the pivot...

T1574Hijack Execution FlowEvidence1

Once attackers obtain a valid npm publishing token or equivalent CI/CD access, they replace legitimate package contents with a malicious build that looks benign in version history but contains an extra postinstall hook. This hook runs automatically during npm install, so developers are infected simply by resolving dependencies, with no additional execution step.

Credential Access

4 techniques
T1528Steal Application Access TokenEvidence3

In parallel, the JavaScript loader aggressively harvests npm credentials from multiple locations. It parses local .npmrc files in projects, the user’s ~/.npmrc, and /etc/npmrc for _authToken entries, and also inspects environment variables such as NPM_TOKEN and NPM_TOKENS.

T1552Unsecured CredentialsEvidence1

...it allows them to steal API keys, cloud and database credentials, GitHub tokens, plus a ton of other secrets and sensitive information.

T1552.001Credentials In FilesEvidence1

MITRE ATT&CK Mapping Technique ID Implementation Credentials from Files T1552.001 100+ filesystem hotspots across Linux/macOS/Windows

T1649Steal or Forge Authentication CertificatesEvidence1

The Trivy payload’s primary objective was credential harvesting ... swept 50+ hardcoded filesystem paths for credentials: AWS configuration files, Docker Hub authentication tokens, PyPI publishing tokens, SSH keys ...

Discovery

1 technique
T1526Cloud Service DiscoveryEvidence1

A deploy.js script uses the stolen credentials to query the npm registry search API (/-/v1/search) and enumerate all packages that the compromised user can publish.

Lateral Movement

3 techniques
T1072Software Deployment ToolsEvidence1

MITRE ATT&CK Mapping Technique ID Implementation Software Deployment Tools T1072 npm publish / PyPI upload abused as lateral movement and propagation

T1210Exploitation of Remote ServicesEvidence2

Automated propagation via worming across software dependencies (T1210 / T1105). Deploying self-propagating malware (e.g., CanisterWorm) to spread through npm and developer workflows at scale

T1570Lateral Tool TransferEvidence1

Harvested npm publish tokens fueled CanisterWorm, which resolved token owner identities via the npm API, enumerated all packages the compromised identity could publish to, bumped patch version numbers, and pushed malicious updates to 28 packages in under 60 seconds.

Collection

1 technique
T1119Automated CollectionEvidence1

Given a single stolen npm publishing token, CanisterWorm enumerated every package within that token’s publishing scope, incremented version numbers, and inserted malicious code into new releases—completing this cycle in under 60 seconds per token.

Command and Control

5 techniques
T1071Application Layer ProtocolEvidence2

For command and control, the backdoor repeatedly polls an Internet Computer Protocol (ICP) canister endpoint, specifically tdtqy-oyaaa-aaaae-af2dq-cai.raw.icp0.io, which acts as a dead-drop channel.

T1071.001Web ProtocolsEvidence1

On Linux and macOS, the decoded Python script conducts credential collection ... exfiltrating results as tpcp.tar.gz via HTTP POST with the header X-Filename: tpcp.tar.gz to the same C2 IP address.

T1095Non-Application Layer ProtocolEvidence1

For command-and-control, TeamPCP employed Internet Computer Protocol (ICP) blockchain canisters—decentralized, immutable smart contracts hosted on the ICP network.

T1102.001Dead Drop ResolverEvidence1

This malware uniquely leverages an ICP canister, a tamperproof smart contract on the Internet Computer blockchain, as a dead drop resolver for its command-and-control (C2) server.

T1105Ingress Tool TransferEvidence3

Automated propagation via worming across software dependencies (T1210 / T1105). Deploying self-propagating malware (e.g., CanisterWorm) to spread through npm and developer workflows at scale

Exfiltration

2 techniques
T1567Exfiltration Over Web ServiceEvidence1

The HTTP exfiltration channel used the identifying header X-Filename: tpcp.tar.gz , which provides a reliable network detection signature for retrospective traffic analysis.

T1567.002Exfiltration to Cloud StorageEvidence1

MITRE ATT&CK Mapping Technique ID Implementation Exfiltration Over Web Service T1567.002 GitHub repo commits; GitHub Actions artifacts; P2P Session network

Impact

2 techniques
T1485Data DestructionEvidence2

reported a probabilistic sabotage mechanism with a 1-in-6 chance of running a recursive wipe on systems matching Israeli or Iranian locales... The original TeamPCP campaign report documented a conditional wiper... attempted to destroy data, wiping Kubernetes clusters node by node, or the local machine if no cluster was found.

T1565Data ManipulationEvidence1

Researchers have additionally observed activity involving CanisterWorm, malware that targeted Kubernetes environments and reportedly deployed destructive functionality against selected Iranian targets.

INDICATORS OF COMPROMISE

IOCs tracked for this family

70 indicators attributed across vendor reports, sandbox runs, and researcher write-ups. Full values are available in Mallory.

View more in app
Network
28 tracked

IPs, domains, and DNS infrastructure linked to this family.

Hashes
35 tracked

File hashes (MD5, SHA-1, SHA-256) from samples and reports.

Other
7 tracked

Other indicator types observed in public reporting.

TypeValueLatest sighting
ip.v4●●●●●●●●●●●●View more in app1 day ago
domain●●●●●●●●●●●●View more in app13 days ago
domain●●●●●●●●●●●●View more in app17 days ago
uri●●●●●●●●●●●●View more in app23 days ago
ip.v4●●●●●●●●●●●●View more in app1 month ago
ip.v4●●●●●●●●●●●●View more in app1 month ago
What this page doesn’t show

The version that knows your environment.

This page is what’s public. Mallory adds the parts that aren’t: which of your assets match these IOCs, which detections are missing, which campaigns to expect next, and what to do in the next 30 minutes.
IOC matching70

Match every observed IP, domain, and hash against your live telemetry.

Threat actor attribution2

Named campaigns wielding this family, with evidence pinned to each claim.

Exploited vulnerabilities3

CVEs this family uses for access and lateral movement.

Detection signatures

YARA, Sigma, Snort, and vendor rules, auto-deployed to your SIEM.

MITRE ATT&CK mapping26

Every documented technique, ranked by evidence weight.

Researcher chatter

Reddit, Mastodon, and CTI community discussion around this family.