Open Source ·

AntV ecosystem npm packages hit by TeamPCP

On 2026-05-19, TeamPCP took the shared atool npm account and published 639 malicious versions across 323 packages — most of the @antv ecosystem and a long tail of standalone neighbors. The bun-based dropper harvested CI/CD secrets and self-propagated via npm.

Part of Shai-Hulud hits npm and PyPI campaign

Hundreds of npm packages from Alibaba's @antv data-visualization stack, plus a long tail of widely used JavaScript utilities that happened to share the same maintainer account, were hijacked over a 90-minute stretch on the morning of May 19, 2026, and republished as a self-spreading credential stealer.

The packages were all owned by an npm account called atool, the shared publishing handle behind the @antv namespace, several smaller scopes, and a grab-bag of standalone libraries including echarts-for-react, timeago.js, and size-sensor. Researchers at Socket, who first reported the activity, said the attacker pushed 639 malicious versions across 323 packages in two automated waves between 01:39 and 02:56 UTC; npm's own publication records still account for 566 of those versions across 283 packages, in two bursts at 01:56 and 02:05. SafeDep and StepSecurity confirmed roughly the same scope. Wiz, which named the attacker TeamPCP, said the broader "Mini Shai-Hulud" wave that day reached 1,055 versions across 502 packages spanning npm, PyPI, and Composer, most of it driven by this single compromised account.

