Aikido

Mini Shai-Hulud frappe à nouveau : un ver npm compromet des centaines de packages @antv

Écrit par
Sooraj Shah

Mini Shai-Hulud est de retour.

La campagne de la chaîne d'approvisionnement npm que nous suivons depuis avril a lancé une nouvelle vague, compromettant cette fois des packages majeurs de la suite Alibaba @antv suite, ainsi que echarts-for-react et timeago.js. Notre équipe de détection de malwares a identifié un grand nombre de versions de packages compromises parmi des centaines de noms de packages npm.

Une fois installé, le payload extrait les secrets en clair de la mémoire des runners CI/CD, dérobe les identifiants cloud locaux et SSH, et installe des portes dérobées dans les configurations de VS Code et Claude Code. Plus de 2 700 dépôts GitHub malveillants ont déjà été créés à l'aide de jetons volés.

Le payload s'exécute au moment de l'installation. Au moment où un scanner signale le package, le code malveillant s'est déjà exécuté sur toutes les machines qui l'ont installé. Nous détaillons l'importance de ce point dans la section de détection ci-dessous.

Si vous avez suivi notre couverture précédente de la vague SAP et de la vague TanStack, il s'agit de la même campagne qui continue de s'étendre.

Ce qui s'est passé

Notre équipe de détection de malwares a détecté une recrudescence de publications malveillantes le 19 mai. Au moment où nous avions terminé le tri du premier lot, d'autres arrivaient encore.

L'essentiel de l'activité ciblait @antv packages, un ensemble largement utilisé de bibliothèques JavaScript pour la visualisation de données, les graphiques, la cartographie et les diagrammes. Si vous avez développé des tableaux de bord, des graphiques ou des interfaces utilisateur riches en données dans un projet JavaScript, il y a de fortes chances qu'un élément de cette liste se trouve dans votre arbre de dépendances. L'ensemble concerné inclut @antv/g2, @antv/g6, @antv/x6, @antv/l7, @antv/s2, @antv/f2, @antv/g, @antv/g2plot, @antv/graphin, et @antv/data-set, ainsi que des packages en dehors du namespace tels que echarts-for-react, timeago.js, size-sensor, et canvas-nest.js.

Au-delà @antv, la vague a également touché des packages sous @lint-md, @openclaw-cn, et @starmind, ainsi que plusieurs packages npm non-scoped.

echarts-for-react à lui seul compte environ 1,1 million de téléchargements hebdomadaires. Une seule version compromise d'un package à cette échelle peut rapidement atteindre de nombreux environnements.

Cela suit le même schéma que nous avons observé lors des vagues précédentes. L'attaquant n'a pas besoin de compromettre des centaines de comptes individuels. Il obtient l'accès à un seul compte de mainteneur disposant de droits de publication étendus et déploie des versions malveillantes sur tout ce que ce compte peut atteindre.

Fonctionnement de la charge utile

L'approche technique est cohérente avec les variantes précédentes de Mini Shai-Hulud, avec quelques différences au niveau de la nomenclature des fichiers et de l'infrastructure.

Une charge utile index.js au niveau racine est injectée dans l'archive du package. Le fichier package.json est modifié pour l'exécuter lors de l'installation :

"preinstall": "bun run index.js"

Le fichier index.js est fortement obfusqué, utilisant des tables de correspondance de chaînes de caractères, un décodage à l'exécution et un déchiffreur personnalisé pour masquer les chaînes sensibles à l'analyse statique.

La charge utile ajoute également une dépendance optionnelle qui reproduit la technique que nous avons documentée dans la vague TanStack :

{
  "optionalDependencies": {
    "@antv/setup": "github:antvis/G2#7cb42f57561c321ecb09b4552802ae0ac55b3a7a"
  }
}

C'est parfois appelé une dépendance exotique, une github : référence préfixée qui pointe directement vers un dépôt GitHub et un commit au lieu d'un package publié sur npm. Cela offre à l'attaquant un second chemin d'exécution lors de l'installation sans livrer la charge utile complète dans l'archive npm. npm exécute les scripts de cycle de vie pour les dépendances Git pendant l'installation, ainsi, un package qui ressemble à une dépendance normale peut exécuter discrètement la charge utile depuis un dépôt complètement séparé.

Ce que la charge utile dérobe

La charge utile cible les machines de développeurs et les environnements CI/CD. Elle recherche :

  • Tokens GitHub
  • Tokens npm
  • Tokens OIDC GitHub Actions
  • Identifiants AWS et métadonnées d'instance
  • Fichiers de compte de service Kubernetes
  • Jetons HashiCorp Vault
  • Clés SSH et clés privées
  • Fichiers d'authentification Docker
  • Chaînes de connexion de base de données
  • Variables d'environnement et secrets du système de fichiers local

Les données volées sont chiffrées avant exfiltration, ce qui rend plus difficile la récupération du texte en clair dérobé à partir des captures réseau. Le point d'exfiltration est déguisé en URL de télémétrie, ce qui peut être facilement manqué dans les journaux du système de build.

La charge utile inclut également un mécanisme de repli basé sur GitHub. Si elle obtient un jeton GitHub utilisable, elle peut créer un dépôt sous le compte de la victime et y commettre les données volées. Sur l'ensemble de la campagne Mini Shai-Hulud, plus de 2 700 dépôts GitHub malveillants ont été créés à l'aide de jetons volés, en utilisant la même nomenclature sur le thème de Dune et les mêmes marqueurs de campagne inversés que nous avons documentés lors des vagues précédentes.

Persistance

C'est la partie qui rend le nettoyage plus difficile que lors des vagues précédentes.

La charge utile écrit dans .vscode/tasks.json et .claude/settings.json, implantant des backdoors dans les configurations de VS Code et Claude Code. Cela signifie que la suppression du paquet malveillant de votre lockfile n'est pas suffisante. Si ces fichiers ne sont pas vérifiés et nettoyés, l'attaquant conserve un point d'ancrage sur la machine du développeur même après la restauration de la dépendance.

Propagation

La charge utile contient toujours la logique de propagation npm qui fait de Mini Shai-Hulud un ver, et il est utile de répéter comment cela fonctionne car cela explique la rapidité de ces vagues.

