Miasma: Anatomy of an Open-Source Supply-Chain Worm Ossprey Security obtained and analyzed the full source release of Miasma, a self-propagating credential-stealing worm published on npm as `voicefromtheouterworld` that needs only a single GitHub PAT to harvest credentials from local filesystems, cloud APIs, process memory and password managers and to propagate across npm, PyPI, RubyGems, GitHub repos and Actions, SSH hosts, AWS EC2 via SSM and JFrog Artifactory. Miasma targets 13 AI coding tools, including Claude Code, Gemini CLI and Cursor, injecting persistent execution hooks that fire when a developer opens a project or starts a session, and uses stolen PATs plus GitHub commit search for exfiltration and command and control. Ossprey said the README self-attributes the worm to TeamPCP but that it has no independent evidence confirming that group authored it, assessing the worm was likely written by a group inspired by TeamPCP's methodology; the primary C2 transport, which POSTs to `api.anthropic.com/v1/api`, is commented out of the open-source build, leaving GitHub public repository commits as the only active exfiltration path. Ossprey Security obtained and analyzed the complete source release of Miasma, a self-propagating multi-ecosystem credential-stealing worm published under the npm package name voicefromtheouterworld . The README self-attributes it to TeamPCP, but we have no independent evidence confirming that group authored or published it. We examined every source file in the release and corroborated our findings against contemporaneous incident reporting covering Red Hat's @redhat-cloud-services npm compromise, the Microsoft Azure GitHub organization takedown, and prior TanStack/Mistral AI campaign waves. Miasma requires only a single GitHub PAT to operate. Given one token, it harvests credentials from the local filesystem, cloud provider APIs, process memory, and password managers; encrypts and exfiltrates everything; and propagates across every connected ecosystem: npm, PyPI, RubyGems, GitHub repos and Actions, SSH hosts, AWS EC2 via SSM, and JFrog Artifactory. It targets 13 AI coding tools - including Claude Code, Gemini CLI, and Cursor - injecting persistent execution hooks that fire whenever a developer opens a project or starts a session. It requires no dedicated infrastructure of its own: stolen PATs and GitHub's own commit search are sufficient for both exfiltration and command and control. Open-source release caveat: The primary C2 transport DomainSender , which POSTs to api.anthropic.com/v1/api is explicitly commented out of the open-source release per the README: "Domain sending DomainSender is currently stripped from the sender chain in the open-source release. It can be easily added back - the code lives in src/sender/domain/ ." In the shipped OSS build, GitHub public repository commits are the only active exfiltration path. The configuration, code, and design intent for the api.anthropic.com C2 are fully present; only the sender chain hook is commented out. Operator/private builds are expected to have it re-enabled. Who is Behind This? The README bundled with this release credits 'TeamPCP' by name, but self-attribution in a public release is not reliable evidence of authorship - it could reflect a copycat actor claiming affiliation or deliberate misdirection. External vendor reporting from ReversingLabs, Wiz, Unit 42, and Tenable tracks the TeamPCP cluster under aliases including Replicating Marauder, TGR-CRI-1135, UNC6780, DeadCatx3, PCPcat, ShellForce, and CipherForce. We have tracked this cluster's earlier campaigns in depth, including the Trivy supply chain attack ./trivy-supply-chain-attack and the complete 83-day TeamPCP campaign timeline ./the-complete-teampcp-campaign . The technical tradecraft - per-build self-extracting payloads, multi-ecosystem token abuse, and commit-based C2 - overlaps with previously documented Mini Shai-Hulud samples associated with that cluster, but code overlap alone does not confirm authorship. Our working assessment is that this worm was written by a group inspired by TeamPCP's methodology rather than TeamPCP itself. Attribution should not be confirmed without C2 infrastructure correlation or additional forensic evidence. Technical Breakdown Stage 0: Preflight and Anti-Analysis We found a comprehensive preflight sequence in src/orchestrator/preflight.ts , src/utils/checkSandbox.ts , and src/utils/config.ts that runs before any credential collection begins. Decoy detection checks multiple environment variables for known sandbox signatures and exits silently on a match: GITHUB TOKEN starting with ghp decoyGitHubToken , NPM TOKEN starting with npm F4k3NPMToken , ANTHROPIC API KEY starting with sk-ant-api03-fake , AWS ACCESS KEY ID starting with AKIAFAKE , and GITHUB REPOSITORY equal to actions-security-demo/compromised-packages . Additional exits trigger if the CWD starts with /tmp/npm-safe/ or /opt/hscan-supplychain-dynamic , if the hostname contains sandbox , or if ~/.aws/credentials contains known AWS documentation example keys. A Russian locale exit checks Intl.DateTimeFormat .resolvedOptions .locale , LC ALL , LC MESSAGES , LANGUAGE , and LANG , exiting immediately if any starts with ru . EDR detection runs ps aux or tasklist against 17 process names and checks 4 installation paths. Covered products include CrowdStrike Falcon falcon-sensor , falcond , csfalcon , SentinelOne, Microsoft Defender for Endpoint mdatp , wdavdaemon , Carbon Black, Cylance, Trend Micro, Tanium, and osquery. When not running inside CI, the worm forks as a background daemon and exits the parent - it detects 30+ CI systems including GitHub Actions, GitLab CI, CircleCI, Jenkins, Azure Pipelines, Buildkite, Vercel, and Cloudflare Pages. It then writes a PID lock file and exits if another instance is already running. SIGINT and SIGTERM handlers are replaced with no-ops, making the process immune to standard termination signals. An undocumented OIDC fast-path checkTargetRepo - not present in ARCHITECTURE.MD - checks whether the worm is running inside a GitHub Actions workflow where WORKFLOW ID and REPO ID SUFFIX env vars match an expected pattern. If so, it immediately executes NPMOidcClient to publish trojanized packages using the runner's OIDC token and exits, bypassing the rest of the kill chain. This allows the worm to self-trigger directly inside OIDC-capable npm-publish runners. The StepSecurity Harden-Runner bypass is layered across three paths: if the Docker socket is accessible, it kills any container whose name or image contains harden-runner , step-security , or stepsecurity . If passwordless sudo is available, it overwrites /etc/resolv.conf with public DNS servers or appends 127.0.0.1 stepsecurity.io and related domains to /etc/hosts . If no direct sudo but Docker socket access exists, it spawns a privileged Alpine container bind-mounted at /etc/sudoers.d/ to grant the runner passwordless sudo, then uses that sudo for the DNS operations. Stage 1: Quick Harvest and Inline C2 Check-In We found three credential providers running synchronously before the exfiltration sender chain is built, so stolen tokens can immediately seed the transport layer. FileSystemService glob-scans 100+ hardcoded hotspot paths. Beyond cloud credentials and SSH keys, notable targets include Claude AI configuration files ~/.claude.json , ~/.claude/ , ~/.claude/projects/ , ~/.claude/mcp.json , shell history for bash, zsh, Python, MySQL, and PostgreSQL, Signal configuration, Slack cookies, Telegram Desktop data, Windows VPN configurations NordVPN, ProtonVPN, CyberGhost, PIA, Windscribe, OpenVPN , and Monero wallet files. Binary files are base64-encoded before exfiltration; files over 10 MB are skipped. The provider is entirely skipped if hostile EDR is detected. ShellService runs gh auth token to extract any GitHub CLI credential, captures the full process.env block - which in CI environments frequently contains injected tokens that never appear as files - and records hostname and username. GitHubRunner reads /proc/