A coordinated supply chain campaign poisoned 170 packages across npm and PyPI, then extended into GitHub Releases by replacing Cemu Linux assets with backdoored builds linked to the same payload. The campaign used stolen credentials, anti-analysis checks, persistence via a disguised systemd service, and multi-stage exfiltration while researchers also observed claims of responsibility from TeamPCP. #TanStack #mistralai #Cemu #MangelSpec #TeamPCP
Keypoints
- The campaign poisoned 170 legitimate packages across npm and PyPI within a five-hour window.
- Malicious versions of
@tanstack/react-routerwere pushed via compromised npm tokens and a direct commit to the upstream GitHub repository. - A backdoored
mistralai==2.4.6package was uploaded to PyPI without a corresponding upstream tag. - The same payload,
startup.pyz/transformers.pyz, was found in both the Mistral compromise and the Cemu GitHub release assets. - Cemu Linux release files were re-uploaded by the user account MangelSpec, while the macOS and Windows assets remained original bot uploads.
- The AppImage and Ubuntu Linux assets used anti-analysis checks, persistence via a disguised PostgreSQL monitoring service, and broad credential harvesting plus exfiltration logic.
- Researchers reported the compromised release assets to Cemu maintainers, who confirmed MangelSpec was a long-term co-author and removed their repo access pending investigation.
MITRE Techniques
- [T1195.001] Compromise Software Dependencies and Development Tools – The attackers poisoned trusted packages in npm and PyPI and reused the same payload in another legitimate release channel (‘a coordinated supply chain campaign poisoned 170 legitimate packages across npm and PyPI’; ‘the poisoned AppImage was hosted on the real Cemu release page’).
- [T1195.002] Compromise Software Supply Chain – The campaign altered upstream distribution artifacts and release assets to deliver malicious code through trusted project channels (‘direct commit to the upstream GitHub repo’; ‘Replacing it required write access to the actual cemu-project/Cemu repository’).
- [T1135] Network Share Discovery – The payload collected Kubernetes secrets and cloud credentials from multiple environments (‘Credential harvesting is broad, covering AWS (Secrets Manager, SSM), Azure Key Vault, GCP Secret Manager, Kubernetes secrets across all namespaces’).
- [T1552.001] Credentials In Files – The malware searched filesystem credentials including SSH keys, GitHub tokens and password managers (‘filesystem credentials including SSH keys, GitHub tokens and password managers’).
- [T1027] Obfuscated Files or Information – The payload used a renamed zipapp and base64-decoded blobs to hide its behavior (‘startup.pyz is a Python zipapp: a renamed zip archive’; ‘decoding a base64 blob, writing it to disk’).
- [T1497.001] System Checks – The malware used Linux-only, locale, and CPU-count checks to avoid analysis (‘it targets Linux hosts only, exiting early if Russian language settings are detected or the CPU count falls below four’).
- [T1204.002] Malicious File – The AppImage/Ubuntu asset executed the payload after installation and user execution (‘silently installs the cryptography package if absent, and immediately runs the entrypoint module’).
- [T1053.005] Scheduled Task/Job: Systemd Service – Persistence was achieved by installing a systemd service (‘installing it as a systemd service (pgsql-monitor.service)’).
- [T1041] Exfiltration Over C2 Channel – Stolen data was POSTed to a command-and-control endpoint (‘results are POSTed to 83[.]142.209[.]194/v1/weights first’).
- [T1105] Ingress Tool Transfer – The malware fetched and installed a dependency before execution (‘install the cryptography package if absent’).
- [T1562.001] Impair Defenses – The destructive component deleted files and attempted to disrupt the host (‘deleting files from the host’s filesystem with rm -rf /’).
- [T1610] Deploy Container – The payload referenced a dead-drop resolver and GitHub commit polling for RSA-signed C2 addresses (‘polls public GitHub commits for RSA-signed C2 addresses’).
- [T1091] Replication Through Removable Media – Not mentioned.
Indicators of Compromise
- [IP address] C2/exfiltration endpoint – 83.142.209[.]194, and the related path /v1/weights
- [SHA256 hash] Python zipapp payloads – 0f35abda19fb69430c32228465396094b866d887427bf551e353ab31256a9dd6, 1bf72f05191d849049d4a38fced2277ac5cfc54b7ae591f564e7a14add7c886d
- [SHA256 hash] Cemu Linux release assets – f140e76236b96adf7cdc796227af9808665143bc674debb77729fa3e4b8327cc, d07a29c4458d00e42d5d9e6345932592e91644d6b821bacdb7a543c628e0b41a
- [Git commit] Upstream reference tied to the npm compromise – 79ac49eed, and the Cemu release tag commit a6fb0a48eb437a8a41c13b782ac8ae0433bf8f98
- [File names] Malicious release payloads and persistence artifacts – transformers.pyz, startup.pyz, pgmonitor.py, pgsql-monitor.service
- [GitHub repo/release asset] Affected release source – cemu-project/Cemu release tag v2.6, cemu-project/Cemu GitHub Releases
Read more: https://securitylabs.datadoghq.com/articles/backdoored-cemu-release-teampcp-supply-chain-campaign/