Après avoir volé des jetons npm, il les valide auprès du registre npm, énumère les paquets que le propriétaire du jeton peut publier, télécharge les archives tar des paquets, injecte la charge utile malveillante, ajoute un preinstall hook, incrémente la version et republie. Le malware ne se contente pas de dérober des secrets à la victime actuelle. Il utilise l'accès de publication de la victime pour compromettre la prochaine série de packages.

C'est ainsi que la campagne continue de se développer. Chaque compte compromis devient le point d'entrée de la prochaine vague, et les mainteneurs disposant d'un large accès de publication offrent au ver de nombreuses possibilités de propagation.

Ce qui a changé par rapport à la vague TanStack

Le modèle de base reste le même : exécution au moment de l'installation, charges utiles basées sur Bun, JavaScript obfusqué, collecte de credentials, abus de GitHub et republication npm. Si vous avez lu nos précédentes analyses, l'architecture vous semblera familière.

Le @antv les exemples utilisent un [élément] de niveau racine index.js plutôt que le router_init.js que nous avons vu dans les packages TanStack. L'infrastructure C2 a changé. La charge utile est légèrement plus petite. La persistance via les configurations d'IDE et d'outils d'IA est nouvelle, et mérite une attention particulière, car cela signifie que l'attaquant réfléchit à ce qui se passe après le nettoyage de la compromission initiale.

C'est la troisième vague majeure que nous avons suivie. Elle est passée d'une poignée de packages SAP en avril, à 169 packages lors de la vague TanStack, pour atteindre un ensemble de packages beaucoup plus vaste aujourd'hui. Chaque vague a été plus rapide et plus étendue que la précédente.

Pourquoi une détection rapide n'est pas suffisante

On a beaucoup insisté sur la rapidité avec laquelle les packages malveillants peuvent être signalés après leur publication. Quelques minutes, dans certains cas. Cela semble rassurant, mais cela passe à côté du problème.

Ces packages exécutent du code au moment de l'installation. Un preinstall hook s'exécute pendant npm install, avant même que le package ne soit entièrement décompressé. Si un développeur ou un runner CI installe une version compromise dans la fenêtre entre la publication et la détection, la charge utile a déjà été exécutée et les credentials ont déjà quitté la machine. Les dégâts sont faits avant qu'un scanner ne puisse signaler le package.

Une détection rapide facilite la réponse aux incidents. Elle indique les versions à éviter à l'avenir. Cependant, elle ne protège pas les développeurs et les systèmes de build qui ont installé le package durant ces premières minutes.

La défense la plus efficace consiste à ne jamais installer une version de package qui n'a pas eu le temps d'être vérifiée. Le blocage des packages par ancienneté, en refusant d'installer toute version publiée il y a moins d'un certain nombre d'heures ou de jours, ferme la fenêtre que les approches basées sur la détection laissent ouverte. C'est une politique simple, et c'est celle qui empêche réellement l'exécution de la charge utile.

Détection et atténuation

Si vous ne bloquiez pas les nouveaux packages par ancienneté et qu'une version compromise a réussi à s'introduire dans votre environnement, commencez par les lockfiles et les caches de packages.

Recherchez les namespaces et les paquets affectés :

  • @antv/
  • @lint-md/
  • @openclaw-cn/
  • @starmind/
  • echarts-for-react
  • timeago.js
  • size-sensor
  • canvas-nest.js

Recherchez les fichiers de charge utile et les marqueurs de dépendance :

  • preinstall hook contenant bun run index.js
  • @antv/setup
  • github:antvis/G2#7cb42f57561c321ecb09b4552802ae0ac55b3a7a

Vérifiez les artefacts de persistance sur les machines des développeurs :

  • .vscode/tasks.json pour des définitions de tâches inattendues
  • .claude/settings.json pour des modifications de configuration inattendues

Bloquer le trafic réseau sortant vers :

  • t.m-kosche.com

Recherchez dans les logs CI les éléments suivants :

  • Exécution inattendue de Bun pendant npm install
  • Défaillances de dépendances optionnelles impliquant @antv/setup
  • Connexions sortantes pendant l'installation des dépendances
  • activité de publication npm provenant de workflows qui n'auraient pas dû publier
  • requêtes de jetons OIDC de GitHub Actions lors d'étapes inattendues

Si une version de package compromise a été exécutée sur une machine de développeur ou un runner CI, faites pivoter les secrets de cet environnement. Ne vous limitez pas aux jetons npm.

Faites pivoter ou examinez :

  • jetons npm et accès à la publication de packages
  • PATs GitHub et secrets GitHub Actions
  • Identifiants AWS
  • Jetons de compte de service Kubernetes
  • jetons Vault
  • Clés SSH
  • Identifiants Docker
  • Secrets de déploiement

Auditez également les publications npm récentes et les exécutions de GitHub Actions. Comme nous l'avons noté dans notre article sur TanStack : un enregistrement de provenance valide ne prouve pas que la build était sûre.

Indicateurs de compromission

Indicateurs réseau :

  • t[.]m-kosche[.]com

Marqueurs de package :

  • @antv/setup
  • github:antvis/G2#7cb42f57561c321ecb09b4552802ae0ac55b3a7a
  • preinstall exécution de script bun run index.js
  • Fichier de charge utile au niveau racine inclus en dehors du contenu normal du paquet

Artefacts de persistance :

  • .vscode/tasks.json
  • .claude/settings.json

Marqueurs de campagne :

  • Noms de dépôts sur le thème de Dune sur GitHub (plus de 2 700 observés)
  • Inversées Shai-Hulud chaînes de caractères dans les descriptions de dépôts
  • results/ répertoires dans les dépôts créés par les attaquants

Les indicateurs précédemment documentés des vagues SAP et TanStack s'appliquent toujours. Consultez notre analyse TanStack pour la liste complète des IOC des vagues précédentes.

Conclusion

Mini Shai-Hulud continue de s'étendre davantage dans l'écosystème npm. Chaque vague a été plus importante que la précédente, et les @antv paquets introduisent des outils de visualisation de données dans l'ensemble affecté, aux côtés des paquets de routage, d'entreprise et d'IA des vagues précédentes. L'ajout de la persistance des outils IDE et AI signifie que la suppression de la mauvaise dépendance ne suffit plus pour nettoyer.

Si l'un des paquets affectés a été exécuté dans votre environnement, traitez la machine ou le runner comme exposé jusqu'à ce que les secrets soient renouvelés, les artefacts de persistance supprimés et l'activité de publication récente examinée.

