# @antv maintainer takeover (atool) - Mini Shai-Hulud burst across ~300 packages

> On 2026-05-19 the compromised npm publisher `atool` (Alibaba / AntV co-maintainer) pushed an automated burst of 639 malicious versions across 323 unique packages - the entire `@antv` visualization suite plus widely-used unscoped libraries including `echarts-for-react`, `size-sensor`, and `timeago.js` (>15M combined monthly downloads). Each release adds a `preinstall: bun run index.js` hook running the Mini Shai-Hulud credential-stealer. Attributed to TeamPCP.

- Published: 2026-05-19
- Last updated: 2026-07-28
- Severity: critical
- Kind: Compromise - A legitimate, already-used package, maintainer account, CI pipeline, or release tag was hijacked and a malicious version was published under a name people already depend on.
- Ecosystems: npm
- Scope: 298 packages, 599 compromised versions
- Tags: worm, credential-theft, ci-cd-compromise, maintainer-takeover, obfuscation
- Threat actor: TeamPCP
- Also known as: Mini Shai-Hulud, AntV burst
- Detected by: Socket, JFrog, Microsoft, Aikido, OX Security, Snyk, SafeDep
- Incident ID: npm-2026-05-19-antv-mini-shai-hulud

## Affected packages (298)

Only the exact versions listed were named by the source advisories. Other versions are not implicated.

