FlawOpen

flawopen.com/Incidents/tensorlake-npm-install-hook-compromise-october-2026

● Tensorlake · CWE-506 · October 8, 2026 · Critique
Recherche · FlawOpen

Tensorlake npm 0.5.144 : hook d’installation malveillant

Une version malveillante du SDK IA de Tensorlake a ajouté un chargeur preinstall. L’équipe a confirmé des changements directs sur main et renforcé la publication ; l’avis GitHub considère compromis tout hôte où le code s’est exécuté. Les chercheurs rapprochent le chargeur de la famille ChainDrop/Shai-Hulud ; l’avis GitHub ne confirme pas cette attribution.[1], [2], [3], [4], [5]

💡 Explication en Langage Simple (ELI5)

Installer ce paquet, c’était comme brancher un appareil qui démarre dès qu’il est alimenté : nul besoin d’appuyer sur un bouton ni de l’utiliser. npm a exécuté le hook malveillant de préinstallation avec les droits de la personne qui l’installait, avant tout import du SDK.[3], [6], [1]

Concepts Clés et Termes

hook preinstall
Script que npm peut exécuter pendant l’installation. Le manifeste publié de Tensorlake 0.5.144 lançait un chargeur par ce hook, sans nécessiter l’import du SDK.[1], [6]
attestation de provenance
Preuve de l’origine et du processus de compilation d’un artefact. L’équipe indique que la publication malveillante avait une provenance npm ; cela ne prouve pas que le code source était sain.[2], [3]
garde-fou des scripts d’installation
Contrôle CI qui échoue si un manifeste publié déclare des scripts d’installation. Après l’incident, Tensorlake l’a ajouté avec npm ci --ignore-scripts.[3]
Attribution de la famille de campagne
StepSecurity et Socket associent le chargeur à ChainDrop/Shai-Hulud. L’avis malware de GitHub ne nomme pas de famille de campagne ; cette attribution vient des chercheurs.[4], [5], [1]

Correspondances de référentiels

  • Référence CWE pour la faiblesse décrite dans ce guide : CWE-506

Chronologie de l'Incident

7 octobre 2026

La réponse de l’équipe indique que des commits ont été envoyés directement sur main par un compte administrateur du dépôt.[2], [3]

8 octobre 2026

Le workflow de publication a diffusé tensorlake@0.5.144 avec un malware ; l’équipe indique que npm l’a ensuite retiré.[1], [2]

8 octobre 2026

L’équipe a fusionné la PR #1016, restauré le dernier commit sain, ajouté des contrôles des scripts d’installation et fait passer la version propre à 0.5.145.[3], [7]

Déroulement de l'Attaque Étape par Étape

Étape 1

La confiance dans le dépôt a été contournée

La PR de réponse signale des commits directs sur main par un compte administrateur, hors du processus normal de revue des pull requests. La publication a ensuite été lancée manuellement depuis ce dépôt.[2], [3]

Étape 2

Le paquet exécutait du code à l’installation

Les chercheurs ont trouvé un hook preinstall qui lançait un chargeur dans tensorlake@0.5.144. Le code héritait des permissions du processus d’installation ; il n’était pas nécessaire d’importer le SDK au préalable.[1], [4], [5], [6]

Étape 3

Les identifiants et la persistance de l’hôte étaient exposés

L’avis malware de GitHub demande de considérer comme compromis tout hôte concerné. StepSecurity et Socket signalent un vol d’identifiants et une persistance, dont un moniteur qui pouvait réagir à la révocation de jetons. Attribuez ces détails aux chercheurs ; ne supposez pas que chaque capacité s’est exécutée sur chaque hôte.[1], [4], [5]

Étape 4

L’équipe a rétabli les contrôles de publication

La réponse a annulé les commits malveillants, ajouté npm ci --ignore-scripts et un garde-fou des manifestes, renforcé les protections du dépôt et de publication, puis remplacé le paquet par 0.5.145. Le GHSA ne liste pas de version corrigée car il suit un malware et non une plage de code vulnérable classique.[3], [7]

Code Source : Vulnérable vs Sécurisé

Cette comparaison CI suit la PR fusionnée #1016 ; elle ne montre ni le paquet malveillant ni un exploit. Le garde-fou s’exécute avant l’installation et rejette les hooks dans les manifestes publiés ; ignore-scripts empêche npm ci d’exécuter les scripts de cycle de vie des dépendances. L’équipe indique que ses tests et la compilation du SDK fonctionnaient ainsi. Cela peut affecter les paquets qui exigent des hooks, et les commandes explicitement lancées, comme npm test, exécutent toujours leurs scripts prévus. Isolez les étapes suivantes et ne confondez pas provenance et revue du code source. Cet extrait est partiel : en plus de vérifier les hooks d’installation déclarés, le garde-fou du mainteneur rejette aussi les fichiers inattendus dans typescript/lib/.[3], [6]

IMPLÉMENTATION VULNÉRABLE
steps:
  - run: npm ci
PATCH SÉCURISÉ ET ROBUSTE
steps:
  - run: node scripts/check-no-install-scripts.mjs
  - run: npm ci --ignore-scripts

Liste de Contrôle de Sécurité pour l'Ingénierie

Sources