Comment Aikido protège contre cela

Si vous êtes un utilisateur d'Aikido, consultez votre flux central et filtrez les problèmes de malware. Cela apparaîtra comme un problème critique 100/100. Aikido effectue des rescans chaque nuit, mais nous vous recommandons de déclencher une nouvelle analyse manuelle dès maintenant. Nous avons mis en place une règle de détection pour rechercher les indicateurs de compromission spécifiquement liés à cette campagne. Nous avons également entraîné notre IA de détection de malwares à reconnaître les packages affectés. La règle suit spécifiquement les dépendances exotiques, les hooks de cycle de vie et les techniques d'exécution bun liés à cette campagne.

Pour une prévention réelle, et non une simple détection a posteriori, Aikido propose deux couches qui traitent directement le problème au moment de l'installation.

Aikido Safe Chain (open source) intercepte les commandes npm, pnpm et yarn et vérifie les paquets par rapport à Aikido Intel avant l'installation. Il bloque les paquets compromis avant qu'ils ne puissent exécuter des hooks d'installation. Si un paquet est signalé ou trop récent pour être fiable, il n'est pas installé.

La Devices Protection d'Aikido offre aux équipes de sécurité une visibilité en temps réel sur les dépendances et les extensions exécutées sur les machines des développeurs au sein de l'organisation. Elle applique des politiques telles que le blocage des paquets par ancienneté, de sorte qu'une version publiée il y a quelques minutes n'atteigne jamais une machine de développeur. Si quelque chose passe, elle permet de contenir instantanément le rayon d'impact.

Si vous n'êtes pas encore un utilisateur d'Aikido, vous pouvez créer un compte et connecter vos dépôts. Notre couverture anti-malware est incluse dans le plan gratuit, aucune carte de crédit n'est requise.

Annexe : Paquets et versions affectés