| Package | Ecosystem | Compromised versions |
|---|---|---|
| [@antv/a8](https://dependencywatch.io/package/npm/@antv/a8) | npm | 0.1.1, 0.2.1 |
| [@antv/adjust](https://dependencywatch.io/package/npm/@antv/adjust) | npm | 0.3.5, 0.4.5 |
| [@antv/algorithm](https://dependencywatch.io/package/npm/@antv/algorithm) | npm | 0.2.26, 0.3.26 |
| [@antv/async-hook](https://dependencywatch.io/package/npm/@antv/async-hook) | npm | 2.3.9, 2.4.9 |
| [@antv/attr](https://dependencywatch.io/package/npm/@antv/attr) | npm | 0.4.5, 0.5.5 |
| [@antv/ava](https://dependencywatch.io/package/npm/@antv/ava) | npm | 3.5.1, 3.6.1 |
| [@antv/ava-react](https://dependencywatch.io/package/npm/@antv/ava-react) | npm | 3.4.2, 3.5.2 |
| [@antv/awards](https://dependencywatch.io/package/npm/@antv/awards) | npm | 0.1.9, 0.2.9 |
| [@antv/calendar-heatmap](https://dependencywatch.io/package/npm/@antv/calendar-heatmap) | npm | 1.2.2, 1.3.2 |
| [@antv/chart-linter](https://dependencywatch.io/package/npm/@antv/chart-linter) | npm | 1.2.6, 1.3.6 |
| [@antv/chart-node-g6](https://dependencywatch.io/package/npm/@antv/chart-node-g6) | npm | 0.1.4, 0.2.4 |
| [@antv/chart-visualization-skills](https://dependencywatch.io/package/npm/@antv/chart-visualization-skills) | npm | 0.2.3, 0.3.3 |
| [@antv/ckb](https://dependencywatch.io/package/npm/@antv/ckb) | npm | 2.1.4, 2.2.4 |
| [@antv/color-schema](https://dependencywatch.io/package/npm/@antv/color-schema) | npm | 0.3.3, 0.4.3 |
| [@antv/color-util](https://dependencywatch.io/package/npm/@antv/color-util) | npm | 2.1.6, 2.2.6 |
| [@antv/component](https://dependencywatch.io/package/npm/@antv/component) | npm | 2.2.11, 2.3.11 |
| [@antv/coord](https://dependencywatch.io/package/npm/@antv/coord) | npm | 0.5.7, 0.6.7 |
| [@antv/d3-color](https://dependencywatch.io/package/npm/@antv/d3-color) | npm | 1.1.0, 1.2.0 |
| [@antv/d3-interpolate](https://dependencywatch.io/package/npm/@antv/d3-interpolate) | npm | 1.1.3, 1.2.3 |
| [@antv/data-samples](https://dependencywatch.io/package/npm/@antv/data-samples) | npm | 1.1.1, 1.2.1 |
| [@antv/data-set](https://dependencywatch.io/package/npm/@antv/data-set) | npm | 0.12.8, 0.13.8 |
| [@antv/data-wizard](https://dependencywatch.io/package/npm/@antv/data-wizard) | npm | 2.1.4, 2.2.4 |
| [@antv/dipper-component](https://dependencywatch.io/package/npm/@antv/dipper-component) | npm | 0.1.4, 0.2.4 |
| [@antv/dipper-hooks](https://dependencywatch.io/package/npm/@antv/dipper-hooks) | npm | 0.3.1, 0.4.1 |
| [@antv/dipper-map](https://dependencywatch.io/package/npm/@antv/dipper-map) | npm | 1.1.10, 1.2.10 |
| [@antv/dom-util](https://dependencywatch.io/package/npm/@antv/dom-util) | npm | 2.1.4, 2.2.4 |
| [@antv/dumi-theme-antv](https://dependencywatch.io/package/npm/@antv/dumi-theme-antv) | npm | 0.9.4, 0.10.4 |
| [@antv/dw-analyzer](https://dependencywatch.io/package/npm/@antv/dw-analyzer) | npm | 1.2.5, 1.3.5 |
| [@antv/dw-random](https://dependencywatch.io/package/npm/@antv/dw-random) | npm | 1.2.7, 1.3.7 |
| [@antv/dw-transform](https://dependencywatch.io/package/npm/@antv/dw-transform) | npm | 1.2.7, 1.3.7 |
| [@antv/dw-util](https://dependencywatch.io/package/npm/@antv/dw-util) | npm | 1.2.4, 1.3.4 |
| [@antv/event-emitter](https://dependencywatch.io/package/npm/@antv/event-emitter) | npm | 0.2.3, 0.3.3 |
| [@antv/expr](https://dependencywatch.io/package/npm/@antv/expr) | npm | 1.1.2, 1.2.2 |
| [@antv/f-charts](https://dependencywatch.io/package/npm/@antv/f-charts) | npm | 0.1.0, 0.2.0 |
| [@antv/f-engine](https://dependencywatch.io/package/npm/@antv/f-engine) | npm | 1.11.0, 1.12.0 |
| [@antv/f-lottie](https://dependencywatch.io/package/npm/@antv/f-lottie) | npm | 1.11.0, 1.12.0 |
| [@antv/f-my](https://dependencywatch.io/package/npm/@antv/f-my) | npm | 1.11.0, 1.12.0 |
| [@antv/f-react](https://dependencywatch.io/package/npm/@antv/f-react) | npm | 1.11.0, 1.12.0 |
| [@antv/f-test-utils](https://dependencywatch.io/package/npm/@antv/f-test-utils) | npm | 1.1.9, 1.2.9 |
| [@antv/f-vue](https://dependencywatch.io/package/npm/@antv/f-vue) | npm | 1.11.0, 1.12.0 |
| [@antv/f-wx](https://dependencywatch.io/package/npm/@antv/f-wx) | npm | 1.11.0, 1.12.0 |
| [@antv/f2](https://dependencywatch.io/package/npm/@antv/f2) | npm | 5.15.0, 5.16.0 |
| [@antv/f2-algorithm](https://dependencywatch.io/package/npm/@antv/f2-algorithm) | npm | 5.8.0, 5.9.0 |
| [@antv/f2-canvas](https://dependencywatch.io/package/npm/@antv/f2-canvas) | npm | 1.1.5, 1.2.5 |
| [@antv/f2-context](https://dependencywatch.io/package/npm/@antv/f2-context) | npm | 0.1.1, 0.2.1 |
| [@antv/f2-graphic](https://dependencywatch.io/package/npm/@antv/f2-graphic) | npm | 0.1.16, 0.2.16 |
| [@antv/f2-my](https://dependencywatch.io/package/npm/@antv/f2-my) | npm | 4.1.52, 4.2.52 |
| [@antv/f2-react](https://dependencywatch.io/package/npm/@antv/f2-react) | npm | 5.15.0, 5.16.0 |
| [@antv/f2-site](https://dependencywatch.io/package/npm/@antv/f2-site) | npm | 4.1.42, 4.2.42 |
| [@antv/f2-vue](https://dependencywatch.io/package/npm/@antv/f2-vue) | npm | 4.1.33, 4.2.33 |
| [@antv/f2-wordcloud](https://dependencywatch.io/package/npm/@antv/f2-wordcloud) | npm | 5.15.0, 5.16.0 |
| [@antv/f2-wx](https://dependencywatch.io/package/npm/@antv/f2-wx) | npm | 4.1.51, 4.2.51 |
| [@antv/f6](https://dependencywatch.io/package/npm/@antv/f6) | npm | 0.1.19, 0.2.19 |
| [@antv/f6-alipay](https://dependencywatch.io/package/npm/@antv/f6-alipay) | npm | 0.1.7, 0.2.7 |
| [@antv/f6-core](https://dependencywatch.io/package/npm/@antv/f6-core) | npm | 0.1.2, 0.2.2 |
| [@antv/f6-element](https://dependencywatch.io/package/npm/@antv/f6-element) | npm | 0.1.1, 0.2.1 |
| [@antv/f6-hammerjs](https://dependencywatch.io/package/npm/@antv/f6-hammerjs) | npm | 0.1.2, 0.2.2 |
| [@antv/f6-plugin](https://dependencywatch.io/package/npm/@antv/f6-plugin) | npm | 1.1.6, 1.2.6 |
| [@antv/f6-ui](https://dependencywatch.io/package/npm/@antv/f6-ui) | npm | 1.1.3, 1.2.3 |
| [@antv/f6-wx](https://dependencywatch.io/package/npm/@antv/f6-wx) | npm | 0.1.7, 0.2.7 |
| [@antv/g](https://dependencywatch.io/package/npm/@antv/g) | npm | 6.4.1, 6.5.1 |
| [@antv/g-base](https://dependencywatch.io/package/npm/@antv/g-base) | npm | 0.6.16, 0.7.16 |
| [@antv/g-camera-api](https://dependencywatch.io/package/npm/@antv/g-camera-api) | npm | 2.1.45, 2.2.45 |
| [@antv/g-canvas](https://dependencywatch.io/package/npm/@antv/g-canvas) | npm | 2.3.0, 2.4.0 |
| [@antv/g-canvaskit](https://dependencywatch.io/package/npm/@antv/g-canvaskit) | npm | 1.2.1, 1.3.1 |
| [@antv/g-compat](https://dependencywatch.io/package/npm/@antv/g-compat) | npm | 1.1.11, 1.2.11 |
| [@antv/g-components](https://dependencywatch.io/package/npm/@antv/g-components) | npm | 2.1.42, 2.2.42 |
| [@antv/g-css-layout-api](https://dependencywatch.io/package/npm/@antv/g-css-layout-api) | npm | 1.1.38, 1.2.38 |
| [@antv/g-css-typed-om-api](https://dependencywatch.io/package/npm/@antv/g-css-typed-om-api) | npm | 1.1.38, 1.2.38 |
| [@antv/g-device-api](https://dependencywatch.io/package/npm/@antv/g-device-api) | npm | 1.7.13, 1.8.13 |
| [@antv/g-dom-mutation-observer-api](https://dependencywatch.io/package/npm/@antv/g-dom-mutation-observer-api) | npm | 2.1.42, 2.2.42 |
| [@antv/g-gesture](https://dependencywatch.io/package/npm/@antv/g-gesture) | npm | 3.1.42, 3.2.42 |
| [@antv/g-image-exporter](https://dependencywatch.io/package/npm/@antv/g-image-exporter) | npm | 1.1.42, 1.2.42 |
| [@antv/g-layout-blocklike](https://dependencywatch.io/package/npm/@antv/g-layout-blocklike) | npm | 1.8.49, 1.9.49 |
| [@antv/g-lite](https://dependencywatch.io/package/npm/@antv/g-lite) | npm | 2.8.0, 2.9.0 |
| [@antv/g-lottie-player](https://dependencywatch.io/package/npm/@antv/g-lottie-player) | npm | 1.2.1, 1.3.1 |
| [@antv/g-math](https://dependencywatch.io/package/npm/@antv/g-math) | npm | 3.2.0, 3.3.0 |
| [@antv/g-mobile](https://dependencywatch.io/package/npm/@antv/g-mobile) | npm | 1.2.5, 1.3.5 |
| [@antv/g-mobile-canvas](https://dependencywatch.io/package/npm/@antv/g-mobile-canvas) | npm | 1.2.1, 1.3.1 |
| [@antv/g-mobile-canvas-element](https://dependencywatch.io/package/npm/@antv/g-mobile-canvas-element) | npm | 1.1.42, 1.2.42 |
| [@antv/g-mobile-svg](https://dependencywatch.io/package/npm/@antv/g-mobile-svg) | npm | 1.2.1, 1.3.1 |
| [@antv/g-mobile-webgl](https://dependencywatch.io/package/npm/@antv/g-mobile-webgl) | npm | 1.2.1, 1.3.1 |
| [@antv/g-pattern](https://dependencywatch.io/package/npm/@antv/g-pattern) | npm | 2.1.42, 2.2.42 |
| [@antv/g-perf](https://dependencywatch.io/package/npm/@antv/g-perf) | npm | 1.1.0, 1.2.0 |
| [@antv/g-plugin-3d](https://dependencywatch.io/package/npm/@antv/g-plugin-3d) | npm | 2.2.1, 2.3.1 |
| [@antv/g-plugin-a11y](https://dependencywatch.io/package/npm/@antv/g-plugin-a11y) | npm | 1.5.1, 1.6.1 |
| [@antv/g-plugin-annotation](https://dependencywatch.io/package/npm/@antv/g-plugin-annotation) | npm | 1.3.0, 1.4.0 |
| [@antv/g-plugin-box2d](https://dependencywatch.io/package/npm/@antv/g-plugin-box2d) | npm | 2.2.1, 2.3.1 |
| [@antv/g-plugin-canvas-path-generator](https://dependencywatch.io/package/npm/@antv/g-plugin-canvas-path-generator) | npm | 2.2.26, 2.3.26 |
| [@antv/g-plugin-canvas-picker](https://dependencywatch.io/package/npm/@antv/g-plugin-canvas-picker) | npm | 2.4.1, 2.5.1 |
| [@antv/g-plugin-canvas-renderer](https://dependencywatch.io/package/npm/@antv/g-plugin-canvas-renderer) | npm | 2.6.1, 2.7.1 |
| [@antv/g-plugin-canvaskit-renderer](https://dependencywatch.io/package/npm/@antv/g-plugin-canvaskit-renderer) | npm | 2.4.1, 2.5.1 |
| [@antv/g-plugin-control](https://dependencywatch.io/package/npm/@antv/g-plugin-control) | npm | 2.2.1, 2.3.1 |
| [@antv/g-plugin-css-select](https://dependencywatch.io/package/npm/@antv/g-plugin-css-select) | npm | 2.2.1, 2.3.1 |
| [@antv/g-plugin-device-renderer](https://dependencywatch.io/package/npm/@antv/g-plugin-device-renderer) | npm | 2.7.1, 2.8.1 |
| [@antv/g-plugin-dom-interaction](https://dependencywatch.io/package/npm/@antv/g-plugin-dom-interaction) | npm | 2.2.31, 2.3.31 |
| [@antv/g-plugin-dragndrop](https://dependencywatch.io/package/npm/@antv/g-plugin-dragndrop) | npm | 2.2.1, 2.3.1 |
| [@antv/g-plugin-gesture](https://dependencywatch.io/package/npm/@antv/g-plugin-gesture) | npm | 2.2.1, 2.3.1 |
| [@antv/g-plugin-gpgpu](https://dependencywatch.io/package/npm/@antv/g-plugin-gpgpu) | npm | 1.10.20, 1.11.20 |
| [@antv/g-plugin-html-renderer](https://dependencywatch.io/package/npm/@antv/g-plugin-html-renderer) | npm | 2.4.1, 2.5.1 |
| [@antv/g-plugin-image-loader](https://dependencywatch.io/package/npm/@antv/g-plugin-image-loader) | npm | 2.4.1, 2.5.1 |
| [@antv/g-plugin-matterjs](https://dependencywatch.io/package/npm/@antv/g-plugin-matterjs) | npm | 2.2.1, 2.3.1 |
| [@antv/g-plugin-mobile-interaction](https://dependencywatch.io/package/npm/@antv/g-plugin-mobile-interaction) | npm | 1.1.42, 1.2.42 |
| [@antv/g-plugin-physx](https://dependencywatch.io/package/npm/@antv/g-plugin-physx) | npm | 2.2.1, 2.3.1 |
| [@antv/g-plugin-rough-canvas-renderer](https://dependencywatch.io/package/npm/@antv/g-plugin-rough-canvas-renderer) | npm | 2.2.1, 2.3.1 |
| [@antv/g-plugin-rough-svg-renderer](https://dependencywatch.io/package/npm/@antv/g-plugin-rough-svg-renderer) | npm | 2.2.1, 2.3.1 |
| [@antv/g-plugin-svg-picker](https://dependencywatch.io/package/npm/@antv/g-plugin-svg-picker) | npm | 2.1.46, 2.2.46 |
| [@antv/g-plugin-svg-renderer](https://dependencywatch.io/package/npm/@antv/g-plugin-svg-renderer) | npm | 2.5.1, 2.6.1 |
| [@antv/g-plugin-webgl-device](https://dependencywatch.io/package/npm/@antv/g-plugin-webgl-device) | npm | 1.10.17, 1.11.17 |
| [@antv/g-plugin-webgl-renderer](https://dependencywatch.io/package/npm/@antv/g-plugin-webgl-renderer) | npm | 1.1.26, 1.2.26 |
| [@antv/g-plugin-webgpu-device](https://dependencywatch.io/package/npm/@antv/g-plugin-webgpu-device) | npm | 1.10.17, 1.11.17 |
| [@antv/g-plugin-yoga](https://dependencywatch.io/package/npm/@antv/g-plugin-yoga) | npm | 2.4.1, 2.5.1 |
| [@antv/g-plugin-zdog-canvas-renderer](https://dependencywatch.io/package/npm/@antv/g-plugin-zdog-canvas-renderer) | npm | 2.2.1, 2.3.1 |
| [@antv/g-plugin-zdog-svg-renderer](https://dependencywatch.io/package/npm/@antv/g-plugin-zdog-svg-renderer) | npm | 2.2.1, 2.3.1 |
| [@antv/g-shader-components](https://dependencywatch.io/package/npm/@antv/g-shader-components) | npm | 2.1.0, 2.2.0 |
| [@antv/g-svg](https://dependencywatch.io/package/npm/@antv/g-svg) | npm | 2.2.1, 2.3.1 |
| [@antv/g-web-animations-api](https://dependencywatch.io/package/npm/@antv/g-web-animations-api) | npm | 2.2.32, 2.3.32 |
| [@antv/g-web-components](https://dependencywatch.io/package/npm/@antv/g-web-components) | npm | 2.2.1, 2.3.1 |
| [@antv/g-webgl](https://dependencywatch.io/package/npm/@antv/g-webgl) | npm | 2.2.1, 2.3.1 |
| [@antv/g-webgl-compute](https://dependencywatch.io/package/npm/@antv/g-webgl-compute) | npm | 0.1.1, 0.2.1 |
| [@antv/g-webgpu](https://dependencywatch.io/package/npm/@antv/g-webgpu) | npm | 2.2.1, 2.3.1 |
| [@antv/g-webgpu-compiler](https://dependencywatch.io/package/npm/@antv/g-webgpu-compiler) | npm | 0.8.2, 0.9.2 |
| [@antv/g-webgpu-core](https://dependencywatch.io/package/npm/@antv/g-webgpu-core) | npm | 0.8.2, 0.9.2 |
| [@antv/g-webgpu-engine](https://dependencywatch.io/package/npm/@antv/g-webgpu-engine) | npm | 0.8.2, 0.9.2 |
| [@antv/g-webgpu-raytracer](https://dependencywatch.io/package/npm/@antv/g-webgpu-raytracer) | npm | 0.6.1, 0.7.1 |
| [@antv/g-webgpu-unitchart](https://dependencywatch.io/package/npm/@antv/g-webgpu-unitchart) | npm | 0.6.1, 0.7.1 |
| [@antv/g2](https://dependencywatch.io/package/npm/@antv/g2) | npm | 5.5.8, 5.6.8 |
| [@antv/g2-brush](https://dependencywatch.io/package/npm/@antv/g2-brush) | npm | 0.1.2, 0.2.2 |
| [@antv/g2-extension-3d](https://dependencywatch.io/package/npm/@antv/g2-extension-3d) | npm | 0.3.0, 0.4.0 |
| [@antv/g2-extension-ava](https://dependencywatch.io/package/npm/@antv/g2-extension-ava) | npm | 0.3.0, 0.4.0 |
| [@antv/g2-extension-plot](https://dependencywatch.io/package/npm/@antv/g2-extension-plot) | npm | 0.3.2, 0.4.2 |
| [@antv/g2-plugin-slider](https://dependencywatch.io/package/npm/@antv/g2-plugin-slider) | npm | 2.2.1, 2.3.1 |
| [@antv/g2-ssr](https://dependencywatch.io/package/npm/@antv/g2-ssr) | npm | 0.3.0, 0.4.0 |
| [@antv/g2plot](https://dependencywatch.io/package/npm/@antv/g2plot) | npm | 2.5.35, 2.6.35 |
| [@antv/g2plot-schemas](https://dependencywatch.io/package/npm/@antv/g2plot-schemas) | npm | 1.3.2, 1.4.2 |
| [@antv/g6](https://dependencywatch.io/package/npm/@antv/g6) | npm | 5.2.1, 5.3.1 |
| [@antv/g6-alipay](https://dependencywatch.io/package/npm/@antv/g6-alipay) | npm | 0.1.1, 0.2.1 |
| [@antv/g6-cli](https://dependencywatch.io/package/npm/@antv/g6-cli) | npm | 0.1.4, 0.2.4 |
| [@antv/g6-core](https://dependencywatch.io/package/npm/@antv/g6-core) | npm | 0.9.24, 0.10.24 |
| [@antv/g6-editor](https://dependencywatch.io/package/npm/@antv/g6-editor) | npm | 1.3.0, 1.4.0 |
| [@antv/g6-element](https://dependencywatch.io/package/npm/@antv/g6-element) | npm | 0.9.25, 0.10.25 |
| [@antv/g6-extension-3d](https://dependencywatch.io/package/npm/@antv/g6-extension-3d) | npm | 0.2.23, 0.3.23 |
| [@antv/g6-extension-react](https://dependencywatch.io/package/npm/@antv/g6-extension-react) | npm | 0.3.7, 0.4.7 |
| [@antv/g6-mobile](https://dependencywatch.io/package/npm/@antv/g6-mobile) | npm | 0.2.2, 0.3.2 |
| [@antv/g6-pc](https://dependencywatch.io/package/npm/@antv/g6-pc) | npm | 0.9.25, 0.10.25 |
| [@antv/g6-plugin](https://dependencywatch.io/package/npm/@antv/g6-plugin) | npm | 0.9.25, 0.10.25 |
| [@antv/g6-plugin-map-view](https://dependencywatch.io/package/npm/@antv/g6-plugin-map-view) | npm | 0.1.4, 0.2.4 |
| [@antv/g6-plugins](https://dependencywatch.io/package/npm/@antv/g6-plugins) | npm | 1.1.9, 1.2.9 |
| [@antv/g6-react-node](https://dependencywatch.io/package/npm/@antv/g6-react-node) | npm | 1.5.8, 1.6.8 |
| [@antv/g6-ssr](https://dependencywatch.io/package/npm/@antv/g6-ssr) | npm | 0.2.1, 0.3.1 |
| [@antv/g6-wx](https://dependencywatch.io/package/npm/@antv/g6-wx) | npm | 0.1.1, 0.2.1 |
| [@antv/gatsby-theme](https://dependencywatch.io/package/npm/@antv/gatsby-theme) | npm | 0.2.0, 0.3.0 |
| [@antv/geo-coord](https://dependencywatch.io/package/npm/@antv/geo-coord) | npm | 1.1.8, 1.2.8 |
| [@antv/gi-assets-advance](https://dependencywatch.io/package/npm/@antv/gi-assets-advance) | npm | 2.6.22, 2.7.22 |
| [@antv/gi-assets-algorithm](https://dependencywatch.io/package/npm/@antv/gi-assets-algorithm) | npm | 2.4.19, 2.5.19 |
| [@antv/gi-assets-basic](https://dependencywatch.io/package/npm/@antv/gi-assets-basic) | npm | 2.5.40, 2.6.40 |
| [@antv/gi-assets-galaxybase](https://dependencywatch.io/package/npm/@antv/gi-assets-galaxybase) | npm | 1.3.15, 1.4.15 |
| [@antv/gi-assets-graphscope](https://dependencywatch.io/package/npm/@antv/gi-assets-graphscope) | npm | 2.2.15, 2.3.15 |
| [@antv/gi-assets-hugegraph](https://dependencywatch.io/package/npm/@antv/gi-assets-hugegraph) | npm | 1.2.15, 1.3.15 |
| [@antv/gi-assets-janusgraph](https://dependencywatch.io/package/npm/@antv/gi-assets-janusgraph) | npm | 1.2.15, 1.3.15 |
| [@antv/gi-assets-neo4j](https://dependencywatch.io/package/npm/@antv/gi-assets-neo4j) | npm | 2.2.15, 2.3.15 |
| [@antv/gi-assets-scene](https://dependencywatch.io/package/npm/@antv/gi-assets-scene) | npm | 2.3.21, 2.4.21 |
| [@antv/gi-assets-tugraph](https://dependencywatch.io/package/npm/@antv/gi-assets-tugraph) | npm | 2.2.15, 2.3.15 |
| [@antv/gi-assets-tugraph-analytics](https://dependencywatch.io/package/npm/@antv/gi-assets-tugraph-analytics) | npm | 0.3.15, 0.4.15 |
| [@antv/gi-assets-xlab](https://dependencywatch.io/package/npm/@antv/gi-assets-xlab) | npm | 0.2.30, 0.3.30 |
| [@antv/gi-cli](https://dependencywatch.io/package/npm/@antv/gi-cli) | npm | 1.3.11, 1.4.11 |
| [@antv/gi-common-components](https://dependencywatch.io/package/npm/@antv/gi-common-components) | npm | 1.4.16, 1.5.16 |
| [@antv/gi-mock-data](https://dependencywatch.io/package/npm/@antv/gi-mock-data) | npm | 1.1.5, 1.2.5 |
| [@antv/gi-public-data](https://dependencywatch.io/package/npm/@antv/gi-public-data) | npm | 1.1.1, 1.2.1 |
| [@antv/gi-sdk](https://dependencywatch.io/package/npm/@antv/gi-sdk) | npm | 3.1.0, 3.2.0 |
| [@antv/gi-sdk-app](https://dependencywatch.io/package/npm/@antv/gi-sdk-app) | npm | 1.3.10, 1.4.10 |
| [@antv/gi-theme-antd](https://dependencywatch.io/package/npm/@antv/gi-theme-antd) | npm | 0.7.11, 0.8.11 |
| [@antv/github-config-cli](https://dependencywatch.io/package/npm/@antv/github-config-cli) | npm | 0.2.0, 0.3.0 |
| [@antv/gl-matrix](https://dependencywatch.io/package/npm/@antv/gl-matrix) | npm | 2.8.1, 2.9.1 |
| [@antv/gpt-vis](https://dependencywatch.io/package/npm/@antv/gpt-vis) | npm | 1.1.0, 1.2.0 |
| [@antv/gpt-vis-ssr](https://dependencywatch.io/package/npm/@antv/gpt-vis-ssr) | npm | 0.4.7, 0.5.7 |
| [@antv/graphin](https://dependencywatch.io/package/npm/@antv/graphin) | npm | 3.1.5, 3.2.5 |
| [@antv/graphin-components](https://dependencywatch.io/package/npm/@antv/graphin-components) | npm | 2.5.1, 2.6.1 |
| [@antv/graphin-graphscope](https://dependencywatch.io/package/npm/@antv/graphin-graphscope) | npm | 1.1.5, 1.2.5 |
| [@antv/graphin-icons](https://dependencywatch.io/package/npm/@antv/graphin-icons) | npm | 1.1.0, 1.2.0 |
| [@antv/graphlib](https://dependencywatch.io/package/npm/@antv/graphlib) | npm | 2.1.4, 2.2.4 |
| [@antv/hierarchy](https://dependencywatch.io/package/npm/@antv/hierarchy) | npm | 0.8.1, 0.9.1 |
| [@antv/infographic](https://dependencywatch.io/package/npm/@antv/infographic) | npm | 0.3.19, 0.4.19 |
| [@antv/interaction](https://dependencywatch.io/package/npm/@antv/interaction) | npm | 0.2.5, 0.3.5 |
| [@antv/istanbul](https://dependencywatch.io/package/npm/@antv/istanbul) | npm | 0.1.0, 0.2.0 |
| [@antv/knowledge](https://dependencywatch.io/package/npm/@antv/knowledge) | npm | 1.2.4, 1.3.4 |
| [@antv/l7](https://dependencywatch.io/package/npm/@antv/l7) | npm | 2.26.10, 2.27.10 |
| [@antv/l7-component](https://dependencywatch.io/package/npm/@antv/l7-component) | npm | 2.26.10, 2.27.10 |
| [@antv/l7-composite-layers](https://dependencywatch.io/package/npm/@antv/l7-composite-layers) | npm | 0.18.1, 0.19.1 |
| [@antv/l7-core](https://dependencywatch.io/package/npm/@antv/l7-core) | npm | 2.26.10, 2.27.10 |
| [@antv/l7-district](https://dependencywatch.io/package/npm/@antv/l7-district) | npm | 2.4.12, 2.5.12 |
| [@antv/l7-draw](https://dependencywatch.io/package/npm/@antv/l7-draw) | npm | 3.2.5, 3.3.5 |
| [@antv/l7-editor](https://dependencywatch.io/package/npm/@antv/l7-editor) | npm | 1.2.13, 1.3.13 |
| [@antv/l7-extension-g-layer](https://dependencywatch.io/package/npm/@antv/l7-extension-g-layer) | npm | 1.1.0, 1.2.0 |
| [@antv/l7-layers](https://dependencywatch.io/package/npm/@antv/l7-layers) | npm | 2.26.10, 2.27.10 |
| [@antv/l7-leaflet](https://dependencywatch.io/package/npm/@antv/l7-leaflet) | npm | 1.1.2, 1.2.2 |
| [@antv/l7-map](https://dependencywatch.io/package/npm/@antv/l7-map) | npm | 2.26.10, 2.27.10 |
| [@antv/l7-mapkit](https://dependencywatch.io/package/npm/@antv/l7-mapkit) | npm | 0.6.0, 0.7.0 |
| [@antv/l7-maps](https://dependencywatch.io/package/npm/@antv/l7-maps) | npm | 2.26.10, 2.27.10 |
| [@antv/l7-mini](https://dependencywatch.io/package/npm/@antv/l7-mini) | npm | 2.21.8, 2.22.8 |
| [@antv/l7-pass](https://dependencywatch.io/package/npm/@antv/l7-pass) | npm | 1.1.0, 1.2.0 |
| [@antv/l7-react](https://dependencywatch.io/package/npm/@antv/l7-react) | npm | 2.5.3, 2.6.3 |
| [@antv/l7-renderer](https://dependencywatch.io/package/npm/@antv/l7-renderer) | npm | 2.26.10, 2.27.10 |
| [@antv/l7-scene](https://dependencywatch.io/package/npm/@antv/l7-scene) | npm | 2.26.10, 2.27.10 |
| [@antv/l7-source](https://dependencywatch.io/package/npm/@antv/l7-source) | npm | 2.26.10, 2.27.10 |
| [@antv/l7-three](https://dependencywatch.io/package/npm/@antv/l7-three) | npm | 2.26.10, 2.27.10 |
| [@antv/l7-utils](https://dependencywatch.io/package/npm/@antv/l7-utils) | npm | 2.26.10, 2.27.10 |
| [@antv/l7plot](https://dependencywatch.io/package/npm/@antv/l7plot) | npm | 0.6.11, 0.7.11 |
| [@antv/l7plot-component](https://dependencywatch.io/package/npm/@antv/l7plot-component) | npm | 0.1.11, 0.2.11 |
| [@antv/larkmap](https://dependencywatch.io/package/npm/@antv/larkmap) | npm | 1.6.1, 1.7.1 |
| [@antv/layout-gpu](https://dependencywatch.io/package/npm/@antv/layout-gpu) | npm | 1.2.7, 1.3.7 |
| [@antv/layout-wasm](https://dependencywatch.io/package/npm/@antv/layout-wasm) | npm | 1.5.2, 1.6.2 |
| [@antv/li-aiearth-assets](https://dependencywatch.io/package/npm/@antv/li-aiearth-assets) | npm | 0.5.7, 0.6.7 |
| [@antv/li-analysis-assets](https://dependencywatch.io/package/npm/@antv/li-analysis-assets) | npm | 1.10.1, 1.11.1 |
| [@antv/li-core-assets](https://dependencywatch.io/package/npm/@antv/li-core-assets) | npm | 1.4.7, 1.5.7 |
| [@antv/li-editor](https://dependencywatch.io/package/npm/@antv/li-editor) | npm | 1.7.1, 1.8.1 |
| [@antv/li-p2](https://dependencywatch.io/package/npm/@antv/li-p2) | npm | 1.9.2, 1.10.2 |
| [@antv/li-sam-assets](https://dependencywatch.io/package/npm/@antv/li-sam-assets) | npm | 0.2.4, 0.3.4 |
| [@antv/li-sdk](https://dependencywatch.io/package/npm/@antv/li-sdk) | npm | 1.6.1, 1.7.1 |
| [@antv/lite-insight](https://dependencywatch.io/package/npm/@antv/lite-insight) | npm | 2.2.1, 2.3.1 |
| [@antv/matrix-util](https://dependencywatch.io/package/npm/@antv/matrix-util) | npm | 3.1.4, 3.2.4 |
| [@antv/mcp-server-antv](https://dependencywatch.io/package/npm/@antv/mcp-server-antv) | npm | 0.2.8, 0.3.8 |
| [@antv/mcp-server-chart](https://dependencywatch.io/package/npm/@antv/mcp-server-chart) | npm | 0.10.10, 0.11.10 |
| [@antv/my-f2](https://dependencywatch.io/package/npm/@antv/my-f2) | npm | 2.2.7, 2.3.7 |
| [@antv/my-f2-pc](https://dependencywatch.io/package/npm/@antv/my-f2-pc) | npm | 0.2.1, 0.3.1 |
| [@antv/narrative-text-editor](https://dependencywatch.io/package/npm/@antv/narrative-text-editor) | npm | 0.3.20, 0.4.20 |
| [@antv/narrative-text-schema](https://dependencywatch.io/package/npm/@antv/narrative-text-schema) | npm | 0.4.7, 0.5.7 |
| [@antv/narrative-text-vis](https://dependencywatch.io/package/npm/@antv/narrative-text-vis) | npm | 0.4.16, 0.5.16 |
| [@antv/path-util](https://dependencywatch.io/package/npm/@antv/path-util) | npm | 3.1.1, 3.2.1 |
| [@antv/react-g](https://dependencywatch.io/package/npm/@antv/react-g) | npm | 2.2.1, 2.3.1 |
| [@antv/s2](https://dependencywatch.io/package/npm/@antv/s2) | npm | 2.8.1, 2.9.1 |
| [@antv/s2-react](https://dependencywatch.io/package/npm/@antv/s2-react) | npm | 2.4.1, 2.5.1 |
| [@antv/s2-react-components](https://dependencywatch.io/package/npm/@antv/s2-react-components) | npm | 2.2.2, 2.3.2 |
| [@antv/s2-ssr](https://dependencywatch.io/package/npm/@antv/s2-ssr) | npm | 0.2.1, 0.3.1 |
| [@antv/s2-vue](https://dependencywatch.io/package/npm/@antv/s2-vue) | npm | 2.3.0, 2.4.0 |
| [@antv/sam](https://dependencywatch.io/package/npm/@antv/sam) | npm | 0.3.0, 0.4.0 |
| [@antv/scale](https://dependencywatch.io/package/npm/@antv/scale) | npm | 0.6.2, 0.7.2 |
| [@antv/semantic-release-pnpm](https://dependencywatch.io/package/npm/@antv/semantic-release-pnpm) | npm | 1.1.4, 1.2.4 |
| [@antv/smart-color](https://dependencywatch.io/package/npm/@antv/smart-color) | npm | 0.3.1, 0.4.1 |
| [@antv/stat](https://dependencywatch.io/package/npm/@antv/stat) | npm | 0.1.2, 0.2.2 |
| [@antv/t8](https://dependencywatch.io/package/npm/@antv/t8) | npm | 0.4.0, 0.5.0 |
| [@antv/thumbnails](https://dependencywatch.io/package/npm/@antv/thumbnails) | npm | 2.1.0, 2.2.0 |
| [@antv/thumbnails-component](https://dependencywatch.io/package/npm/@antv/thumbnails-component) | npm | 2.1.0, 2.2.0 |
| [@antv/torch](https://dependencywatch.io/package/npm/@antv/torch) | npm | 1.1.6, 1.2.6 |
| [@antv/translator](https://dependencywatch.io/package/npm/@antv/translator) | npm | 1.1.1, 1.2.1 |
| [@antv/util](https://dependencywatch.io/package/npm/@antv/util) | npm | 3.4.11, 3.5.11 |
| [@antv/vendor](https://dependencywatch.io/package/npm/@antv/vendor) | npm | 1.1.11, 1.2.11 |
| [@antv/vis-predict-engine](https://dependencywatch.io/package/npm/@antv/vis-predict-engine) | npm | 0.2.1, 0.3.1 |
| [@antv/webgpu-graph](https://dependencywatch.io/package/npm/@antv/webgpu-graph) | npm | 1.1.0, 1.2.0 |
| [@antv/word-scale-chart](https://dependencywatch.io/package/npm/@antv/word-scale-chart) | npm | 0.4.4, 0.5.4 |
| [@antv/wx-f2](https://dependencywatch.io/package/npm/@antv/wx-f2) | npm | 2.2.1, 2.3.1 |
| [@antv/x6](https://dependencywatch.io/package/npm/@antv/x6) | npm | 3.2.7, 3.3.7 |
| [@antv/x6-angular-shape](https://dependencywatch.io/package/npm/@antv/x6-angular-shape) | npm | 3.1.1, 3.2.1 |
| [@antv/x6-components](https://dependencywatch.io/package/npm/@antv/x6-components) | npm | 0.11.7, 0.12.7 |
| [@antv/x6-react](https://dependencywatch.io/package/npm/@antv/x6-react) | npm | 0.2.26, 0.3.26 |
| [@antv/x6-react-shape](https://dependencywatch.io/package/npm/@antv/x6-react-shape) | npm | 3.1.1, 3.2.1 |
| [@antv/x6-vector](https://dependencywatch.io/package/npm/@antv/x6-vector) | npm | 1.5.2, 1.6.2 |
| [@antv/x6-vue-shape](https://dependencywatch.io/package/npm/@antv/x6-vue-shape) | npm | 3.1.2, 3.2.2 |
| [@antv/x6-vue3-shape](https://dependencywatch.io/package/npm/@antv/x6-vue3-shape) | npm | 1.1.0, 1.2.0 |
| [@antv/xflow](https://dependencywatch.io/package/npm/@antv/xflow) | npm | 2.2.13, 2.3.13 |
| [@antv/xflow-diff](https://dependencywatch.io/package/npm/@antv/xflow-diff) | npm | 1.1.0, 1.2.0 |
| [@lint-md/cli](https://dependencywatch.io/package/npm/@lint-md/cli) | npm | 2.1.0, 2.2.0 |
| [@lint-md/core](https://dependencywatch.io/package/npm/@lint-md/core) | npm | 2.1.0, 2.2.0 |
| [@lint-md/parser](https://dependencywatch.io/package/npm/@lint-md/parser) | npm | 0.1.14, 0.2.14 |
| [ai-figure](https://dependencywatch.io/package/npm/ai-figure) | npm | 0.5.0, 0.6.0 |
| [amapcn](https://dependencywatch.io/package/npm/amapcn) | npm | 0.2.2, 0.3.2 |
| [ast-plugin](https://dependencywatch.io/package/npm/ast-plugin) | npm | 0.1.7, 0.2.7 |
| [babel-plugin-version](https://dependencywatch.io/package/npm/babel-plugin-version) | npm | 0.3.3, 0.4.3 |
| [boring-avatars-vanilla](https://dependencywatch.io/package/npm/boring-avatars-vanilla) | npm | 1.1.2, 1.2.2 |
| [byte-parser](https://dependencywatch.io/package/npm/byte-parser) | npm | 1.1.0, 1.2.0 |
| [canvas-nest.js](https://dependencywatch.io/package/npm/canvas-nest.js) | npm | 2.1.4, 2.2.4 |
| [echarts-for-react](https://dependencywatch.io/package/npm/echarts-for-react) | npm | 3.0.7, 3.1.7, 3.2.7 |
| [filesize.js](https://dependencywatch.io/package/npm/filesize.js) | npm | 2.1.0, 2.2.0 |
| [fixed-round](https://dependencywatch.io/package/npm/fixed-round) | npm | 1.1.2, 1.2.2 |
| [gantt-for-react](https://dependencywatch.io/package/npm/gantt-for-react) | npm | 0.3.0, 0.4.0 |
| [jest-canvas-mock](https://dependencywatch.io/package/npm/jest-canvas-mock) | npm | 2.5.3, 2.6.3, 2.7.3 |
| [jest-date-mock](https://dependencywatch.io/package/npm/jest-date-mock) | npm | 1.0.11, 1.1.11, 1.2.11 |
| [jest-electron](https://dependencywatch.io/package/npm/jest-electron) | npm | 0.2.12, 0.3.12 |
| [jest-expect](https://dependencywatch.io/package/npm/jest-expect) | npm | 0.1.1, 0.2.1 |
| [jest-less-loader](https://dependencywatch.io/package/npm/jest-less-loader) | npm | 0.3.0, 0.4.0 |
| [jest-random-mock](https://dependencywatch.io/package/npm/jest-random-mock) | npm | 1.1.0, 1.2.0 |
| [jest-url-loader](https://dependencywatch.io/package/npm/jest-url-loader) | npm | 0.2.0, 0.3.0 |
| [limit-size](https://dependencywatch.io/package/npm/limit-size) | npm | 0.2.4, 0.3.4 |
| [lint-md](https://dependencywatch.io/package/npm/lint-md) | npm | 0.3.0, 0.4.0 |
| [lint-md-cli](https://dependencywatch.io/package/npm/lint-md-cli) | npm | 0.2.2, 0.3.2 |
| [mcp-echarts](https://dependencywatch.io/package/npm/mcp-echarts) | npm | 0.8.1, 0.9.1 |
| [mcp-mermaid](https://dependencywatch.io/package/npm/mcp-mermaid) | npm | 0.5.1, 0.6.1 |
| [miz](https://dependencywatch.io/package/npm/miz) | npm | 1.1.1, 1.2.1 |
| [onfire.js](https://dependencywatch.io/package/npm/onfire.js) | npm | 2.1.1, 2.2.1 |
| [react-adsense](https://dependencywatch.io/package/npm/react-adsense) | npm | 0.2.0, 0.3.0 |
| [relationship.js](https://dependencywatch.io/package/npm/relationship.js) | npm | 1.3.9, 1.4.9 |
| [ribbon.js](https://dependencywatch.io/package/npm/ribbon.js) | npm | 1.1.2 |
| [size-sensor](https://dependencywatch.io/package/npm/size-sensor) | npm | 1.0.4, 1.1.4, 1.2.4 |
| [slice.js](https://dependencywatch.io/package/npm/slice.js) | npm | 1.2.1, 1.3.1 |
| [timeago-react](https://dependencywatch.io/package/npm/timeago-react) | npm | 3.1.7, 3.2.7 |
| [timeago.js](https://dependencywatch.io/package/npm/timeago.js) | npm | 4.1.2, 4.2.2 |
| [word-width](https://dependencywatch.io/package/npm/word-width) | npm | 1.1.1, 1.2.1 |
| [xmorse](https://dependencywatch.io/package/npm/xmorse) | npm | 1.1.0, 1.2.0 |

## What happened

On 2026-05-19 between 01:39 and 02:06 UTC, the npm publisher account `atool` (an Alibaba / AntV co-maintainer) was compromised and used as the launch point for an automated burst of malicious releases. Socket telemetry continued seeing publishes through ~02:56 UTC; detections fired until ~03:09 UTC. After reconciliation across Socket, JFrog Security Research, Aikido, OX Security, Snyk, GBHackers, The Hacker News, BleepingComputer, and Microsoft Threat Intelligence, the final tally is **639 malicious versions across 323 unique packages** - up from the initial 598+/297+ estimate.

Affected scope spans the entire `@antv` visualization suite (`g-*`, `g2-*`, `g6-*`, `x6-*`, `l7-*`, `s2-*`, `f2-*`/`f-*`, `dipper-*`, `gi-assets-*`, `li-*`, and ~120 other `@antv/*` packages), `@lint-md/*`, smaller scopes (`@starmind/*`, `@openclaw-cn/*`), plus unscoped high-traffic packages including `echarts-for-react` (3.0.7 / 3.1.7 / 3.2.7 - 1.1M weekly downloads), `size-sensor` (1.0.4 / 1.1.4 / 1.2.4 - 4.2M monthly), `timeago.js` (4.1.2 / 4.2.2 - 1.15M monthly), `jest-canvas-mock`, `jest-date-mock`, `canvas-nest.js`, `mcp-echarts`, and `mcp-mermaid`. Combined estimated exposure on the unscoped packages alone exceeds 15M monthly downloads.

Each compromised release adds a `preinstall: bun run index.js` hook; **597 of 598 versions also inject an `optionalDependencies` entry pointing at imposter commits in `antvis/G2`** that deliver a second copy of the payload - a novel persistence vector that survives `npm rebuild` and resists lockfile-only audits. The payload is a 498KB obfuscated Bun script matching the Mini Shai-Hulud toolkit used in the SAP / `@cap-js` (April 2026), TanStack (May 11), and same-day `durabletask` PyPI compromises - same scanner architecture, same credential regex set, same obfuscation pattern. Attribution to **TeamPCP** is consistent across Socket, The Hacker News, SafeDep, and JFrog.

A novel capability in this wave: the payload can generate valid Sigstore provenance attestations by abusing OIDC tokens harvested from compromised CI runners, allowing the malicious packages to pass standard provenance verification despite carrying credential-stealing malware.

- Payload SHA-256 (Microsoft): `a68dd1e6a6e35ec3771e1f94fe796f55dfe65a2b94560516ff4ac189390dfa1c`
- Backdoor Python script SHA-256 (Microsoft): `fb5c97557230a27460fdab01fafcfabeaa49590bafd5b6ef30501aa9e0a51142`
- GitHub force-removed all 640 malicious package versions and invalidated **61,274 npm granular access tokens** that carried write permission with 2FA bypass.
- Stealer scope: AWS / GCP / Azure (metadata + env), GitHub PATs + npm publish tokens, Kubernetes service-account tokens and kubeconfig, HashiCorp Vault tokens, Stripe keys, database connection strings, SSH keys, `.env` and `.env.*` secrets, plus a Docker host-socket container-escape attempt.

The cleanest known version per package is always the one immediately preceding the malicious pair (e.g. `@antv/g2@5.4.8`, `@antv/g6@5.1.1`, `echarts-for-react@3.0.6`, `size-sensor@1.0.3`, `timeago.js@4.0.2`).

## 2026-07-28 update - GHSA formal-advisory backfill

On 2026-07-27 GitHub Advisory Database began a mass formal-advisory backfill against packages already yanked in the May 2026 triage - 150+ new GHSA IDs published for `@antv/*` packages already tracked in this module's 261-entry map (e.g., `@antv/l7-three` → `GHSA-gjrp-hvwh-82xh`, `@antv/x6-components` → `GHSA-qcw9-7qh9-h2m3`, `@antv/g-webgpu-compiler` → `GHSA-ww2q-9pv7-p87q`, `@antv/gi-cli` → `GHSA-pf8g-q4hp-r46f`, `@antv/g6-plugin` → `GHSA-8mwh-2297-272x`, and many more across the `@antv/g-*`, `@antv/g6-*`, `@antv/x6-*`, `@antv/l7-*`, `@antv/gi-*`, `@antv/li-*` scopes). No new attack activity - these are formal advisories being catalogued for packages the initial May 2026 triage already yanked. The affected-package map below already covers these hits; no map changes required.

Ecosystem-adjacent packages caught in the same 2026-07-27 backfill batch that were NOT previously in this module (`mcp-echarts`, `mcp-mermaid`, `ai-figure`, `gantt-for-react`, `amapcn`, `@cap-js/openapi`, `boring-avatars-vanilla`, `jest-canvas-mock`) are catalogued in `npm-2026-07-28-ghsa-malware-sweep` with Shai-Hulud-family attribution.

## Impact

- AWS, GCP, Azure credentials (instance metadata + env)
- GitHub Personal Access Tokens and npm publish tokens - enables further worm propagation
- Kubernetes service account tokens and kubeconfig files
- HashiCorp Vault tokens, Stripe keys, database connection strings
- SSH private keys and .env / .env.* secrets
- Docker container escape attempt via the host socket
- preinstall hook runs even with `npm ci --ignore-scripts` only if Bun is present - but `bun run` is invoked directly, bypassing standard npm script gating

## What to do

1. Block / pin away from every (name, version) pair in the packages map below. For top-impact packages: pin `@antv/g2` to `<= 5.4.8`, `@antv/g6` to `<= 5.1.1`, `@antv/x6` to `<= 3.1.7`, `echarts-for-react` to `<= 3.0.6`, `size-sensor` to `<= 1.0.3`, `timeago.js` to `<= 4.0.2`, `jest-canvas-mock` to `<= 2.5.2`, `jest-date-mock` to `<= 1.0.10`
2. Purge node_modules and any cached tarballs published between 2026-05-19T01:39Z and 2026-05-19T02:10Z
3. Assume credential compromise on any CI runner or developer machine that ran `npm install`/`pnpm install`/`yarn install` against any of these packages during the exposure window. Rotate npm/GitHub/GitLab/CircleCI tokens, AWS/GCP/Azure keys, K8s tokens, Vault tokens, Stripe keys, DB passwords
4. Audit `optionalDependencies` in every lockfile for entries pointing to antvis/G2 commit hashes - these are the secondary payload bootstrap
5. Audit your own npm publish history (under every maintainer account on the affected machines) for unexpected releases after 2026-05-19T01:30Z - the worm targets maintainer publish rights for propagation
6. Block egress to known Mini Shai-Hulud C2 infrastructure shared with the SAP/TanStack waves; cross-reference IOCs from the Wiz and Socket reports on those campaigns

## Check your own dependencies

- Check a package-lock.json against this incident: https://dependencywatch.io/check/package-lock-json

The scan runs entirely in the browser; lockfile contents are never uploaded.

## References

- [AntV packages compromised: Mini Shai-Hulud hits ~300 npm packages](https://socket.dev/blog/antv-packages-compromised) - Socket
- [Shai-Hulud, here we go again - May 19 burst](https://research.jfrog.com/post/shai-hulud-here-we-go-again-may19/) - JFrog
- [Mini Shai-Hulud compromised AntV npm packages enable CI/CD credential theft](https://www.microsoft.com/en-us/security/blog/2026/05/20/mini-shai-hulud-compromised-antv-npm-packages-enable-ci-cd-credential-theft/) - Microsoft
- [Mini Shai-Hulud pushes malicious AntV npm packages via compromised maintainer account](https://thehackernews.com/2026/05/mini-shai-hulud-pushes-malicious-antv.html) - The Hacker News

---

Canonical page: https://dependencywatch.io/incident/npm-2026-05-19-antv-mini-shai-hulud
Markdown version: https://dependencywatch.io/incident/npm-2026-05-19-antv-mini-shai-hulud.md
Site index for agents: https://dependencywatch.io/llms.txt
DependencyWatch.io is operated by Precursor Security (https://precursorsecurity.com).