According to Socket, the attacker used two delivery paths. Most packages had their package.json rewritten with a preinstall or postinstall of bun run index.js, with the script dropped at the package root. A second set instead pointed at a poisoned commit in the antvis/G2 GitHub repository through optionalDependencies, where a prepare hook ran the same code. The payload was a half-megabyte, heavily obfuscated Bun script that walked the disk for credentials covering every major cloud provider, Kubernetes, HashiCorp Vault, SSH, and database connection files, then read /proc/*/mem on GitHub Actions runners to pull masked CI/CD secrets out of the Runner.Worker process in plaintext. It behaved like a worm: given any usable npm token, it would validate the credential, enumerate every package the account could publish, fetch each package's latest tarball, inject the same dropper, and republish. Exfiltration ran to t.m-kosche.com over HTTPS disguised as OpenTelemetry trace traffic, with bodies wrapped in AES-256-GCM and RSA-OAEP, falling back to GitHub itself when that channel failed and committing harvested data to public repositories on stolen developer accounts. Socket counted between 2,200 and 2,500 such repositories by the end of the day. On infected hosts the payload also rewrote editor and CI configuration files and, on macOS, registered a LaunchAgent for a backdoor named kitty.

Socket said it flagged most malicious versions within six to twelve minutes of publish, with a median of 6.7 minutes, and npm reclassified them as known malware. Wiz attributed the operation to TeamPCP at moderate confidence based on shared infrastructure, the firedalazer dead-drop tag, payload kinship with other campaigns, and reuse of the kitty backdoor and Dune-themed repositories elsewhere in the same wave. The same backdoor surfaced a few hours later in the Nx Console VS Code extension compromise (see [[nx-console]]), and Wiz said credentials stolen in the @antv wave were later used to publish a malicious Microsoft Python SDK to PyPI (see [[durabletask-pypi]]). The cross-ecosystem aggregate lives on [[shai-hulud-here-we-go-again]]; this record holds the @antv-account evidence.

Notes

  • The compromised maintainer was the shared npm account atool, email [email protected], covering the @antv, @lint-md, @openclaw-cn and @starmind scopes. Wiz tracked the same account's GitHub credentials entering microsoft/durabletask-python that day.
  • Version lists here were derived from npm publication times, not a published table: 283 releases at 01:56 UTC and 283 more at 02:05 to 02:06. That is 566 versions across 283 packages, against Socket's 639; the rest have no npm record left.
  • Three same-day releases at 01:44, 01:47 and 01:49 UTC sit outside the bursts and are still served. Their archives contain none of the campaign's files, so they are recorded as clean baselines rather than affected versions.
  • The complete @antv/g2 5.5.8 archive was recovered from Huawei Cloud's historical npm mirror. Its SHA-256 and size match the values published by AntV and it includes the previously missing malicious index.js.

Appendix · Affected releases

@antv/a8 npm
0.1.1 sha256 50612170…7292cce6 download unavailable
0.2.1 sha256 fd016c7d…65b22357 download unavailable
0.3.5 sha256 2db82d9f…e44c1ba8 download unavailable
0.4.5 sha256 4b06e31c…ab5b58fc download unavailable
2.3.9 sha256 cea2c8bc…d7d5d6fe download unavailable
2.4.9 sha256 facc88bb…56e812e2 download unavailable
0.4.5 sha256 df1db8f6…26f66a9b download unavailable
0.5.5 sha256 95db9eae…727cdbba download unavailable
@antv/ava npm
3.5.1 sha256 bacd2b25…ce5a1bad download unavailable
3.6.1 sha256 abf9f970…a9ee487c download unavailable
3.4.2 sha256 3279ff7c…716dfc61 download unavailable
3.5.2 sha256 a62f5c13…0ea69a45 download unavailable
0.1.9 sha256 f66e1aeb…ef62dcb1 download unavailable
0.2.9 sha256 57a98d0d…21d5b3c9 download unavailable
@antv/ckb npm
2.1.4 sha256 6eadf32e…b1392462 download unavailable
2.2.4 sha256 d6d6eb3f…55d629f2 download unavailable
2.1.6 sha256 db98444a…fdd6af65 download unavailable
2.2.6 sha256 4919ed41…3e5d095a download unavailable
0.5.7 sha256 e7fc9247…b3e9afda download unavailable
0.6.7 sha256 93af9e6c…579e451a download unavailable
1.1.0 sha256 be8ccdbb…0b70d71c download unavailable
1.2.0 sha256 2bee1f50…d84db121 download unavailable
0.12.8 sha256 c9d85342…5846f9f6 download unavailable
0.13.8 sha256 1ab39429…935f8006 download unavailable
2.1.4 sha256 7d1ed3cd…49e2b03d download unavailable
2.2.4 sha256 b36616ee…7f9e3f2d download unavailable
1.2.7 sha256 e416a468…8c0993ae download unavailable
1.3.7 sha256 9fbf43b3…f8ad1cad download unavailable
1.2.4 sha256 04b97165…54a9ded5 download unavailable
1.3.4 sha256 29eb64d9…364c6c94 download unavailable
1.1.2 sha256 3a0c5fb3…4c3fbd55 download unavailable
1.2.2 sha256 829ca38a…e0685ccc download unavailable
0.1.0 sha256 a06d2a18…983c88a4 download unavailable
0.2.0 sha256 740ac9e1…1b1a090b download unavailable
1.11.0 sha256 21612a46…1d11d145 download unavailable
1.12.0 sha256 8c6bc5df…00ebe8cb download unavailable
1.11.0 sha256 d61f87eb…b1b6fa66 download unavailable
1.12.0 sha256 07fa9893…acfac255 download unavailable
1.11.0 sha256 ef45d438…e798da0d download unavailable
1.12.0 sha256 96918343…349c9cab download unavailable
1.11.0 sha256 3ee21b7f…df375bc5 download unavailable
1.12.0 sha256 0c5d50ca…9b68ee9e download unavailable
1.11.0 sha256 7f7a9779…1c39d233 download unavailable
1.12.0 sha256 41685248…41353812 download unavailable
1.11.0 sha256 6fcd0d61…406d825c download unavailable
1.12.0 sha256 e58b0017…8216668d download unavailable
@antv/f2 npm
5.15.0 sha256 d642546c…5aaf77b3 download unavailable
5.16.0 sha256 33da7c98…527efa1c download unavailable
1.1.5 sha256 3af9aad5…d23ea3cb download unavailable
1.2.5 sha256 2bb197e5…1e2a9ca9 download unavailable
0.1.1 sha256 744fdefc…5e3527b0 download unavailable
0.2.1 sha256 67548e3c…90260d24 download unavailable
4.1.52 sha256 9e6c3c7a…6014911c download unavailable
4.2.52 sha256 b77348e3…3a7447c4 download unavailable
5.15.0 sha256 50f4eb0b…cf4d0b2d download unavailable
5.16.0 sha256 bf74ca6c…011a954c download unavailable
4.1.42 sha256 52d3af03…3727b935 download unavailable
4.2.42 sha256 1a15fd17…5af9e335 download unavailable
4.1.33 sha256 6e06dd20…8704909b download unavailable
4.2.33 sha256 941232d6…ca07cd7e download unavailable
4.1.51 sha256 ab8a0e43…7b5eeda7 download unavailable
4.2.51 sha256 8990076a…c4929c2b download unavailable
@antv/f6 npm
0.1.19 sha256 acf034a9…42806ead download unavailable
0.2.19 sha256 e2bc30c1…e7d871f2 download unavailable
0.1.7 sha256 5b262b23…ae9f2ba5 download unavailable
0.2.7 sha256 96b70a68…6f965b08 download unavailable
0.1.2 sha256 042d1645…3d6af81c download unavailable
0.2.2 sha256 2642c496…6976c760 download unavailable
0.1.1 sha256 e52c6b91…09b67bb9 download unavailable
0.2.1 sha256 94c91ff0…89111577 download unavailable
1.1.6 sha256 18ee815f…8bd68a97 download unavailable
1.2.6 sha256 3d137b1f…92e3cd25 download unavailable
1.1.3 sha256 df027523…d571ca96 download unavailable
1.2.3 sha256 40f89e36…67719748 download unavailable
0.1.7 sha256 fcdd0933…c15c2200 download unavailable
0.2.7 sha256 9b330f5b…5b4455a4 download unavailable
@antv/g npm
6.4.1 sha256 7379b099…799c5d8b download unavailable
6.5.1 sha256 49569158…66b8e18c download unavailable
0.6.16 sha256 03379e4b…bdb4993d download unavailable
0.7.16 sha256 1480ab63…a157f305 download unavailable
2.3.0 sha256 b3f86f89…cc261554 download unavailable
2.4.0 sha256 67620f93…d89d57ec download unavailable
1.1.11 sha256 0df72545…6844b46c download unavailable
1.2.11 sha256 01101724…5879abd3 download unavailable
2.8.0 sha256 c4b4aece…1c1ed76d download unavailable
2.9.0 sha256 32d7e0c3…91689de4 download unavailable
3.2.0 sha256 8ae1e010…9a8660ce download unavailable
3.3.0 sha256 c11600e4…a099d05a download unavailable
1.2.5 sha256 d8dff547…c8596049 download unavailable
1.3.5 sha256 7a145343…8312a402 download unavailable
1.1.0 sha256 4dfd3ea1…124d33db download unavailable
1.2.0 sha256 581d768c…03eecd17 download unavailable
2.2.1 sha256 6cd04113…12ae4786 download unavailable
2.3.1 sha256 f775c928…68b1379b download unavailable
2.2.1 sha256 8d7de6a2…f7c9c5d2 download unavailable
2.3.1 sha256 b9e8144c…c272d35c download unavailable
2.2.1 sha256 592ae8a8…5d6e7cfe download unavailable
2.3.1 sha256 4abf62de…2368f1ee download unavailable
@antv/g2 npm
5.5.8 sha256 1f9bb122…78cc0dd7 download unavailable
5.6.8 sha256 4e4e59ad…124bdcfa download unavailable
  • The SHA-256 applies specifically to 5.5.8. GitHub issue 7394 records the measured 2,306,515-byte npm tarball and its digest; npm now returns 404. MalwareBazaar, Triage and Malshare held no bytes under that digest on 2026-08-13.
0.1.2 sha256 ab07bf23…99cb27fc download unavailable
0.2.2 sha256 7f19dbf5…89011070 download unavailable
0.3.0 sha256 2be1425a…f9d608d0 download unavailable
0.4.0 sha256 a8ff05fb…01305683 download unavailable
2.5.35 sha256 92170d6d…553cde54 download unavailable
2.6.35 sha256 ba10efb2…0fbfe3c9 download unavailable
@antv/g6 npm
5.2.1 sha256 dc62136c…00dff07f download unavailable
5.3.1 sha256 a0ed0413…764ed207 download unavailable
0.1.1 sha256 7cc55580…51bb24bb download unavailable
0.2.1 sha256 42aa2581…26637040 download unavailable
0.1.4 sha256 45321371…3a587e76 download unavailable
0.2.4 sha256 ac3af0d0…af5d62b5 download unavailable
0.9.24 sha256 b61eb451…8ff8e5ba download unavailable
0.10.24 sha256 60aedad3…abeb37fa download unavailable
1.3.0 sha256 8e87b1d3…6625779f download unavailable
1.4.0 sha256 30592967…ff830d31 download unavailable
0.2.2 sha256 7b573c45…e9fa97ed download unavailable
0.3.2 sha256 591cf71f…f00d2ceb download unavailable
0.9.25 sha256 d54922bd…adb8e4aa download unavailable
0.10.25 sha256 e7c70b7b…9c438c26 download unavailable
1.1.9 sha256 f2ed65c6…38b569de download unavailable
1.2.9 sha256 c12e3d8a…a899aafc download unavailable
0.2.1 sha256 ce78d260…f4192fc7 download unavailable
0.3.1 sha256 17235bf9…158649ad download unavailable
0.1.1 sha256 f6597dae…928ac335 download unavailable
0.2.1 sha256 ecc96d86…f7eff26a download unavailable
1.1.8 sha256 d4f01ac2…66c31bf4 download unavailable
1.2.8 sha256 7ad60b28…819842d7 download unavailable
1.3.11 sha256 195197a5…33f9d102 download unavailable
1.4.11 sha256 7b419eda…7fb4dc03 download unavailable
3.1.0 sha256 94777425…f8c90e16 download unavailable
3.2.0 sha256 3fc71d25…b9c8cd73 download unavailable
2.8.1 sha256 94ce4e38…dc560184 download unavailable
2.9.1 sha256 f74b3d17…4088ad87 download unavailable
1.1.0 sha256 33475a24…7cbdb04d download unavailable
1.2.0 sha256 10cb684e…b4230761 download unavailable
3.1.5 sha256 47a83337…e388e89a download unavailable
3.2.5 sha256 338a17a7…c119d4e6 download unavailable
2.1.4 sha256 5feceea4…7a0c8ebb download unavailable
2.2.4 sha256 4fc8096c…4f0d1a5e download unavailable
0.8.1 sha256 e5247989…59363227 download unavailable
0.9.1 sha256 2f2e70d0…b9d0f174 download unavailable
0.1.0 sha256 c5fdb45b…6ef02f33 download unavailable
0.2.0 sha256 dc699893…5b7cb713 download unavailable
1.2.4 sha256 29196917…29f88ae4 download unavailable
1.3.4 sha256 66bfc094…9405c858 download unavailable
@antv/l7 npm
2.26.10 sha256 502829ab…d10546f3 download unavailable
2.27.10 sha256 9f7ab30d…013032df download unavailable
3.2.5 sha256 db9da48c…a3a1b7eb download unavailable
3.3.5 sha256 b2bd8aca…4dc36362 download unavailable
1.1.2 sha256 47ed8399…a39a0255 download unavailable
1.2.2 sha256 55e442a9…db89ce7d download unavailable
2.26.10 sha256 9096cc1b…e7b9de5d download unavailable
2.27.10 sha256 607b758f…91879254 download unavailable
0.6.0 sha256 c6fd41f9…67b2f989 download unavailable
0.7.0 sha256 b456ac1f…f863c514 download unavailable
2.21.8 sha256 4fd7167e…2e1ae852 download unavailable
2.22.8 sha256 2591aeb2…7c90be5a download unavailable
1.1.0 sha256 82456725…c864103a download unavailable
1.2.0 sha256 f94d6dc4…8be4773b download unavailable
2.5.3 sha256 949f146a…070b6725 download unavailable
2.6.3 sha256 43863c24…e047da4c download unavailable
0.6.11 sha256 f5223fea…2f0fb194 download unavailable
0.7.11 sha256 974c5d09…52a6ef71 download unavailable
1.6.1 sha256 fbf84322…cf5460d9 download unavailable
1.7.1 sha256 64738e7d…eaf1c2e5 download unavailable
1.2.7 sha256 bad6672e…052037e0 download unavailable
1.3.7 sha256 97568ee3…eb3a11d7 download unavailable
1.7.1 sha256 7b5d08b2…246b3302 download unavailable
1.8.1 sha256 b3a0b4e2…9e5f79d8 download unavailable
1.9.2 sha256 346e0fb8…3749363c download unavailable
1.10.2 sha256 a9200a8b…3d5c01ce download unavailable
1.6.1 sha256 33b46930…b9b435f9 download unavailable
1.7.1 sha256 f2bb48b9…11e777b1 download unavailable
2.2.7 sha256 193d2efb…4687535d download unavailable
2.3.7 sha256 12d96100…2961be1f download unavailable
0.2.1 sha256 b09002ed…72ebcd41 download unavailable
0.3.1 sha256 fe396453…adf86170 download unavailable
3.1.1 sha256 088750c9…0978db4d download unavailable
3.2.1 sha256 cc81c8c0…e3145446 download unavailable
2.2.1 sha256 99f7d6c3…6d9d7d47 download unavailable
2.3.1 sha256 f3ea4493…2164a0e1 download unavailable
@antv/s2 npm
2.8.1 sha256 b1442e77…41f384ea download unavailable
2.9.1 sha256 259a02a5…4b59f4ef download unavailable
2.4.1 sha256 f0fcfcef…50317cb4 download unavailable
2.5.1 sha256 2a83bcb9…a98e5c20 download unavailable
0.2.1 sha256 4f660fc8…68658eeb download unavailable
0.3.1 sha256 031d96bf…d03cfdf7 download unavailable
2.3.0 sha256 20c178ba…0df6b375 download unavailable
2.4.0 sha256 ecdbdba6…9d2b32e7 download unavailable
@antv/sam npm
0.3.0 sha256 525cd627…a843343f download unavailable
0.4.0 sha256 41cd89d9…bfdb33dd download unavailable
0.6.2 sha256 642b47b3…b7364efc download unavailable
0.7.2 sha256 3d9e2414…9ee04e73 download unavailable
0.1.2 sha256 39e5ec2b…44ad6912 download unavailable
0.2.2 sha256 9e0db6da…0acd5330 download unavailable
@antv/t8 npm
0.4.0 sha256 21fa5c8c…7b05969c download unavailable
0.5.0 sha256 0aec9126…a756f0c4 download unavailable
2.1.0 sha256 fbdf4543…7674e1c4 download unavailable
2.2.0 sha256 67fd21b6…55f680ac download unavailable
1.1.6 sha256 89dd4836…375728f5 download unavailable
1.2.6 sha256 831174e5…6d227c0f download unavailable
1.1.1 sha256 eb7629a8…7e1121cf download unavailable
1.2.1 sha256 75abebcb…1099f708 download unavailable
3.4.11 sha256 b64ca072…896c4593 download unavailable
3.5.11 sha256 42174327…7a8a3704 download unavailable
1.1.11 sha256 47a1363e…5bb247e8 download unavailable
1.2.11 sha256 9a06fe27…464ad203 download unavailable
2.2.1 sha256 9d09fe81…918a2120 download unavailable
2.3.1 sha256 6cef4fbf…073aaac6 download unavailable
@antv/x6 npm
3.2.7 sha256 f0f73f25…73729fcf download unavailable
3.3.7 sha256 b32b0366…b1375e03 download unavailable
0.2.26 sha256 9e90707d…a9a2d84a download unavailable
0.3.26 sha256 8cb3c3fd…5db32bc2 download unavailable
1.5.2 sha256 a12ed3e2…3eef7827 download unavailable
1.6.2 sha256 b3bf53de…ffb31023 download unavailable
2.2.13 sha256 ca28d75f…3b2639bb download unavailable
2.3.13 sha256 14e031c0…609aa2d0 download unavailable
1.1.0 sha256 f760e103…7eacc152 download unavailable
1.2.0 sha256 0b738dac…b7b958a8 download unavailable
2.1.0 sha256 859ff0db…cfae65a3 download unavailable
2.2.0 sha256 7443940e…1be84528 download unavailable
2.1.0 sha256 68695fc4…065c8983 download unavailable
2.2.0 sha256 a99f6de2…9918d9d1 download unavailable
2.1.4 sha256 8608905a…c98c2d13 download unavailable
2.2.4 sha256 b8a6c02c…5ef010f0 download unavailable
2.6.3 sha256 8046d4ad…69546ce6 download unavailable
2.7.3 sha256 a7244323…91bee6e7 download unavailable
1.1.11 sha256 7f451265…12a80f1a download unavailable
1.2.11 sha256 3dbb905c…3a255f97 download unavailable
1.1.4 sha256 a6273dc9…3c15f729 download unavailable
1.2.4 sha256 68d41607…377255ed download unavailable
4.1.2 sha256 6549cd7b…fb230e0d download unavailable
4.2.2 sha256 9fe5df3a…180e6c86 download unavailable

Indicators

  • fileindex.js
  • commandbun run index.js
  • file~/.local/share/kitty/cat.py
  • file~/Library/LaunchAgents/com.user.kitty-monitor.plist
  • file~/.config/systemd/user/kitty-monitor.service
  • file.claude/settings.json
  • file.claude/setup.mjs
  • file.vscode/tasks.json
  • file.vscode/setup.mjs
  • file.github/workflows/codeql.yml
  • domaint.m-kosche.com
  • domainm-kosche.com
  • ipv4185.95.159.32
  • urlhttps://t.m-kosche.com:443/api/public/otel/v1/traces
  • tagfiredalazer
  • tagniagA oG eW ereH :duluH-iahS
  • file_sha256cat.py: fb5c97557230a27460fdab01fafcfabeaa49590bafd5b6ef30501aa9e0a51142
  • file_sha1cat.py: 783b4019fc5b942a29846132d28441c8fc31bed8
  • file_md5cat.py: b06b126b9e26af03a7ef2f8b8e90d446
  • accountatool (npm)

References

  1. Mini Shai-Hulud: TeamPCP Hits @antv Supply Chain - Wizwiz.io
  2. Shai-Hulud Here We Go Again - Mass npm Supply Chain Attack Hits the AntV Ecosystem - StepSecuritystepsecurity.io
  3. @antv Packages Compromised - Socketsocket.dev
  4. @antv/g2 5.5.8 malicious release report with measured tarball checksumgithub.com
  5. @antv/g2 5.5.8 retained package member listing - Socketsocket.dev
  6. Mini Shai-Hulud compromised AntV npm packages enable CI/CD credential theft - Microsoftmicrosoft.com
  7. Shai-Hulud Here We Go Again - JFrog Security Researchresearch.jfrog.com

Source record: oss/attacks/antv-npm/meta.yaml