Liste actuelle des paquets et versions identifiés par notre équipe à travers toutes les vagues de Mini Shai-Hulud. Cette liste inclut les paquets des vagues SAP, TanStack et @antv.

  • @antv/a8: 0.1.1, 0.2.1
  • @antv/adjust: 0.3.5, 0.4.5
  • @antv/algorithm: 0.2.26, 0.3.26
  • @antv/async-hook: 2.3.9, 2.4.9
  • @antv/attr: 0.4.5, 0.5.5
  • @antv/ava: 3.5.1, 3.6.1
  • @antv/ava-react: 3.4.2, 3.5.2
  • @antv/awards: 0.1.9, 0.2.9
  • @antv/calendar-heatmap: 1.2.2, 1.3.2
  • @antv/chart-linter: 1.2.6, 1.3.6
  • @antv/chart-node-g6: 0.1.4, 0.2.4
  • @antv/chart-visualization-skills: 0.2.3, 0.3.3
  • @antv/ckb: 2.1.4, 2.2.4
  • @antv/color-schema: 0.3.3, 0.4.3
  • @antv/color-util: 2.1.6, 2.2.6
  • @antv/component: 2.2.11, 2.3.11
  • @antv/coord: 0.5.7, 0.6.7
  • @antv/d3-color: 1.1.0, 1.2.0
  • @antv/d3-interpolate: 1.1.3, 1.2.3
  • @antv/data-samples: 1.1.1, 1.2.1
  • @antv/data-set: 0.12.8, 0.13.8
  • @antv/data-wizard: 2.1.4, 2.2.4
  • @antv/dipper-component: 0.1.4, 0.2.4
  • @antv/dipper-hooks: 0.3.1, 0.4.1
  • @antv/dipper-map: 1.1.10, 1.2.10
  • @antv/dom-util: 2.1.4, 2.2.4
  • @antv/dumi-theme-antv: 0.10.4, 0.9.4
  • @antv/dw-analyzer: 1.2.5, 1.3.5
  • @antv/dw-random: 1.2.7, 1.3.7
  • @antv/dw-transform: 1.2.7, 1.3.7
  • @antv/dw-util: 1.2.4, 1.3.4
  • @antv/event-emitter: 0.2.3, 0.3.3
  • @antv/expr: 1.1.2, 1.2.2
  • @antv/f-charts: 0.1.0, 0.2.0
  • @antv/f-engine: 1.11.0, 1.12.0
  • @antv/f-lottie: 1.11.0, 1.12.0
  • @antv/f-my: 1.11.0, 1.12.0
  • @antv/f-react: 1.11.0, 1.12.0
  • @antv/f-test-utils: 1.1.9, 1.2.9
  • @antv/f-vue: 1.11.0, 1.12.0
  • @antv/f-wx: 1.11.0, 1.12.0
  • @antv/f2: 5.15.0, 5.16.0
  • @antv/f2-algorithm: 5.8.0, 5.9.0
  • @antv/f2-canvas: 1.1.5, 1.2.5
  • @antv/f2-context: 0.1.1, 0.2.1
  • @antv/f2-graphic: 0.1.16, 0.2.16
  • @antv/f2-my: 4.1.52, 4.2.52
  • @antv/f2-react: 5.15.0, 5.16.0
  • @antv/f2-site: 4.1.42, 4.2.42
  • @antv/f2-vue: 4.1.33, 4.2.33
  • @antv/f2-wordcloud: 5.15.0, 5.16.0
  • @antv/f2-wx: 4.1.51, 4.2.51
  • @antv/f6: 0.1.19, 0.2.19
  • @antv/f6-alipay: 0.1.7, 0.2.7
  • @antv/f6-core: 0.1.2, 0.2.2
  • @antv/f6-element: 0.1.1, 0.2.1
  • @antv/f6-hammerjs: 0.1.2, 0.2.2
  • @antv/f6-plugin: 1.1.6, 1.2.6
  • @antv/f6-ui: 1.1.3, 1.2.3
  • @antv/f6-wx: 0.1.7, 0.2.7
  • @antv/g: 6.4.1, 6.5.1
  • @antv/g-base: 0.6.16, 0.7.16
  • @antv/g-camera-api: 2.1.45, 2.2.45
  • @antv/g-canvas: 2.3.0, 2.4.0
  • @antv/g-canvaskit: 1.2.1, 1.3.1
  • @antv/g-compat: 1.1.11, 1.2.11
  • @antv/g-components: 2.1.42, 2.2.42
  • @antv/g-css-layout-api: 1.1.38, 1.2.38
  • @antv/g-css-typed-om-api: 1.1.38, 1.2.38
  • @antv/g-device-api: 1.7.13, 1.8.13
  • @antv/g-dom-mutation-observer-api: 2.1.42, 2.2.42
  • @antv/g-gesture: 3.1.42, 3.2.42
  • @antv/g-image-exporter: 1.1.42, 1.2.42
  • @antv/g-layout-blocklike: 1.8.49, 1.9.49
  • @antv/g-lite: 2.8.0, 2.9.0
  • @antv/g-lottie-player: 1.2.1, 1.3.1
  • @antv/g-math: 3.2.0, 3.3.0
  • @antv/g-mobile: 1.2.5, 1.3.5
  • @antv/g-mobile-canvas: 1.2.1, 1.3.1
  • @antv/g-mobile-canvas-element: 1.1.42, 1.2.42
  • @antv/g-mobile-svg: 1.2.1, 1.3.1
  • @antv/g-mobile-webgl: 1.2.1, 1.3.1
  • @antv/g-pattern: 2.1.42, 2.2.42
  • @antv/g-perf: 1.1.0, 1.2.0
  • @antv/g-plugin-3d: 2.2.1, 2.3.1
  • @antv/g-plugin-a11y: 1.5.1, 1.6.1
  • @antv/g-plugin-annotation: 1.3.0, 1.4.0
  • @antv/g-plugin-box2d: 2.2.1, 2.3.1
  • @antv/g-plugin-canvas-path-generator: 2.2.26, 2.3.26
  • @antv/g-plugin-canvas-picker: 2.4.1, 2.5.1
  • @antv/g-plugin-canvas-renderer: 2.6.1, 2.7.1
  • @antv/g-plugin-canvaskit-renderer: 2.4.1, 2.5.1
  • @antv/g-plugin-control: 2.2.1, 2.3.1
  • @antv/g-plugin-css-select: 2.2.1, 2.3.1
  • @antv/g-plugin-device-renderer: 2.7.1, 2.8.1
  • @antv/g-plugin-dom-interaction: 2.2.31, 2.3.31
  • @antv/g-plugin-dragndrop: 2.2.1, 2.3.1
  • @antv/g-plugin-gesture: 2.2.1, 2.3.1
  • @antv/g-plugin-gpgpu: 1.10.20, 1.11.20
  • @antv/g-plugin-html-renderer: 2.4.1, 2.5.1
  • @antv/g-plugin-image-loader: 2.4.1, 2.5.1
  • @antv/g-plugin-matterjs: 2.2.1, 2.3.1
  • @antv/g-plugin-mobile-interaction: 1.1.42, 1.2.42
  • @antv/g-plugin-physx: 2.2.1, 2.3.1
  • @antv/g-plugin-rough-canvas-renderer: 2.2.1, 2.3.1
  • @antv/g-plugin-rough-svg-renderer: 2.2.1, 2.3.1
  • @antv/g-plugin-svg-picker: 2.1.46, 2.2.46
  • @antv/g-plugin-svg-renderer: 2.5.1, 2.6.1
  • @antv/g-plugin-webgl-device: 1.10.17, 1.11.17
  • @antv/g-plugin-webgl-renderer: 1.1.26, 1.2.26
  • @antv/g-plugin-webgpu-device: 1.10.17, 1.11.17
  • @antv/g-plugin-yoga: 2.4.1, 2.5.1
  • @antv/g-plugin-zdog-canvas-renderer: 2.2.1, 2.3.1
  • @antv/g-plugin-zdog-svg-renderer: 2.2.1, 2.3.1
  • @antv/g-shader-components: 2.1.0, 2.2.0
  • @antv/g-svg: 2.2.1, 2.3.1
  • @antv/g-web-animations-api: 2.2.32, 2.3.32
  • @antv/g-web-components: 2.2.1, 2.3.1
  • @antv/g-webgl: 2.2.1, 2.3.1
  • @antv/g-webgl-compute: 0.1.1, 0.2.1
  • @antv/g-webgpu: 2.2.1, 2.3.1
  • @antv/g-webgpu-compiler: 0.8.2, 0.9.2
  • @antv/g-webgpu-core: 0.8.2, 0.9.2
  • @antv/g-webgpu-engine: 0.8.2, 0.9.2
  • @antv/g-webgpu-raytracer: 0.6.1, 0.7.1
  • @antv/g-webgpu-unitchart: 0.6.1, 0.7.1
  • @antv/g2: 5.5.8, 5.6.8
  • @antv/g2-brush: 0.1.2, 0.2.2
  • @antv/g2-extension-3d: 0.3.0, 0.4.0
  • @antv/g2-extension-ava: 0.3.0, 0.4.0
  • @antv/g2-extension-plot: 0.3.2, 0.4.2
  • @antv/g2-plugin-slider: 2.2.1, 2.3.1
  • @antv/g2-ssr: 0.3.0, 0.4.0
  • @antv/g2plot: 2.5.35, 2.6.35
  • @antv/g2plot-schemas: 1.3.2, 1.4.2
  • @antv/g6: 5.2.1, 5.3.1
  • @antv/g6-alipay: 0.1.1, 0.2.1
  • @antv/g6-cli: 0.1.4, 0.2.4
  • @antv/g6-core: 0.10.24, 0.9.24
  • @antv/g6-editor: 1.3.0, 1.4.0
  • @antv/g6-element: 0.10.25, 0.9.25
  • @antv/g6-extension-3d: 0.2.23, 0.3.23
  • @antv/g6-extension-react: 0.3.7, 0.4.7
  • @antv/g6-mobile: 0.2.2, 0.3.2
  • @antv/g6-pc: 0.10.25, 0.9.25
  • @antv/g6-plugin: 0.10.25, 0.9.25
  • @antv/g6-plugin-map-view: 0.1.4, 0.2.4
  • @antv/g6-plugins: 1.1.9, 1.2.9
  • @antv/g6-react-node: 1.5.8, 1.6.8
  • @antv/g6-ssr: 0.2.1, 0.3.1
  • @antv/g6-wx: 0.1.1, 0.2.1
  • @antv/gatsby-theme: 0.2.0, 0.3.0
  • @antv/geo-coord: 1.1.8, 1.2.8
  • @antv/gi-assets-advance: 2.6.22, 2.7.22
  • @antv/gi-assets-algorithm: 2.4.19, 2.5.19
  • @antv/gi-assets-basic: 2.5.40, 2.6.40
  • @antv/gi-assets-galaxybase: 1.3.15, 1.4.15
  • @antv/gi-assets-graphscope: 2.2.15, 2.3.15
  • @antv/gi-assets-hugegraph: 1.2.15, 1.3.15
  • @antv/gi-assets-janusgraph: 1.2.15, 1.3.15
  • @antv/gi-assets-neo4j: 2.2.15, 2.3.15
  • @antv/gi-assets-scene: 2.3.21, 2.4.21
  • @antv/gi-assets-tugraph: 2.2.15, 2.3.15
  • @antv/gi-assets-tugraph-analytics: 0.3.15, 0.4.15
  • @antv/gi-assets-xlab: 0.2.30, 0.3.30
  • @antv/gi-cli: 1.3.11, 1.4.11
  • @antv/gi-common-components: 1.4.16, 1.5.16
  • @antv/gi-mock-data: 1.1.5, 1.2.5
  • @antv/gi-public-data: 1.1.1, 1.2.1
  • @antv/gi-sdk: 3.1.0, 3.2.0
  • @antv/gi-sdk-app: 1.3.10, 1.4.10
  • @antv/gi-theme-antd: 0.7.11, 0.8.11
  • @antv/github-config-cli: 0.2.0, 0.3.0
  • @antv/gl-matrix: 2.8.1, 2.9.1
  • @antv/gpt-vis: 1.1.0, 1.2.0
  • @antv/gpt-vis-ssr: 0.4.7, 0.5.7
  • @antv/graphin: 3.1.5, 3.2.5
  • @antv/graphin-components: 2.5.1, 2.6.1
  • @antv/graphin-graphscope: 1.1.5, 1.2.5
  • @antv/graphin-icons: 1.1.0, 1.2.0
  • @antv/graphlib: 2.1.4, 2.2.4
  • @antv/hierarchy: 0.8.1, 0.9.1
  • @antv/infographic: 0.3.19, 0.4.19
  • @antv/insight-component: 1.1.0, 1.2.0
  • @antv/interaction: 0.2.5, 0.3.5
  • @antv/istanbul: 0.1.0, 0.2.0
  • @antv/knowledge: 1.2.4, 1.3.4
  • @antv/l7: 2.26.10, 2.27.10
  • @antv/l7-component: 2.26.10, 2.27.10
  • @antv/l7-composite-layers: 0.18.1, 0.19.1
  • @antv/l7-core: 2.26.10, 2.27.10
  • @antv/l7-district: 2.4.12, 2.5.12
  • @antv/l7-draw: 3.2.5, 3.3.5
  • @antv/l7-editor: 1.2.13, 1.3.13
  • @antv/l7-extension-g-layer: 1.1.0, 1.2.0
  • @antv/l7-layers: 2.26.10, 2.27.10
  • @antv/l7-leaflet: 1.1.2, 1.2.2
  • @antv/l7-map: 2.26.10, 2.27.10
  • @antv/l7-mapkit: 0.6.0, 0.7.0
  • @antv/l7-maps: 2.26.10, 2.27.10
  • @antv/l7-mini: 2.21.8, 2.22.8
  • @antv/l7-pass: 1.1.0, 1.2.0
  • @antv/l7-react: 2.5.3, 2.6.3
  • @antv/l7-renderer: 2.26.10, 2.27.10
  • @antv/l7-scene: 2.26.10, 2.27.10
  • @antv/l7-source: 2.26.10, 2.27.10
  • @antv/l7-three: 2.26.10, 2.27.10
  • @antv/l7-utils: 2.26.10, 2.27.10
  • @antv/l7plot: 0.6.11, 0.7.11
  • @antv/l7plot-component: 0.1.11, 0.2.11
  • @antv/larkmap: 1.6.1, 1.7.1
  • @antv/layout-gpu: 1.2.7, 1.3.7
  • @antv/layout-wasm: 1.5.2, 1.6.2
  • @antv/li-aiearth-assets: 0.5.7, 0.6.7
  • @antv/li-analysis-assets: 1.10.1, 1.11.1
  • @antv/li-core-assets: 1.4.7, 1.5.7
  • @antv/li-editor: 1.7.1, 1.8.1
  • @antv/li-p2: 1.10.2, 1.9.2
  • @antv/li-sam-assets: 0.2.4, 0.3.4
  • @antv/li-sdk: 1.6.1, 1.7.1
  • @antv/lite-insight: 2.2.1, 2.3.1
  • @antv/matrix-util: 3.1.4, 3.2.4
  • @antv/mcp-server-antv: 0.2.8, 0.3.8
  • @antv/mcp-server-chart: 0.10.10, 0.11.10
  • @antv/my-f2: 2.2.7, 2.3.7
  • @antv/my-f2-pc: 0.2.1, 0.3.1
  • @antv/narrative-text-editor: 0.3.20, 0.4.20
  • @antv/narrative-text-schema: 0.4.7, 0.5.7
  • @antv/narrative-text-vis: 0.4.16, 0.5.16
  • @antv/path-util: 3.1.1, 3.2.1
  • @antv/react-g: 2.2.1, 2.3.1
  • @antv/s2: 2.8.1, 2.9.1
  • @antv/s2-react: 2.4.1, 2.5.1
  • @antv/s2-react-components: 2.2.2, 2.3.2
  • @antv/s2-ssr: 0.2.1, 0.3.1
  • @antv/s2-vue: 2.3.0, 2.4.0
  • @antv/sam: 0.3.0, 0.4.0
  • @antv/scale: 0.6.2, 0.7.2
  • @antv/semantic-release-pnpm: 1.1.4, 1.2.4
  • @antv/smart-color: 0.3.1, 0.4.1
  • @antv/stat: 0.1.2, 0.2.2
  • @antv/t8: 0.4.0, 0.5.0
  • @antv/thumbnails: 2.1.0, 2.2.0
  • @antv/thumbnails-component: 2.1.0, 2.2.0
  • @antv/torch: 1.1.6, 1.2.6
  • @antv/translator: 1.1.1, 1.2.1
  • @antv/util: 3.4.11, 3.5.11
  • @antv/vendor: 1.1.11, 1.2.11
  • @antv/vis-predict-engine: 0.2.1, 0.3.1
  • @antv/webgpu-graph: 1.1.0, 1.2.0
  • @antv/word-scale-chart: 0.4.4, 0.5.4
  • @antv/wx-f2: 2.2.1, 2.3.1
  • @antv/x6: 3.2.7, 3.3.7
  • @antv/x6-angular-shape: 3.1.1, 3.2.1
  • @antv/x6-common: 2.1.17, 2.2.17
  • @antv/x6-components: 0.11.7, 0.12.7
  • @antv/x6-geometry: 2.1.5, 2.2.5
  • @antv/x6-plugin-clipboard: 2.2.6, 2.3.6
  • @antv/x6-plugin-dnd: 2.2.1, 2.3.1
  • @antv/x6-plugin-export: 2.2.6, 2.3.6
  • @antv/x6-plugin-history: 2.3.4, 2.4.4
  • @antv/x6-plugin-keyboard: 2.3.3, 2.4.3
  • @antv/x6-plugin-minimap: 2.1.7, 2.2.7
  • @antv/x6-plugin-scroller: 2.1.10, 2.2.10
  • @antv/x6-plugin-selection: 2.3.2, 2.4.2
  • @antv/x6-plugin-snapline: 2.2.7, 2.3.7
  • @antv/x6-plugin-stencil: 2.2.5, 2.3.5
  • @antv/x6-plugin-transform: 2.2.8, 2.3.8
  • @antv/x6-react: 0.2.26, 0.3.26
  • @antv/x6-react-components: 2.1.9, 2.2.9
  • @antv/x6-react-shape: 3.1.1, 3.2.1
  • @antv/x6-vector: 1.5.2, 1.6.2
  • @antv/x6-vue-shape: 3.1.2, 3.2.2
  • @antv/x6-vue3-shape: 1.1.0, 1.2.0
  • @antv/xflow: 2.2.13, 2.3.13
  • @antv/xflow-core: 1.1.55, 1.2.55
  • @antv/xflow-diff: 1.1.0, 1.2.0
  • @antv/xflow-extension: 1.1.55, 1.2.55
  • @antv/xflow-hook: 1.1.55, 1.2.55
  • @beproduct/nestjs-auth: 0.1.10, 0.1.11, 0.1.12, 0.1.13, 0.1.14, 0.1.15, 0.1.16, 0.1.17, 0.1.18, 0.1.19, 0.1.2, 0.1.3, 0.1.4, 0.1.5, 0.1.6, 0.1.7, 0.1.8, 0.1.9
  • @cap-js/db-service: 2.10.1
  • @cap-js/postgres: 2.2.2
  • @cap-js/sqlite: 2.2.2
  • @dirigible-ai/sdk: 0.6.2, 0.6.3
  • @draftauth/client: 0.2.1, 0.2.2
  • @draftauth/core: 0.13.1, 0.13.2
  • @draftlab/auth: 0.24.1, 0.24.2
  • @draftlab/auth-router: 0.5.1, 0.5.2
  • @draftlab/db: 0.16.1, 0.16.2
  • @intercom/intercom-php: 5.0.2
  • @lint-md/cli: 2.1.0, 2.2.0
  • @lint-md/core: 2.1.0, 2.2.0
  • @lint-md/parser: 0.1.14, 0.2.14
  • @mesadev/rest: 0.28.3
  • @mesadev/saguaro: 0.4.22
  • @mesadev/sdk: 0.28.3
  • @mistralai/mistralai: 2.2.2, 2.2.3, 2.2.4
  • @mistralai/mistralai-azure: 1.7.1, 1.7.2, 1.7.3
  • @mistralai/mistralai-gcp: 1.7.1, 1.7.2, 1.7.3
  • @ml-toolkit-ts/preprocessing: 1.0.2, 1.0.3
  • @ml-toolkit-ts/xgboost: 1.0.3, 1.0.4
  • @openclaw-cn/cli: 1.4.1
  • @openclaw-cn/feishu: 0.2.11
  • @openclaw-cn/libsignal: 2.1.1
  • @openclaw-cn/toutiao-ops: 1.2.4
  • @opensearch-project/opensearch: 3.5.3, 3.6.2, 3.7.0, 3.8.0
  • @squawk/airport-data: 0.7.4, 0.7.5, 0.7.6, 0.7.7, 0.7.8
  • @squawk/airports: 0.6.2, 0.6.3, 0.6.4, 0.6.5, 0.6.6
  • @squawk/airspace: 0.8.1, 0.8.2, 0.8.3, 0.8.4, 0.8.5
  • @squawk/airspace-data: 0.5.3, 0.5.4, 0.5.5, 0.5.6, 0.5.7
  • @squawk/airway-data: 0.5.4, 0.5.5, 0.5.6, 0.5.7, 0.5.8
  • @squawk/airways: 0.4.2, 0.4.3, 0.4.4, 0.4.5, 0.4.6
  • @squawk/fix-data: 0.6.4, 0.6.5, 0.6.6, 0.6.7, 0.6.8
  • @squawk/fixes: 0.3.2, 0.3.3, 0.3.4, 0.3.5, 0.3.6
  • @squawk/flight-math: 0.5.4, 0.5.5, 0.5.6, 0.5.7, 0.5.8
  • @squawk/flightplan: 0.5.2, 0.5.3, 0.5.4, 0.5.5, 0.5.6
  • @squawk/geo: 0.4.4, 0.4.5, 0.4.6, 0.4.7, 0.4.8
  • @squawk/icao-registry: 0.5.2, 0.5.3, 0.5.4, 0.5.5, 0.5.6
  • @squawk/icao-registry-data: 0.8.4, 0.8.5, 0.8.6, 0.8.7, 0.8.8
  • @squawk/mcp: 0.9.1, 0.9.2, 0.9.3, 0.9.4, 0.9.5
  • @squawk/navaid-data: 0.6.4, 0.6.5, 0.6.6, 0.6.7, 0.6.8
  • @squawk/navaids: 0.4.2, 0.4.3, 0.4.4, 0.4.5, 0.4.6
  • @squawk/notams: 0.3.10, 0.3.6, 0.3.7, 0.3.8, 0.3.9
  • @squawk/procedure-data: 0.7.3, 0.7.4, 0.7.5, 0.7.6, 0.7.7
  • @squawk/procedures: 0.5.2, 0.5.3, 0.5.4, 0.5.5, 0.5.6
  • @squawk/types: 0.8.1, 0.8.2, 0.8.3, 0.8.4, 0.8.5
  • @squawk/units: 0.4.3, 0.4.4, 0.4.5, 0.4.6, 0.4.7
  • @squawk/weather: 0.5.10, 0.5.6, 0.5.7, 0.5.8, 0.5.9
  • @starmind/collector-cli: 0.3.10
  • @supersurkhet/cli: 0.0.2, 0.0.3, 0.0.4, 0.0.5, 0.0.6, 0.0.7
  • @supersurkhet/sdk: 0.0.2, 0.0.3, 0.0.4, 0.0.5, 0.0.6, 0.0.7
  • @tallyui/components: 1.0.1, 1.0.2, 1.0.3
  • @tallyui/connector-medusa: 1.0.1, 1.0.2, 1.0.3
  • @tallyui/connector-shopify: 1.0.1, 1.0.2, 1.0.3
  • @tallyui/connector-vendure: 1.0.1, 1.0.2, 1.0.3
  • @tallyui/connector-woocommerce: 1.0.1, 1.0.2, 1.0.3
  • @tallyui/core: 0.2.1, 0.2.2, 0.2.3
  • @tallyui/database: 1.0.1, 1.0.2, 1.0.3
  • @tallyui/pos: 0.1.1, 0.1.2, 0.1.3
  • @tallyui/storage-sqlite: 0.2.1, 0.2.2, 0.2.3
  • @tallyui/theme: 0.2.1, 0.2.2, 0.2.3
  • @tanstack/arktype-adapter: 1.166.12, 1.166.15
  • @tanstack/eslint-plugin-router: 1.161.12, 1.161.9
  • @tanstack/eslint-plugin-start: 0.0.4, 0.0.7
  • @tanstack/history: 1.161.12, 1.161.9
  • @tanstack/nitro-v2-vite-plugin: 1.154.12, 1.154.15
  • @tanstack/react-router: 1.169.5, 1.169.8
  • @tanstack/react-router-devtools: 1.166.16, 1.166.19
  • @tanstack/react-router-ssr-query: 1.166.15, 1.166.18
  • @tanstack/react-start: 1.167.68, 1.167.71
  • @tanstack/react-start-client: 1.166.51, 1.166.54
  • @tanstack/react-start-rsc: 0.0.47, 0.0.50
  • @tanstack/react-start-server: 1.166.55, 1.166.58
  • @tanstack/router-cli: 1.166.46, 1.166.49
  • @tanstack/router-core: 1.169.5, 1.169.8
  • @tanstack/router-devtools: 1.166.16, 1.166.19
  • @tanstack/router-devtools-core: 1.167.6, 1.167.9
  • @tanstack/router-generator: 1.166.45, 1.166.48
  • @tanstack/router-plugin: 1.167.38, 1.167.41
  • @tanstack/router-ssr-query-core: 1.168.3, 1.168.6
  • @tanstack/router-utils: 1.161.11, 1.161.14
  • @tanstack/router-vite-plugin: 1.166.53, 1.166.56
  • @tanstack/solid-router: 1.169.5, 1.169.8
  • @tanstack/solid-router-devtools: 1.166.16, 1.166.19
  • @tanstack/solid-router-ssr-query: 1.166.15, 1.166.18
  • @tanstack/solid-start: 1.167.65, 1.167.68
  • @tanstack/solid-start-client: 1.166.50, 1.166.53
  • @tanstack/solid-start-server: 1.166.54, 1.166.57
  • @tanstack/start-client-core: 1.168.5, 1.168.8
  • @tanstack/start-fn-stubs: 1.161.12, 1.161.9
  • @tanstack/start-plugin-core: 1.169.23, 1.169.26
  • @tanstack/start-server-core: 1.167.33, 1.167.36
  • @tanstack/start-static-server-functions: 1.166.44, 1.166.47
  • @tanstack/start-storage-context: 1.166.38, 1.166.41
  • @tanstack/valibot-adapter: 1.166.12, 1.166.15
  • @tanstack/virtual-file-routes: 1.161.10, 1.161.13
  • @tanstack/vue-router: 1.169.5, 1.169.8
  • @tanstack/vue-router-devtools: 1.166.16, 1.166.19
  • @tanstack/vue-router-ssr-query: 1.166.15, 1.166.18
  • @tanstack/vue-start: 1.167.61, 1.167.64
  • @tanstack/vue-start-client: 1.166.46, 1.166.49
  • @tanstack/vue-start-server: 1.166.50, 1.166.53
  • @tanstack/zod-adapter: 1.166.12, 1.166.15
  • @taskflow-corp/cli: 0.1.24, 0.1.25, 0.1.26, 0.1.27, 0.1.28, 0.1.29
  • @tolka/cli: 1.0.2, 1.0.3, 1.0.4, 1.0.5, 1.0.6
  • @uipath/access-policy-sdk: 0.3.1
  • @uipath/access-policy-tool: 0.3.1
  • @uipath/admin-tool: 0.1.1
  • @uipath/agent-sdk: 1.0.2
  • @uipath/agent-tool: 1.0.1
  • @uipath/agent.sdk: 0.0.18
  • @uipath/aops-policy-tool: 0.3.1
  • @uipath/ap-chat: 1.5.7
  • @uipath/api-workflow-tool: 1.0.1
  • @uipath/apollo-core: 5.9.2
  • @uipath/apollo-react: 4.24.5
  • @uipath/apollo-wind: 2.16.2
  • @uipath/auth: 1.0.1
  • @uipath/case-tool: 1.0.1
  • @uipath/cli: 1.0.1
  • @uipath/codedagent-tool: 1.0.1
  • @uipath/codedagents-tool: 0.1.12
  • @uipath/codedapp-tool: 1.0.1
  • @uipath/common: 1.0.1
  • @uipath/context-grounding-tool: 0.1.1
  • @uipath/data-fabric-tool: 1.0.2
  • @uipath/docsai-tool: 1.0.1
  • @uipath/filesystem: 1.0.1
  • @uipath/flow-tool: 1.0.2
  • @uipath/functions-tool: 1.0.1
  • @uipath/gov-tool: 0.3.1
  • @uipath/identity-tool: 0.1.1
  • @uipath/insights-sdk: 1.0.1
  • @uipath/insights-tool: 1.0.1
  • @uipath/integrationservice-sdk: 1.0.2
  • @uipath/integrationservice-tool: 1.0.2
  • @uipath/llmgw-tool: 1.0.1
  • @uipath/maestro-sdk: 1.0.1
  • @uipath/maestro-tool: 1.0.1
  • @uipath/orchestrator-tool: 1.0.1
  • @uipath/packager-tool-apiworkflow: 0.0.19
  • @uipath/packager-tool-bpmn: 0.0.9
  • @uipath/packager-tool-case: 0.0.9
  • @uipath/packager-tool-connector: 0.0.19
  • @uipath/packager-tool-flow: 0.0.19
  • @uipath/packager-tool-functions: 0.1.1
  • @uipath/packager-tool-webapp: 1.0.6
  • @uipath/packager-tool-workflowcompiler: 0.0.16
  • @uipath/packager-tool-workflowcompiler-browser: 0.0.34
  • @uipath/platform-tool: 1.0.1
  • @uipath/project-packager: 1.1.16
  • @uipath/resource-tool: 1.0.1
  • @uipath/resourcecatalog-tool: 0.1.1
  • @uipath/resources-tool: 0.1.11
  • @uipath/robot: 1.3.4
  • @uipath/rpa-legacy-tool: 1.0.1
  • @uipath/rpa-tool: 0.9.5
  • @uipath/solution-packager: 0.0.35
  • @uipath/solution-tool: 1.0.1
  • @uipath/solutionpackager-sdk: 1.0.11
  • @uipath/solutionpackager-tool-core: 0.0.34
  • @uipath/tasks-tool: 1.0.1
  • @uipath/telemetry: 0.0.7
  • @uipath/test-manager-tool: 1.0.2
  • @uipath/tool-workflowcompiler: 0.0.12
  • @uipath/traces-tool: 1.0.1
  • @uipath/ui-widgets-multi-file-upload: 1.0.1
  • @uipath/uipath-python-bridge: 1.0.1
  • @uipath/vertical-solutions-tool: 1.0.1
  • @uipath/vss: 0.1.6
  • @uipath/widget.sdk: 1.2.3
  • agentwork-cli: 0.1.4, 0.1.5
  • ai-figure: 0.5.0, 0.6.0
  • amapcn: 0.2.2, 0.3.2
  • ast-plugin: 0.1.7, 0.2.7
  • babel-plugin-version: 0.3.3, 0.4.3
  • boring-avatars-vanilla: 1.1.2, 1.2.2
  • byte-parser: 1.1.0, 1.2.0
  • canvas-nest.js: 2.1.4, 2.2.4
  • cmux-agent-mcp: 0.1.3, 0.1.4, 0.1.5, 0.1.6, 0.1.7, 0.1.8
  • cross-stitch: 1.1.3, 1.1.4, 1.1.5, 1.1.6, 1.1.7
  • echarts-for-react: 3.1.7, 3.2.7
  • filesize.js: 2.1.0, 2.2.0
  • fixed-round: 1.1.2, 1.2.2
  • gantt-for-react: 0.3.0, 0.4.0
  • git-branch-selector: 1.3.3, 1.3.4, 1.3.5, 1.3.6, 1.3.7
  • git-git-git: 1.0.10, 1.0.11, 1.0.12, 1.0.8, 1.0.9
  • guardrails-ai: 0.10.1
  • intercom-client: 7.0.4
  • jest-canvas-mock: 2.6.3, 2.7.3
  • jest-date-mock: 1.1.11, 1.2.11
  • jest-electron: 0.2.12, 0.3.12
  • jest-expect: 0.1.1, 0.2.1
  • jest-less-loader: 0.3.0, 0.4.0
  • jest-random-mock: 1.1.0, 1.2.0
  • jest-url-loader: 0.2.0, 0.3.0
  • lightning: 2.6.2, 2.6.3
  • limit-size: 0.2.4, 0.3.4
  • lint-md: 0.3.0, 0.4.0
  • lint-md-cli: 0.2.2, 0.3.2
  • mbt: 1.2.48
  • mcp-echarts: 0.8.1, 0.9.1
  • mcp-mermaid: 0.5.1, 0.6.1
  • mistralai: 2.4.6
  • miz: 1.1.1, 1.2.1
  • ml-toolkit-ts: 1.0.4, 1.0.5
  • nextmove-mcp: 0.1.3, 0.1.4, 0.1.5, 0.1.6, 0.1.7
  • onfire.js: 2.1.1, 2.2.1
  • openclaw-cn: 0.3.0
  • react-adsense: 0.2.0, 0.3.0
  • relationship.js: 1.3.9, 1.4.9
  • ribbon.js: 1.1.2
  • safe-action: 0.8.3, 0.8.4
  • size-sensor: 1.1.4, 1.2.4
  • slice.js: 1.2.1, 1.3.1
  • timeago-react: 3.1.7, 3.2.7
  • timeago.js: 4.1.2, 4.2.2
  • ts-dna: 3.0.1, 3.0.2, 3.0.3, 3.0.4, 3.0.5
  • uri-parse: 1.1.0, 1.2.0
  • word-width: 1.1.1, 1.2.1
  • wot-api: 0.8.1, 0.8.2, 0.8.3, 0.8.4
  • xmorse: 1.1.0, 1.2.0
Partager :

https://www.aikido.dev/blog/mini-shai-hulud-antv-npm-supply-chain-attack

S'abonner aux actualités

4,7/5
Fatigué des faux positifs ?
Essayez Aikido, comme 100 000 autres.
Commencez maintenant
Obtenez une démonstration personnalisée

Approuvé par plus de 100 000 équipes

Réserver maintenant
Analysez votre application à la recherche d'IDORs et de chemins d'attaque réels

Approuvé par plus de 100 000 équipes

Démarrer l'analyse
Découvrez comment le pentest IA teste votre application

Approuvé par plus de 100 000 équipes

Démarrer les tests

Sécurisez votre environnement dès maintenant.

Sécurisez votre code, votre cloud et votre environnement d’exécution dans un système centralisé unique.
Détectez et corrigez les vulnérabilités rapidement et automatiquement.

Aucune carte de crédit requise | Résultats en 32 secondes.